gpm-1.20.4/BUGS010060000017500001750000000024411101736502000116730ustar00niconico00Hello World. This files lists all current known bugs of gpm. If you have some spare time, please help to fix them. Thanks from the current maintainer (Nico). Additional bug information can be found in the TODO file. Everything not done is more or less a bug... /*============================================================================*/ From: maintainer (Nico) src/headers/config.h: SBINDIR and SYSCONFDIR are corrupted: ${prefix} should disappear! /*============================================================================*/ From: maintainer (Nico) Following probles crash/do not work correctly: (most due to problems with devfs) - mev - gpm-root - disable-paste - mouse-test /*============================================================================*/ From: D Richard Felker III One is the way the baud rate setting is done. It worked fine in old versions of gpm, but the special case for mman in the baud rate setting code now actually *breaks* support for my Logitech MoiseMan (the version with 4 buttons). Could you provide an way to initialize it to 9600 baud just like all the other mice, without using the special mman code that doesn't work for this mouse? [...] /*============================================================================*/ gpm-1.20.4/COPYING010060000017500001750000000430701101736502000122460ustar00niconico00 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, 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. 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.) 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. 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. 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 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. Copyright (C) 19yy 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. 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. , 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. gpm-1.20.4/Changes010060000017500001750000000043631101753547600125260ustar00niconico00* From 1.20.3 to 1.20.4: * Corrected typos * Added automatic local build test * Fixed SONAME (praise the Debian guys, Jonathan Nieder) * From 1.20.1 to 1.20.3: o Applied many cleanups o Added etouch support o Added scripts/report_success.sh o Updated README pre6: Cleaned up "make dist" target Added two debbugging programs: src/prog/display-buttons.c: display pressed buttons src/prog/display-coords.c: display mouse coordinates Fixed Bug#474516: gpm: debug messages in syslog (Debian) pre5: Fix default handler in liblow.c pre4: gpm.c and gpn.c were split off from each other. Some Debian patches were applied. pre3: Many cleanups based on 1.20.1 were made, which should make it usable for distributors and end-users. pre2: Pre-distributors release pre1: First compiling version made of 1.20.1 and bugfixes. * From 1.20.1 to 1.20.2: * 1.20.2 does not exist as a real release, it is broken. * From 1.20.0 to 1.20.1: (bugfixes/code clean) o synaptics ps2 touchpad support o code cleanup in various main files o prototype of mouse support for n-mice. expect final in 1.20.3. * From 1.19.6 to 1.20.0: (bugfix/new features/code clean release) o removed compile problems o objdir/ support without problems o cleaned up internal message functions o cleanup up most of tab/spaces mixture. Now we use 3 spaces for indention o added more security bug fixing patches o clean {g,m,}awk support o clean ps2 initialization (allows using ps2 mouse after you used synps!) o gpm clients can't cause gpm do die. * From 1.19.5 to 1.19.6: (just a bugfix release) o bugfixes in Makefiles (now a 'make all install' should not make any errors) o bugfix in libgpm, mouse-test, gpm o doc/gpm.doc is up-to-date and the manfiles, too. info is still missing. * From 1.19.4 to 1.19.5: (minor fixes and one bugfix) o libc5 and linux 2.0 support in again o cleaned up the directory tree o many small changes to the Makefiles o devfs seperated into new file o Synaptics 4 Button Touchpad support o new daemon name * From 1.19.3 to 1.19.4: o libc5 and linux 2.0 support removed unfortuanally! o primary devfs support (broken) gpm-1.20.4/MANIFEST010060000017500001750000000130331101736502000123400ustar00niconico00 This is the list of all the files included in the current distribution tar ball. Actually, Makefile used this very list to know what to include in the tar. Now we include everything is still there after a 'make distclean' SOURCE FILES ------------ src/ gpm.c main engine of the daemon gpn.c support functions report.c message management (replaces debuglog.c) [inside gpm] report-lib.c message management [inside the lib] special.c special functions mice.c support for (almost) all the pointer types twiddler.c the twiddler keyboard needs special code synaptics.c and the synaptics table too liblow.c low-level gpm library libhigh.c high-level gpm library libxtra.c optional and little-used library functions libcurses.c curses-like functions mev.c sample mouse-event application hltest.c sample use of the high-level gpm library mouse-test.c old tool to help detecting the pointer protocol disable-paste.c very short application to forget the current selection gpm-root.y a sample default handler gpm-root.c derived from the above using bison headers/ gpm.h installed gpm header gpmCfg.h default configuration gpmInt.h internal declaration gpm-proto.h proposal for a new protocol, currently unused message.h messages synaptics.h synaptics tablet implementation twiddler.h twiddler keyboaard implementation config.h.in [build by autoheader] template for config.h [build by ./configure] PATCHES ------- patches/ done/ applied/refused/too old patches todo/ patches still need to be applied or refused DEFAULT/SAMPLE CONFIGURATION FILES ---------------------------------- conf/ gpm-root.conf sample usesable by gpm-root gpm-twiddler.conf default configuration for the twiddler keyboard gpm-syn.conf default configuration for the synaptics touchpad FILES USED IN THE BUILD PROCESS ------------------------------- configure.in source for configure configure script to autoconfigure the package aclocal.m4 support declaration for configure.in acconfig.h Makefile.in the source for Makefile, used by configure Makefile.include.in the source for Makefile.include, used by other Makefiles install-sh fallback install script if no install command is found DOCUMENTATION (currently not up-to-date) --------------- README introductory information, and credits (incomplete list) COPYING GNU GPL Changelog the log of changes - a lot of changes :) Changes Put together all important changes from one to another release MANIFEST this file doc/ Announce original announce for version 1.0 Makefile.in template for doc/Makefile infofilter preprocessor to create a .texi source file from my own docs manpager tool to extract manual pages from the main document file mktxt tool to extract a ``decent'' text file from the info one # FAQ / READMEs FAQ Frequently asked/answered questions README.gunze how to use the gunze touchscreen README.microtouch how to use the microtouch touch screen README.synaptics how to use the synaptics tablet README.twiddler how to use the twiddler keyboard doc.gpm.in template of gpm.doc (substitutes version) doc.gpm the source for the ``real'' documentation gpmdoc.ps generated from doc.gpm using doc/infofilter, texinfo and TeX gpm.info generated from doc.gpm using doc/infofilter and makeinfo gpmdoc.txt generated from gpm.info using doc/mktxt # MANPAGES gpm.8 man page, generated from doc.gpm using doc/manpager mev.1 man page, generated from doc.gpm using doc/manpager gpm-root.1 man page, generated from doc.gpm using doc/manpager gpm-types.7 man page, generated from doc.gpm using doc/manpager mouse-test.1 man page, generated from doc.gpm using doc/manpager support/ contains information about mouse support this includes mails and other information from the vendors. SUPPORT MATERIAL (currently not installed) --------------- contrib/ Makefile.in when you read everything to here you should know what it is emacs/ t-mouse.el emacs client (needs mev installed) t-mouse.elc compiled form of the emacs client exec.el allow emacs to execute lisp commands from the command line init/ gpm.init sample init script (Redhat?) scripts/ create_vcs script to create /dev/vcs* devices (redundant) gunze-setup same, for the gunze touchscreen microtouch-setup a program to calibrate the microtouch touchscreen mkinstalldirs creates the installation directories (currently unused) test_gpm test gpm. use it, to copy the gpmdir, ./configure,make other/ other contributions SAMPLE GPM CLIENT [ currently not available/I don't know why :( ] ----------------- sample/ README explanation of how it works Makefile.in sample template for Makefile configure.in sample template for configure gpm-xterm.c support file, replacement for libgpm gpm-xterm.h header, replacement for gpm.h rmev.c sample client application gpm-1.20.4/Makefile.in010060000017500001750000000076601101753572100132740ustar00niconico00# -*-makefile-*- (gpm/main) # # Copyright 1994,1997 rubini@linux.it # Copyright 1997 dickey@clark.net # Copyright (C) 1998 Ian Zimmerman # Copyright (C) 2001 Nico Schottelius # SHELL = /bin/sh srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = . include Makefile.include # allow CFLAGS to be overriden from make command line # ideally one would never have to write this rule again, but the GNU # makefile standards are at cross-purposes: CFLAGS is reserved for # user-overridable flags, but it's also all the implicit rule looks at. # missing ? SUBDIRS = src doc contrib ### simple, but effective rules all: do-all dep: touch src/$(DEPFILE) # to prevent unecessary warnings make -C src dep check: all uninstall: do-uninstall clean: do-clean Makefile: $(srcdir)/Makefile.in config.status ./config.status config.status: $(srcdir)/configure if [ -f config.status ]; then $(SHELL) config.status --recheck; \ else ./configure; fi ### INSTALL install: check installdirs do-install install-strip: $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) $(STRIP)' install installdirs: $(MKDIR) $(libdir) $(bindir) $(sbindir) $(includedir) $(sysconfdir); \ if test "x@ELISP@" != "x" ; then \ $(MKDIR) $(lispdir) ; \ fi ### GENERIC # do-all goes to all subdirectories and does all do-%: dep @target=`echo $@ | $(SED) -e 's/^do-//'`; \ for i in $(SUBDIRS) ; do \ if test -f ./$$i/Makefile ; then \ $(MAKE) -C ./$$i $${target} || exit 1 ;\ else \ true; \ fi; \ done # Configure & unconfigure # Maintainer portion, use at your own risk barf: @echo 'This command is intended for maintainers to use; it' @echo 'deletes files that may need special tools to rebuild.' @echo 'If you want to continue, please press return.' @echo -n "Hit Ctrl+C to abort." @read somevar # who / what does need tags TAGS: $(SRCS) $(HDRS) src/prog/gpm-root.y do-TAGS cd $(srcdir) && $(ETAGS) -o TAGS $(SRCS) $(HDRS) src/prog/gpm-root.y ### RELEASE STUFF TARS =../gpm-$(release).tar.gz TARS +=../gpm-$(release).tar.bz2 ../gpm-$(release).tar.lzma D_HOST=home.schottelius.org D_BASE=www/org/schottelius/unix/www/gpm D_DIR=$(D_BASE)/archives/ D_SOURCE=$(D_BASE)/browse_source/ M_HOST=arcana.linux.it M_DIR=gpm/ tars: $(TARS) # configure headers, produce new configure script distconf: configure.in aclocal.m4 autoheader && autoconf ../gpm-$(release).tar: $(srcdir) # no exclude possible of .git with pax it seems #pax -w -x ustar -s '/^\./gpm-$(release)/' -w . -f $@ pax -w -x ustar -s ';^;gpm-$(release)/;' -f $@ -w * ../gpm-$(release).tar.gz: ../gpm-$(release).tar gzip -9 -c $^ > $@ ../gpm-$(release).tar.bz2: ../gpm-$(release).tar bzip2 -9 -c $^ > $@ ../gpm-$(release).tar.lzma: ../gpm-$(release).tar lzma -9 -c $^ > $@ # 3. Put package together into .tar.gz and .tar.bz2 #dist: distclean distconf gpm-$(release).tar.bz2 gpm-$(release).tar.gz dist: disttest distclean distconf nicotest $(TARS) chmod 0644 $(TARS) scp $(TARS) $(D_HOST):$(D_DIR) scp $(TARS) $(M_HOST):$(M_DIR) ssh "$(D_HOST)" "tar xvfz $(D_DIR)/gpm-$(release).tar.gz -C $(D_SOURCE)" ssh "$(D_HOST)" "find \"$(D_SOURCE)/\" -type f -exec chmod 0644 {} \\;" ssh "$(D_HOST)" "find \"$(D_SOURCE)/\" -type d -exec chmod 0755 {} \\;" ### TEST: on nicos machine: not to be used anywhere else currently # create / update configure, delete other parts from earlier build disttest: distconf clean ./configure make all TESTBUILDDIR=~/temp/gpm-build-test nicotest: $(TARS) rm -rf $(TESTBUILDDIR) mkdir -p $(TESTBUILDDIR) cp $(TARS) $(TESTBUILDDIR) cd $(TESTBUILDDIR); tar xvfj gpm-$(release).tar.bz2; cd $(TESTBUILDDIR)/gpm-$(release); ./configure && make && ./src/gpm -v ### CLEANUP distclean: clean do-clean do-distclean rm -f config.log config.status config.cache Makefile Makefile.include rm -rf autom4te.cache rm -rf gpm-$(release) gpm-$(release).tar.bz2 gpm-$(release).tar.gz rm -f src/$(DEPFILE) allclean: do-allclean distclean rm -f configure gpm-1.20.4/Makefile.include.in010060000017500001750000000031401101736502000146740ustar00niconico00# -*-makefile-*- (gpm/include) # # Copyright (C) 2001 Nico Schottelius # # set root, if you want to install to a virtual root ROOT = ifndef ROOT ROOT = $(DESTDIR) endif SHELL = /bin/sh prefix = @prefix@ exec_prefix = @exec_prefix@ # directories libdir = $(ROOT)@libdir@ datadir = $(ROOT)@datadir@ bindir = $(ROOT)@bindir@ sbindir = $(ROOT)@sbindir@ includedir = $(ROOT)@includedir@ sysconfdir = $(ROOT)@sysconfdir@ mandir = $(ROOT)@mandir@ man1dir = $(mandir)/man1 man7dir = $(mandir)/man7 man8dir = $(mandir)/man8 infodir = $(ROOT)@infodir@ # it would be nice to figure this out automatically, but the Emacs # load path often has many elements, most of them reserved for # specialised packages like w3 and auctex. lispdir = @lispdir@ # programs CC = @CC@ RANLIB = @RANLIB@ YACC = @YACC@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ LN_S = @LN_S@ EMACS = @EMACS@ ELISP = @ELISP@ SHLIB = @SHLIB@ SED = @SED@ DIFF = @DIFF@ TEX = @TEX@ TEXINDEX = @TEXINDEX@ DVIPS = @DVIPS@ MAKEINFO = @MAKEINFO@ TEXI2HTML = texi2html STRIP = -s AR = ar ETAGS = etags AWK = awk CP = cp -a MKDIR = mkdir -p # linux specific, but who cares ? # gpm is linux specific, too. RM = rm DEPFILE = .depend # general release = @release@ gpm-1.20.4/README010060000017500001750000000257661101736502000121070ustar00niconico00/* * README -- gpm 1.xx * * Copyright 1995-2000 rubini@linux.it (Alessandro Rubini) * Copyright 2001-2008 nico-gpm2008 at schottelius.org (Nico Schottelius) * *******/ The gpm (general purpose mouse) daemon tries to be a useful mouse server for applications running on the Linux console. Its roots are in the "selection" package, by Andrew Haylett, and the original code comes from selection itself. This package is intended as a replacement for "selection", to provide additional facilities. From 0.18 onward gpm supports xterm as well, so you can run mouse-sensitive applications under X, and you can easily write curses applications which support the mouse on both the Linux console and xterm. The xterm code is portable to any U*x flavour (look at sample/README). The first clients have been "The Midnight Commander", by Miguel de Icaza and an emacs library included in this release. Recent dialog distributions and the Jed editor use gpm as well, and the same do several custom applications. There are still some new features to add (f.i. clean devfs support). Some of gpm's code needs a cleanup. If you want to make a patch to gpm, please read doc/HACK_GPM. For additionally documentation and other READMEs have a look into doc/. =========== REPORT SUCCESS As it is always nice to see as an author of FOSS that the software is used and alive und which options are used, you can send a success report to me via ./scripts/report_success.sh. =========== MAINTENANCE As of 1.19.4, gpm is officially maintained again. Most of the README is written by Alessandro Rubine, only minor changes are made by me. =========== MAILING LIST The mailing list devoted to gpm is "gpm@lists.linux.it" The list is managed by Mailman and is currently open, so non-subscribers are allowed to post. In order to subscribe to the mailing list, visit http://lists.linux.it/listinfo/gpm or send a message with "subscribe" in its body to gpm-request@lists.linux.it. For example: echo subscribe | mail gpm-request@lists.linux.it =========== DOWNLOAD / HOMEPAGE The latest releases can always be found in one of the following place: http://unix.schottelius.org/gpm/archives/ http://unix.schottelius.org/gpm/browse_source/ Mirror: ftp://arcana.linux.it/pub/gpm/ http://www.ar.linux.it/pub/gpm/ The homepage of gpm can be found at http://unix.schottelius.org/gpm/ You can get the latest development tree of gpm via git: git-clone http://unix.schottelius.org/git/gpm There are three branches available: master: Contains the latest gpm1 code, may be broken. gpm-1-stable: Contains the latest stable source code. gpm-2-dev: Contains work that heads to gpm2. You can browse the git-tree via gitweb: http://unix.schottelius.org/cgi-bin/gitweb.cgi?p=gpm;a=summary =========== COMPILING AND INSTALLING The package uses autoconf as of 2.12. Use "./configure && make" to compile the gpm suite. To install "make install". This installs everything under the "prefix" directory, which by default is /usr/local. Use "./configure --prefix=/usr" if you want to install under /usr instead of /usr/local. Exectuable files are installed in $(prefix)/bin (except the gpm daemon in $(prefix)/sbin), libraries in $(prefix)/lib, man pages in $(prefix)/man, the lisp library in the proper location for emacs-list files (detected during the "configure" step); info files are installed under $(prefix)/info. If you would like to 'clean'up very tidy, use distclean. Don't forget to use make distclean config! Otherwise there will be no configure script! If any errors occur, please report them to me. Something like this could be an easy (though brutal) way to do it: make clean;(uname -a; make) | mail -s "gpm compile err." nicos-gpm@pcsystems.de What remains to do after installation is a little configuration =========== CONFIGURING Configuration is optional... * You would like to tell emacs to use t-mouse.el when appropriate. Add the following lines to your own .emacs (in your home directory), or in the /usr/lib/emacs/site-lisp/default (if (and (string-match ".*-linux" system-configuration) (not window-system) (or (string-match "linux" (getenv "TERM")) (string-match "con.*" (getenv "TERM")))) (load-library "t-mouse")) * If you want to use gpm-root, copy gpm-root.conf to your /usr/etc directory, test it out and then edit it to suit your feels. * You'd like to name the gpm info file inside /usr/info/dir. Just insert the line * gpm: (gpm.info). A mouse server for the Linux console at the proper place. Note that this is usually automatically performed if you install a package prepared for your own distribution. * To invoke gpm (and gpm-root) at system boot, add something like this to your /etc/rc.d/rc.local /usr/sbin/gpm -t msc -m /dev/tts/0 & /usr/bin/gpm-root & If you are running the new setup of SysVinit, you should better add a "gpm" script in /etc/rc.d/rc.init and install it in your runlevels in the usual way (this is usually included in your distribution as well) You may want to put the mouse server at a higher priority: in this case invoke instead "/usr/bin/nice -n -20 /usr/sbin/gpm -t msc" The program goes to the background by itself, unless it is run with debuging enabled (see the -D option in the documentation). ========== DOCS The directory "./doc" holds the documentation. The release embeds a postscript file, slightly reduced to save paper (doc/gpm2.ps), an info one (doc/gpm.info) and a text-only version (doc/gpmdoc.txt -- but without table of contents, for now). Man pages are automatically extracted from the info file, and are installed with "make install" =========== BUG REPORTS Before sending bug reports, please look at the file "FAQ", which outlines some known problems, and how to deal with them. If your bug isn't fixed by reading there, please report it to me, without getting angry with me if things don't work at first trial (but they usually work). Bug reports are best sent to the gpm mailing list (see above) or to me via email, if you use personal mail please include the string "gpm" somewhere in the subject line. This will help my filters in sorting things out. * When compilation fails I need your kernel version ("uname -a"), the compiler version ("gcc -v") and the library version ("ls -l /lib" or, better "ldd /usr/sbin/gpm"). And the compiler messages, obviously. * When a program hangs or segfaults, please reinvoke the program under strace: strace -tf -o /tmp/trace.gpm gpm -t msc ^^^^^^^^^^ put your true cmdline here. Then send me /tmp/trace.gpm* (they may be one or two files, according to the strace version), and a description of how you reproduce the problem. The last resort is a core dump, but I'll ask it personally if I have real difficulties in tracing out your problem. =========== CREDITS The following people contributed to gpm, in chronological order. This list used to reside in a different file, but it's better for it to stand out in the README Andrew Haylett (ajh@gec-mrc.co.uk) donated "selection" to the linux community, so I could get the idea and the code. A few others contributed to selection, but I lost track of their contributions and names. Steven S. Dick (ssd@nevets.oau.org) fixed a pair of bugs in early gpm versions. Miguel de Icaza (miguel@roxanne.nuclecu.unam.mx) helped fixing some bugs and provided a good client to test my server. He helped a lot in testing the various pre-releases. Olav Woelfelschneider (wosch@rbg.informatik.th-darmstadt.de) fixed 0.10 with MouseSystems compatible mice. Janne Kukonlehto (jtklehto@stekt.oulu.fi) provided xterm mouse decoding to be stolen by me. Rick Lyons (rick@razorback.brisnet.org.au) fixed a bug in gpm-0.9. Reuben Sumner (rasumner@undergrad.math.uwaterloo.ca) helped fixing behaviour with "-t bm". Larry Bartholdi (lbartho@scsun.unige.ch) pinpointed an error in t-mouse-suspend and provided good suggestions for 0.97. Mark Lord (mlord@bnr.ca) ported to Dexxa/Logitech mice and gave feedback several times. Stefan Giessler (stg@gandalf.han.de) fixed some problems with gpm-root and suggested to put gpm in the background (0.97). Roman Shapiro helped with the Logitech MouseMan. Andries Brouwer (aeb@cwi.nl) Provided a Latin-1 LUT for chars, and enhanced lut-loading code (0.98). Adrian Johnson (ajohnson@apanix.apana.org.au) Gave good feedback and ideas for the 0.98's Stephen Lee (sl14@crux1.cit.cornell.edu) Helped a lot with the damned MouseMan protocol (0.98 and 1.0) John van Leeuwen (johnvl@einstein.et.tudelft.nl) Outlined and fixed a pair of bugs in gpm-root 0.98 Alvar Bray (alvar@meiko.co.uk) Pointed out an error with awk (0.99) David A. van Leeuwen (david@tm.tno.nl) Helped with chord-middle protocols (1.0) Pavel Kankovsky (KAN@frode.dcit.cz) Open /dev/ttyxx instead of /dev/console in the lib (1.01) Mark Shadley (shadcat@catcher.com) Helped in turning to ELF (1.01 and 1.02) and in fixing horrible bugs of mine. Without his help 1.03 wouldn't be there. Lou Sortman (lou@lounix4.conc.tdsnet.com) Added support for glidepoint mice within "-t mman". (1.05) Marc Meis (100334.1426@compuserve.com) Provided support for absolute pointing devices, and in particular for the ncr3125 pen. (1.05) Michael Plass (Michael_Plass.PARC@xerox.com) Fixed a damned bug in middle button decoding (M_ms) (1.07) Markus Gutschke (gutschk@uni-muenster.de) Provided a better re-encoding for "-R" (1.10) Karsten Ballueder (Karsten@piobelix.physik.uni-karlsruhe.de) Suggested the reboot compile-time option (1.10) John Davis (davis@space.mit.edu) Found and fixed a buglet in liblow.c for some jed users (1.10) Julian Thompson (jrt@miel.demon.co.uk) Fixed a buglet in gpm-root (1.10) Dave Flater (dave@universe.digex.net) Removed a typo in the disabled decoder for ms-3b (1.11) Thomas E. Dickey (dickey@clark.net) Ported to autoconf (1.11) Pavel Machek (pavel@ucw.cz) New mode "logim" (1.11) and NetMouse (1.14) Matthias Grimrath (y0001032@rzserv8.rz.tu-bs.de) Be c++ compliant in gpm.h (1.11) Stephen Tell (tell@cs.unc.edu) Patch for the ps2 decoder to support misbehaving devices (1.11) Francois Chastrette (no-email) Great help to support plugnpray mice (1.13) Steve Bennett (s.bennett@lancaster.ac.uk) Support for the intellimouse serial devices. (1.13) Jan Daciuk (jandac@pg.gda.pl) t-mouse: yet another regexp possibility Ian Zimmerman is now actively cooperating in maintaining gpm, so he'll no longer appear in the acknowledgements ;-) David Given (dg@tao.co.uk) Offered support for joystick mouse emulation (1.14) Tim Goodwin (tgoodwin@cygnus.co.uk) Colin Plumb (colin@nyx10.nyx.net) Ben Pfaff (pfaffben@pilot.msu.edu) Ian and Iris (brooke@jump.net) All of them sent in support for ps2 intellimouse (1.14) Edmund Grimley Evans (edmund@vocalis.com) Added "-t ms+lr" Stefan Runker (runkeledv@t-online.de) Contributed a new Wacom decoder Alessandro Rubini (rubini@linux.it) He's done a lot of work on gpm and maintained it. He's still helping me a lot to understand all parts of gpm. gpm-1.20.4/README.gpm2010060000017500001750000000015731075432557400127620ustar00niconico00I am thinking about restructing gpm, for the following reasons: - the code is old - the code is huge - the code is next to unmaintainable - the code is linux specific What I think one could reach: - create gpm, that runs on any Unix? - create gpm that is easy to extend - create gpm that is easy to maintain What ways are possible? - rewrite everything from scratch * takes a long time and much motivitation - migrate old code to clean codebase * takes some time to analyse old code * seems to me some way one could go How to do it? - new functions / code references 'gpm2' instead of gpm - perhaps some people want to sponsor me for creating a clean mouse driver for the console? => thus I got more time to focus on gpm2 - motivate other foss developers to take part into it Let's see what happens! -- Nico Schottelius, 2007-05-11 2245 CEST in a train in Zurich gpm-1.20.4/README.versions010060000017500001750000000021751101753547600137610ustar00niconico00Dear gpm README reader, this letter is to you, as I have to tell you about my idea of versioning of gpm. Traditionally, there were 1.19.x releases. That was, before the gpm source code and I met. After that, there was 1.20.x, indicating a new maintainer, but continuing with the old naming versioning. Today, on the 19th of February 2008, I decided to give gpm a real chance of getting a "second life" under the name of "gpm2" (as described in README.gpm2). It seems that the best effort for creating gpm2 is to rewrite everything, but to migrate the logic from the old code (as in: how to handle the individual mouse). So, how does that relate to the versions of gpm? Let us have a look at it: 1.19.x: old versions, not continued 1.20.x: current stable versions: no new features. 1.99.x: versions that move to 2.x, but contain much 1.20.x code. includes new features. 2.0.x: future stable versions 2.1.x: future testing versions Perhaps you have some comments to tell me? If so, just drop me a letter to nico-gpm-versions at schottelius.org. Yours, Nico gpm-1.20.4/TODO010060000017500001750000000111721076632743400117220ustar00niconico00================================================================================ = /------\ /-----\ |----\ /-----\ = = || | | | | | | = = || | | | | | | thanks for every help. ;) = = || \-----/ |____/ \-----/ = ================================================================================ Last edited: Nico Schottelius , 24 Dec 2002 Intro: Welcome to the todo list. You are invited to help me. Select something you wanna fix/introduce and I will tell you how you can add it. items marked with a 'D' are done. Tasks: 2002-12-24 Nico Schottelius * -D must be checked before calling anything else. Currently, -m mousedev -D -t ps2 calls add_mouse first without debug 2002-11-21 Nico Schottelius * remove -M, allow multiply -m,-t; -> allow n mice and cleaner code --> means use of add_mouse(), init_mice() * remove old opt_* D * cleanup gpn.c/cmdline to its real purpose * make protocol / port autodection: gpm -u [later...] => ONLY FOR DEVFS! 2002-11-09 Nico Schottelius D * cleanup gpm further: main.c * do init,protocol,disable functions forced D * introducte global option structure 2002-03-10 Nico Schottelius * make buffer accessable from X and vice versa 2002-03-02 Nico Schottelius D * remove large messages: (just cd $srcdir...) /home/user/nico/computer/sources/linux/gpm/gpm-1.20.1/src/mice.c -> src/mice.c or mice.c It's a problem with gcc's command line: gcc -o file filename.c -> filename.c gcc -o file /path/to/filename.c -> /path/to/filename.c 2002-02-20 Nico Schottelius * add contrib/other/TPdetect.cc [Allan Sandfeld Jensen ] to the gpm source. 2002-02-08 Nico Schottelius * fix problems with the following clients: - gpm-root complains about /dev/vcs0 in devfs - disable-past: segmenatation fault - mev: segmenatation fault - hltest: stdin: not a system console [ devfs problem ? ] - mouse-test does not work (does not do anything after key pressed) D * add better ps2 initialization: after mouse is screwed up with synps2 data, the init of ps2 should be able to get the mouse work again... [ btw, currenty I_empty is used :( ] D * update documentation and MANIFEST 2002-02-04 Nico Schottelius * use gpm_report in all gpm sources. Check for run_status. [ report_lib does not need run_status! ] * export synaptic.c messages to message.h * cleanup debugging support in synaptics.c * remove all strings in c files and place them into message.h 2002-01-07 Nico Schottelius * cleanup gpm-root (it will not run currently with devfs) D * add pseudo root support D * add protocol reset (after synps2 i.e.) * add serial console support into gpm_report * add howtos: - add a protocol (?) - add a messsage (message.h) * remove hardwired names in sample clients. D * cleanup Gpm_Open (problem with devfs still exists) * remove dirty gotos 2001-09-29 Frédéric L. W. Meunier <0@pervalidus.net> * Add GNU screen support to libgpm. 2001-09-23 Nico Schottelius D * put dependings from sources to src/.depend D * set version _everywhere_ via configure (doc.gpm and others) D * really remove oops() output, add clearer text to the user(also use stderr) D * remove more hardwired things in gpm ! [partly solved. gpm-root is missing] D * oops rewrite or use another function for rep_err() --> calls oops() of we need to exit. Give oops() a va_* type, Filename,line --> normally report(STATUS, text, ... ) --> --> STATUS = (char * filename(__FILE__), int line(__LINE__), int status) --> status: WARN, CRIT(or ABRT) D * 27th of July 2k+1: - report(char *filename, int line, int status, char *text, ... ) Destinations: * stderr -> startup * current console (/dev/tty, /dev/vc/0) -> debug, daemon * console (/dev/console) -> running, daemon * syslogd -> running, daemon Status: * LOG_INFO * LOG_WARN * LOG_ERR * LOG_DEBUG D * 7th of July 2k+1: [partly done. many patches left] - analysing patches - applying patches - detail stuff: - message function: destination depend on current state change debuglevel by using SIGUSR1/SIGUSR2 gpm-1.20.4/aclocal.m4010060000017500001750000000017161101736502000130540ustar00niconico00dnl $Id: aclocal.m4,v 1.2 2002/05/28 19:13:50 nico Exp $ AC_DEFUN(ITZ_SYS_ELF, [AC_CACHE_CHECK([whether system is ELF],itz_cv_sys_elf, [AC_EGREP_CPP(win, [#ifdef __ELF__ win #else lose #endif ],[itz_cv_sys_elf=yes],[itz_cv_sys_elf=no])]) if test ${itz_cv_sys_elf} = yes && test x${ac_cv_prog_gcc} = xyes ; then PICFLAGS="-DPIC -fPIC" SOLDFLAGS="-fPIC -shared -Wl,-soname," else PICFLAGS= SOLDFLAGS= fi ]) AC_DEFUN(ITZ_PATH_SITE_LISP, [AC_CACHE_CHECK([where to install Emacs Lisp files],itz_cv_path_site_lisp, [eval itz_cv_path_site_lisp=`${EMACS} -batch -l ${srcdir}/exec.el -exec "(mapcar 'print load-path)" 2>/dev/null | sed -e '/^$/d' | sed -n -e 2p` case x${itz_cv_path_site_lisp} in x*site-lisp*) ;; x*) itz_cv_path_site_lisp='${datadir}/emacs/site-lisp' ;; esac]) ]) AC_DEFUN(ITZ_CHECK_TYPE, [AC_CACHE_CHECK([for $1],itz_cv_type_$1, AC_TRY_COMPILE([ #include <$2> ],[ $1 dummy; return 0; ],[itz_cv_type_$1=yes],[itz_cv_type_$1=no])) ]) gpm-1.20.4/build-from-git-and-run.sh010070000017500001750000000002121101736502000157220ustar00niconico00#!/bin/sh # I am lazy -- Nico # 20080213 # Copying: GPLv3 ich="${0##*/}" hier="${0%/*}" "${hier}/build-from-git.sh" && sudo ./src/gpm gpm-1.20.4/build-from-git.sh010070000017500001750000000001151101736502000143620ustar00niconico00#!/bin/sh # I am lazy -- Nico autoheader && autoconf && ./configure && make gpm-1.20.4/conf004070000017500001750000000000001101736502000120565ustar00niconico00gpm-1.20.4/conf/gpm-root.conf010060000017500001750000000033341101736502000145520ustar00niconico00# sample configuration file for gpm-root # edit it to please your taste.... button 1 { name "ttys" "" f.nop "login on a new tty" f.mktty "" f.nop "tty 1" f.jptty "1" "tty 2" f.jptty "2" "tty 3" f.jptty "3" "tty 4" f.jptty "4" "" f.nop "tty 5" f.jptty "5" "tty 6" f.jptty "6" "tty 7" f.jptty "7" "tty 8" f.jptty "8" "" f.nop "more of them..." { "tty 9" f.jptty "9" "tty 10" f.jptty "10" "tty 11" f.jptty "11" "tty 12" f.jptty "12" "" f.nop "tty 13" f.jptty "13" "tty 14" f.jptty "14" "tty 15" f.jptty "15" "tty 16" f.jptty "16" "" f.nop "more of them..." { "tty 17" f.jptty "17" } } } button 2 { name "system status" foreground red background black border yellow head bright yellow "" f.nop "%b %d %Y" f.time "%H:%M" f.time "" f.nop "load: " f.load "free:" f.free "" f.nop "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" "print mail headers to tty" f.bgcmd "grep '^From ' /var/spool/mail/$USER | tail" } button 3 { name "far ttys" foreground black background red border bright yellow head bright yellow "tty 9" f.jptty "9" "tty 10" f.jptty "10" "tty 11" f.jptty "11" "tty 12" f.jptty "12" "" f.nop "tty 13" f.jptty "13" "tty 14" f.jptty "14" "tty 15" f.jptty "15" "tty 16" f.jptty "16" "" f.nop # I use this to halt and reboot the system, but it isn't wise to put it # in widely accessible boxes. # # "----" f.nop # "" f.nop # "halt" f.bgcmd "/sbin/shutdown -h now" # "reboot" f.bgcmd "/sbin/shutdown -r now" } gpm-1.20.4/conf/gpm-syn.conf010060000017500001750000000030561101736502000144010ustar00niconico00/* enabling configuration parameters */ [edge_motion_enabled] TRUE [edge_motion_speed_enabled] TRUE [corner_taps_enabled] TRUE [tap_gesture_enabled] TRUE [pressure_speed_enabled] TRUE [tossing_enabled] TRUE [does_toss_use_static_speed] TRUE /* pressure induced speed related configuration parameters */ [low_pressure] 60 [speed_up_pressure] 60 [pressure_factor] 0.10 [standard_speed_factor] 0.10 /* toss/catch related parameters */ [min_toss_time] 100 [max_toss_time] 300 [prevent_toss_time] 300 [min_toss_dist] 2 [static_toss_speed] 70 [toss_speed_factor] 0.5 /* edge motion related configuration parameters */ [edge_speed] 20 /* corner tap actions */ [upper_left_action] 0 (none) [upper_right_action] 2 (middle) [lower_left_action] 0 (none) [lower_right_action] 3 (right) /* wmode parameters */ [wmode_enabled] TRUE [drag_lock_enabled] FALSE [finger_threshold] 30 [tap_lower_limit] 5 [tap_upper_limit] 200 [tap_range] 100 [tap_interval] 200 [pads_tap_interval] 8 [multiple_tap_delay] 30 [palm_detect_enabled] TRUE [palm_detect_level] 12 [multi_finger_tap_enable] TRUE [multi_finger_stop_enabled] TRUE [multi_finger_stop_delay] 8 /* Additional options */ [touch_pad_enabled] TRUE [stick_enabled] TRUE [scrolling_enabled] TRUE [scrolling_edge] 2 [auto_scrolling_enabled] TRUE gpm-1.20.4/conf/gpm-twiddler.conf010060000017500001750000000112331101736502000154020ustar00niconico00# # This is the configuration file for the twiddler keyboard as used under # the gpm mouse server # # Empty lines and comments are ignored, other lines must follow either # of the following conventions: # chord = value (e.g. "L000 = a") # mod chord = value (e.g. "Shift L000 = a") # # The "mod" is one of "Shift" "Numeric" "Function" "Control" "Ctrl" "Alt", # or any abbreviation of those (case independent) # The special case "Ctrl+Shift" (or "Shift+Ctrl") is supported, but note # that it can't be abbreviated like C+S or anything like that. # # The "chord" value is one of the usual specifications, uppercase only # # Value can be a single byte (also as escape sequence), a string with # double quotes (with escape sequences) or a special name (one of those # appearing as "string" in dumpkeys, and Up Down Left Right). # In addition, the strings "Console" and "Exec" are supported. See the # sample case below. # # Escape sequences are \n \r \e \t \a \b, octal ("\243") or hex ("\xff") # numbers. Any other char is returned unchanged, like \" or \\. ######## Lowercase R000 = a 0R00 = b 00R0 = c 000R = d M000 = e 0M00 = f 00M0 = g 000M = h LR00 = i L0R0 = j L00R = k LM00 = l L0M0 = m L00M = n LL00 = o L0L0 = p L00L = q MR00 = r M0R0 = s M00R = t MM00 = u M0M0 = v M00M = w ML00 = x M0L0 = y M00L = z ############## Uppercase Shift R000 = A Shift 0R00 = B Shift 00R0 = C Shift 000R = D Shift M000 = E Shift 0M00 = F Shift 00M0 = G Shift 000M = H Shift LR00 = I Shift L0R0 = J Shift L00R = K Shift LM00 = L Shift L0M0 = M Shift L00M = N Shift LL00 = O Shift L0L0 = P Shift L00L = Q Shift MR00 = R Shift M0R0 = S Shift M00R = T Shift MM00 = U Shift M0M0 = V Shift M00M = W Shift ML00 = X Shift M0L0 = Y Shift M00L = Z ######## Control Ctrl R000 = \x01 Ctrl 0R00 = \x02 Ctrl 00R0 = \x03 Ctrl 000R = \x04 Ctrl M000 = \x05 Ctrl 0M00 = \x06 Ctrl 00M0 = \x07 Ctrl 000M = \x08 Ctrl LR00 = \x09 Ctrl L0R0 = \x0a Ctrl L00R = \x0b Ctrl LM00 = \x0c Ctrl L0M0 = \x0d Ctrl L00M = \x0e Ctrl LL00 = \x0f Ctrl L0L0 = \x10 Ctrl L00L = \x11 Ctrl MR00 = \x12 Ctrl M0R0 = \x13 Ctrl M00R = \x14 Ctrl MM00 = \x15 Ctrl M0M0 = \x16 Ctrl M00M = \x17 Ctrl ML00 = \x18 Ctrl M0L0 = \x19 Ctrl M00L = \x1a ######## Meta (Alt) Meta R000 = "\ea" Meta 0R00 = "\eb" Meta 00R0 = "\ec" Meta 000R = "\ed" Meta M000 = "\ee" Meta 0M00 = "\ef" Meta 00M0 = "\eg" Meta 000M = "\eh" Meta LR00 = "\ei" Meta L0R0 = "\ej" Meta L00R = "\ek" Meta LM00 = "\el" Meta L0M0 = "\em" Meta L00M = "\en" Meta LL00 = "\eo" Meta L0L0 = "\ep" Meta L00L = "\eq" Meta MR00 = "\er" Meta M0R0 = "\es" Meta M00R = "\et" Meta MM00 = "\eu" Meta M0M0 = "\ev" Meta M00M = "\ew" Meta ML00 = "\ex" Meta M0L0 = "\ey" Meta M00L = "\ez" ##### 1b is escape, etc... RRR0 = \x1b ############### Numbers and symbols (ascii 0x20 to 0x40) L000 = " " R0L0 = ! R0M0 = " 0M0L = # 0LR0 = $ 00RM = % 0L0L = & RM00 = ' 0LL0 = ( 0RL0 = ) 00LM = * 00ML = + R0R0 = , R00L = - RR00 = . MMM0 = / Num 0L00 = 0 Num R000 = 1 Num 0R00 = 2 Num 00R0 = 3 Num 000R = 4 Num M000 = 5 Num 0M00 = 6 Num 00M0 = 7 Num 000M = 8 Num L000 = 9 00RL = : R00R = ; Num M00L = < 00MR = = Num R0R0 = > RL00 = ? 00LR = @ ############## Other symbols (ascii 0x5b to 0x60 and 0x7b to 0x7f) Num RM00 = [ LLL0 = \ Num R00M = ] Num LM00 = ^ 0R0L = _ Num R0L0 = ` Num R00L = { Num LLR0 = | Num LL0R = } Num LLM0 = ~ 0L00 = \x7f 00L0 = \x08 ############## In addition to ascii, here are the special keys # return, tab 000L = \x0a MM0M = \x09 # arrows 0MR0 = Up 0ML0 = Down 0MM0 = Left 0M0M = Right # pageup/down 00RR = Prior 00LL = Next ############## Functions Fun R000 = F1 Fun 0R00 = F2 Fun 00R0 = F3 Fun 000R = F4 Fun M000 = F5 Fun 0M00 = F6 Fun 00M0 = F7 Fun 000M = F8 Fun L000 = F9 Fun 0L00 = F10 Fun 00L0 = F11 Fun 000L = F12 ############## Console switching Ctrl+Shift R000 = Console 1 Ctrl+Shift 0R00 = Console 2 Ctrl+Shift 00R0 = Console 3 Ctrl+Shift 000R = Console 4 Ctrl+Shift M000 = Console 5 Ctrl+Shift 0M00 = Console 6 Ctrl+Shift 00M0 = Console 7 Ctrl+Shift 000M = Console 8 Ctrl+Shift L000 = Console 9 Ctrl+Shift 0L00 = Console 10 Ctrl+Shift 00L0 = Console 11 Ctrl+Shift 000L = Console 12 ############## Executing commands (be careful: this is root) # This is just an example: t for "time" and s for "space" # The empty line is used to align text on console border F M00R = Exec echo > /dev/tty0; date > /dev/tty0 F M0R0 = Exec echo > /dev/tty0; df > /dev/tty0 # you can put shutdown, reboot or anything here. ############## Macros 0RR0 = "the" 0RM0 = "of" 0R0R = "to" 0M0R = "ed" R00M = "and" 0R0M = "in" 0L0M = "ion" 00MM = "ing" ############## Add accented letters here below.... gpm-1.20.4/configure010070000017500001750000005137031101761657000131360ustar00niconico00#! /bin/sh # From configure.in configure.in. # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/daemon/main.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA YACC YFLAGS LN_S DVIPS TEXI2HTML TEX TEXINDEX MAKEINFO DIFF SED emacs CPP GREP EGREP ALLOCA GPMXTERM release release_date abi_lev abi_full EMACS ELISP SHLIB PICFLAGS SOLDFLAGS CURSES_OBJS SHARED_LIBS lispdir LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS YACC YFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/[-.]/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --without-curses disable curses support even if curses found Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory YACC The `Yet Another C Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers src/headers/config.h" release=1.20.4 release_date="29th of May 2008" cat >>confdefs.h <<_ACEOF #define GPM_RELEASE "$release" _ACEOF cat >>confdefs.h <<_ACEOF #define GPM_RELEASE_DATE "$release_date" _ACEOF #abi=21 # #abi_lev=`expr $abi - $abi_age` #abi_full=$abi_lev.$abi_age.$abi_rev abi_lev="2" abi_age="0" abi_rev="0" abi_full="${abi_lev}.${abi_age}.${abi_rev}" if test x$srcdir = x ; then srcdir = `pwd` else srcdir=`cd $srcdir && pwd` fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } if test -z "$ac_file"; then echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_YACC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_YACC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { echo "$as_me:$LINENO: result: $YACC" >&5 echo "${ECHO_T}$YACC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" { echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6; } fi # check for programs. # Extract the first word of "dvips", so it can be a program name with args. set dummy dvips; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_DVIPS+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $DVIPS in [\\/]* | ?:[\\/]*) ac_cv_path_DVIPS="$DVIPS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DVIPS="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DVIPS" && ac_cv_path_DVIPS="no" ;; esac fi DVIPS=$ac_cv_path_DVIPS if test -n "$DVIPS"; then { echo "$as_me:$LINENO: result: $DVIPS" >&5 echo "${ECHO_T}$DVIPS" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "texi2html", so it can be a program name with args. set dummy texi2html; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_TEXI2HTML+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $TEXI2HTML in [\\/]* | ?:[\\/]*) ac_cv_path_TEXI2HTML="$TEXI2HTML" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TEXI2HTML="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_TEXI2HTML" && ac_cv_path_TEXI2HTML="no" ;; esac fi TEXI2HTML=$ac_cv_path_TEXI2HTML if test -n "$TEXI2HTML"; then { echo "$as_me:$LINENO: result: $TEXI2HTML" >&5 echo "${ECHO_T}$TEXI2HTML" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "tex", so it can be a program name with args. set dummy tex; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_TEX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $TEX in [\\/]* | ?:[\\/]*) ac_cv_path_TEX="$TEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TEX="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_TEX" && ac_cv_path_TEX="no" ;; esac fi TEX=$ac_cv_path_TEX if test -n "$TEX"; then { echo "$as_me:$LINENO: result: $TEX" >&5 echo "${ECHO_T}$TEX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "texindex", so it can be a program name with args. set dummy texindex; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_TEXINDEX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $TEXINDEX in [\\/]* | ?:[\\/]*) ac_cv_path_TEXINDEX="$TEXINDEX" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_TEXINDEX="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_TEXINDEX" && ac_cv_path_TEXINDEX="no" ;; esac fi TEXINDEX=$ac_cv_path_TEXINDEX if test -n "$TEXINDEX"; then { echo "$as_me:$LINENO: result: $TEXINDEX" >&5 echo "${ECHO_T}$TEXINDEX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "makeinfo", so it can be a program name with args. set dummy makeinfo; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_MAKEINFO+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAKEINFO in [\\/]* | ?:[\\/]*) ac_cv_path_MAKEINFO="$MAKEINFO" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MAKEINFO="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MAKEINFO" && ac_cv_path_MAKEINFO="no" ;; esac fi MAKEINFO=$ac_cv_path_MAKEINFO if test -n "$MAKEINFO"; then { echo "$as_me:$LINENO: result: $MAKEINFO" >&5 echo "${ECHO_T}$MAKEINFO" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "diff", so it can be a program name with args. set dummy diff; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_DIFF+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $DIFF in [\\/]* | ?:[\\/]*) ac_cv_path_DIFF="$DIFF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DIFF="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DIFF" && ac_cv_path_DIFF="no" ;; esac fi DIFF=$ac_cv_path_DIFF if test -n "$DIFF"; then { echo "$as_me:$LINENO: result: $DIFF" >&5 echo "${ECHO_T}$DIFF" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "sed", so it can be a program name with args. set dummy sed; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SED in [\\/]* | ?:[\\/]*) ac_cv_path_SED="$SED" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SED" && ac_cv_path_SED="no" ;; esac fi SED=$ac_cv_path_SED if test -n "$SED"; then { echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "emacs", so it can be a program name with args. set dummy emacs; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_emacs+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $emacs in [\\/]* | ?:[\\/]*) ac_cv_path_emacs="$emacs" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_emacs="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_emacs" && ac_cv_path_emacs="no" ;; esac fi emacs=$ac_cv_path_emacs if test -n "$emacs"; then { echo "$as_me:$LINENO: result: $emacs" >&5 echo "${ECHO_T}$emacs" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test ${ac_cv_path_emacs} = no ; then EMACS=: ELISP= else EMACS=${ac_cv_path_emacs} ELISP="emacs/t-mouse.el emacs/t-mouse.elc" fi if test $EMACS != : ; then { echo "$as_me:$LINENO: checking where to install Emacs Lisp files" >&5 echo $ECHO_N "checking where to install Emacs Lisp files... $ECHO_C" >&6; } if test "${itz_cv_path_site_lisp+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval itz_cv_path_site_lisp=`${EMACS} -batch -l ${srcdir}/exec.el -exec "(mapcar 'print load-path)" 2>/dev/null | sed -e '/^$/d' | sed -n -e 2p` case x${itz_cv_path_site_lisp} in x*site-lisp*) ;; x*) itz_cv_path_site_lisp='${datadir}/emacs/site-lisp' ;; esac fi { echo "$as_me:$LINENO: result: $itz_cv_path_site_lisp" >&5 echo "${ECHO_T}$itz_cv_path_site_lisp" >&6; } lispdir=${itz_cv_path_site_lisp} else lispdir='${datadir}/emacs/site-lisp' fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in syslog.h linux/input.h linux/joystick.h ncurses.h ncurses/curses.h curses.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check whether --with-curses was given. if test "${with_curses+set}" = set; then withval=$with_curses; fi CURSES_OBJS= case $with_curses in No|no|N|n) : ;; *) if test ${ac_cv_header_ncurses_h} = yes || test ${ac_cv_header_ncurses_curses_h} = yes || test ${ac_cv_header_curses_h} = yes ; then CURSES_OBJS=lib/libcurses.o ; fi ;; esac for ac_header in sys/sysmacros.h linux/major.h linux/tty.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for __u32" >&5 echo $ECHO_N "checking for __u32... $ECHO_C" >&6; } if test "${itz_cv_type___u32+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { __u32 dummy; return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then itz_cv_type___u32=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 itz_cv_type___u32=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $itz_cv_type___u32" >&5 echo "${ECHO_T}$itz_cv_type___u32" >&6; } if test ${itz_cv_type___u32} = yes || test ${ac_cv_type___u32} = yes ; then cat >>confdefs.h <<\_ACEOF #define HAVE___U32 1 _ACEOF fi { echo "$as_me:$LINENO: checking whether system is ELF" >&5 echo $ECHO_N "checking whether system is ELF... $ECHO_C" >&6; } if test "${itz_cv_sys_elf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __ELF__ win #else lose #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "win" >/dev/null 2>&1; then itz_cv_sys_elf=yes else itz_cv_sys_elf=no fi rm -f conftest* fi { echo "$as_me:$LINENO: result: $itz_cv_sys_elf" >&5 echo "${ECHO_T}$itz_cv_sys_elf" >&6; } if test ${itz_cv_sys_elf} = yes && test x${ac_cv_c_compiler_gnu} = xyes ; then PICFLAGS="-DPIC -fPIC" SOLDFLAGS="-fPIC -shared -Wl,-soname," else PICFLAGS= SOLDFLAGS= fi if test ${itz_cv_sys_elf} = yes && test x${ac_cv_c_compiler_gnu} = xyes ; then SHLIB=libgpm.so else SHLIB= fi for ac_func in vsyslog syslog do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { echo "$as_me:$LINENO: checking for working alloca.h" >&5 echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; } if test "${ac_cv_working_alloca_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_working_alloca_h=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ALLOCA_H 1 _ACEOF fi { echo "$as_me:$LINENO: checking for alloca" >&5 echo $ECHO_N "checking for alloca... $ECHO_C" >&6; } if test "${ac_cv_func_alloca_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then ac_cv_func_alloca_works=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ALLOCA 1 _ACEOF else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext cat >>confdefs.h <<\_ACEOF #define C_ALLOCA 1 _ACEOF { echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; } if test "${ac_cv_os_cray+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 echo "${ECHO_T}$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; } if test "${ac_cv_c_stack_direction+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_c_stack_direction=0 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int find_stack_direction () { static char *addr = 0; auto char dummy; if (addr == 0) { addr = &dummy; return find_stack_direction (); } else return (&dummy > addr) ? 1 : -1; } int main () { return find_stack_direction () < 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_stack_direction=1 else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi case $with_curses in No|no|N|n) SHARED_LIBS=-lc ;; *) SAVELIBS=$LIBS LIBS= for i in tinfo ncurses termcap termlib; do if test x$LIBS = x; then as_ac_Lib=`echo "ac_cv_lib_$i''_tputs" | $as_tr_sh` { echo "$as_me:$LINENO: checking for tputs in -l$i" >&5 echo $ECHO_N "checking for tputs in -l$i... $ECHO_C" >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$i $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tputs (); int main () { return tputs (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi ac_res=`eval echo '${'$as_ac_Lib'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Lib'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_LIB$i" | $as_tr_cpp` 1 _ACEOF LIBS="-l$i $LIBS" fi else :; fi done TERMLIBS=$LIBS LIBS= for i in ncurses curses; do if test x$LIBS = x; then as_ac_Lib=`echo "ac_cv_lib_$i''_wgetch" | $as_tr_sh` { echo "$as_me:$LINENO: checking for wgetch in -l$i" >&5 echo $ECHO_N "checking for wgetch in -l$i... $ECHO_C" >&6; } if { as_var=$as_ac_Lib; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-l$i $TERMLIBS $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char wgetch (); int main () { return wgetch (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then eval "$as_ac_Lib=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Lib=no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi ac_res=`eval echo '${'$as_ac_Lib'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Lib'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_LIB$i" | $as_tr_cpp` 1 _ACEOF LIBS="-l$i $LIBS" fi else :; fi done SHARED_LIBS="$LIBS $TERMLIBS -lc" LIBS=$SAVELIBS ;; esac GPMXTERM= CPPFLAGS='-I$(srcdir) $(DEFS) -include headers/config.h -Wall -DSYSCONFDIR="\"$(sysconfdir)\"" -DSBINDIR="\"$(sbindir)\""' LDFLAGS='-L$(srcdir)' ac_config_files="$ac_config_files Makefile.include Makefile doc/Makefile src/Makefile contrib/Makefile doc/doc.gpm" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/headers/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/headers/config.h" ;; "Makefile.include") CONFIG_FILES="$CONFIG_FILES Makefile.include" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; "doc/doc.gpm") CONFIG_FILES="$CONFIG_FILES doc/doc.gpm" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim RANLIB!$RANLIB$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim YACC!$YACC$ac_delim YFLAGS!$YFLAGS$ac_delim LN_S!$LN_S$ac_delim DVIPS!$DVIPS$ac_delim TEXI2HTML!$TEXI2HTML$ac_delim TEX!$TEX$ac_delim TEXINDEX!$TEXINDEX$ac_delim MAKEINFO!$MAKEINFO$ac_delim DIFF!$DIFF$ac_delim SED!$SED$ac_delim emacs!$emacs$ac_delim CPP!$CPP$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim ALLOCA!$ALLOCA$ac_delim GPMXTERM!$GPMXTERM$ac_delim release!$release$ac_delim release_date!$release_date$ac_delim abi_lev!$abi_lev$ac_delim abi_full!$abi_full$ac_delim EMACS!$EMACS$ac_delim ELISP!$ELISP$ac_delim SHLIB!$SHLIB$ac_delim PICFLAGS!$PICFLAGS$ac_delim SOLDFLAGS!$SOLDFLAGS$ac_delim CURSES_OBJS!$CURSES_OBJS$ac_delim SHARED_LIBS!$SHARED_LIBS$ac_delim lispdir!$lispdir$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 78; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi gpm-1.20.4/configure.in010060000017500001750000000067371101753547600135530ustar00niconico00AC_REVISION(configure.in,v 1.7 2008/02/16 nico) dnl Process this file with autoconf to produce a configure script. dnl written jan/1997 - T.E.Dickey AC_INIT(src/daemon/main.c) AC_PREREQ(2.12) AC_CONFIG_HEADER(src/headers/config.h) release=1.20.4 release_date="29th of May 2008" AC_DEFINE_UNQUOTED(GPM_RELEASE,"$release",[GPM release number as a string]) AC_DEFINE_UNQUOTED(GPM_RELEASE_DATE,"$release_date",[release date as a string]) dnl These are chosen so that we can switch to the libtool scheme dnl transparently. dnl Nico, 20080520: Is this somewhere needed? dnl I do not see the use right now -> disabled #abi=21 # #abi_lev=`expr $abi - $abi_age` #abi_full=$abi_lev.$abi_age.$abi_rev abi_lev="2" abi_age="0" abi_rev="0" abi_full="${abi_lev}.${abi_age}.${abi_rev}" dnl Make srcdir an absolute path. if test x$srcdir = x ; then srcdir = `pwd` else srcdir=`cd $srcdir && pwd` fi AC_PROG_CC AC_PROG_RANLIB AC_PROG_INSTALL AC_PROG_YACC AC_PROG_LN_S # check for programs. AC_PATH_PROG(DVIPS,dvips,no) AC_PATH_PROG(TEXI2HTML,texi2html,no) AC_PATH_PROG(TEX,tex,no) AC_PATH_PROG(TEXINDEX,texindex,no) AC_PATH_PROG(MAKEINFO,makeinfo,no) AC_PATH_PROG(DIFF,diff,no) AC_PATH_PROG(SED,sed,no) AC_PATH_PROG(emacs,emacs,no) if test ${ac_cv_path_emacs} = no ; then EMACS=: ELISP= else EMACS=${ac_cv_path_emacs} ELISP="emacs/t-mouse.el emacs/t-mouse.elc" fi if test $EMACS != : ; then ITZ_PATH_SITE_LISP lispdir=${itz_cv_path_site_lisp} else lispdir='${datadir}/emacs/site-lisp' fi AC_CHECK_HEADERS(syslog.h linux/input.h linux/joystick.h ncurses.h ncurses/curses.h curses.h) AC_ARG_WITH(curses, [ --without-curses disable curses support even if curses found]) CURSES_OBJS= case $with_curses in No|no|N|n) : ;; *) if test ${ac_cv_header_ncurses_h} = yes || test ${ac_cv_header_ncurses_curses_h} = yes || test ${ac_cv_header_curses_h} = yes ; then CURSES_OBJS=lib/libcurses.o ; fi ;; esac AC_CHECK_HEADERS(sys/sysmacros.h linux/major.h linux/tty.h) ITZ_CHECK_TYPE(__u32,linux/types.h) if test ${itz_cv_type___u32} = yes || test ${ac_cv_type___u32} = yes ; then AC_DEFINE(HAVE___U32, 1, [define if the __u32 type exists either in sys/types.h or in linux/types.h]) fi ITZ_SYS_ELF if test ${itz_cv_sys_elf} = yes && test x${ac_cv_prog_gcc} = xyes ; then SHLIB=libgpm.so else SHLIB= fi AC_CHECK_FUNCS(vsyslog syslog) AC_FUNC_ALLOCA case $with_curses in No|no|N|n) SHARED_LIBS=-lc ;; *) SAVELIBS=$LIBS LIBS= for i in tinfo ncurses termcap termlib; do if test x$LIBS = x; then AC_CHECK_LIB($i, tputs) else :; fi done TERMLIBS=$LIBS LIBS= for i in ncurses curses; do if test x$LIBS = x; then AC_CHECK_LIB($i, wgetch,,,$TERMLIBS) else :; fi done SHARED_LIBS="$LIBS $TERMLIBS -lc" LIBS=$SAVELIBS ;; esac GPMXTERM= AC_SUBST(GPMXTERM) AC_SUBST(release) AC_SUBST(release_date) AC_SUBST(abi_lev) AC_SUBST(abi_full) AC_SUBST(EMACS) AC_SUBST(ELISP) AC_SUBST(SHLIB) AC_SUBST(PICFLAGS) AC_SUBST(SOLDFLAGS) AC_SUBST(CURSES_OBJS) AC_SUBST(SHARED_LIBS) AC_SUBST(lispdir) CPPFLAGS='-I$(srcdir) $(DEFS) -include headers/config.h -Wall -DSYSCONFDIR="\"$(sysconfdir)\"" -DSBINDIR="\"$(sbindir)\""' LDFLAGS='-L$(srcdir)' dnl AC_DEFINE_UNQUOTED(SYSCONFDIR,"$sysconfdir") dnl AC_DEFINE_UNQUOTED(SBINDIR,"$sbindir") AC_OUTPUT(Makefile.include Makefile doc/Makefile src/Makefile contrib/Makefile doc/doc.gpm) gpm-1.20.4/contrib004070000017500001750000000000001101761660000125745ustar00niconico00gpm-1.20.4/contrib/Makefile010060000017500001750000000012631101761660000143140ustar00niconico00# -*-makefile-*- (gpm/contrib) # # Copyright (C) 2001 Nico Schottelius # srcdir = /home/user/nico/projekte/gpm/gpm/contrib top_builddir = .. include $(top_builddir)/Makefile.include all: $(srcdir)/$(ELISP) install: all if [ -n "$(ELISP)" ]; then for i in `echo $(ELISP)`; do \ $(INSTALL_DATA) $(srcdir)/$$i $(lispdir)/`basename $$i` ;\ done; fi %.elc: %.el $(EMACS) -batch -l $(srcdir)/emacs/exec.el -exec '(byte-compile-file "$<")' uninstall: if [ -n "$(ELISP)" ]; then for i in `echo $(ELISP)`; do \ rm -f $(lispdir)/$$i ;\ done; fi dist: $(CP) -r $(srcdir) $(top_builddir)/gpm-$(release)/ clean distclean: $(RM) -f $(srcdir)/emacs/*.elc gpm-1.20.4/contrib/Makefile.in010060000017500001750000000012231076632743400147330ustar00niconico00# -*-makefile-*- (gpm/contrib) # # Copyright (C) 2001 Nico Schottelius # srcdir = @srcdir@ top_builddir = .. include $(top_builddir)/Makefile.include all: $(srcdir)/$(ELISP) install: all if [ -n "$(ELISP)" ]; then for i in `echo $(ELISP)`; do \ $(INSTALL_DATA) $(srcdir)/$$i $(lispdir)/`basename $$i` ;\ done; fi %.elc: %.el $(EMACS) -batch -l $(srcdir)/emacs/exec.el -exec '(byte-compile-file "$<")' uninstall: if [ -n "$(ELISP)" ]; then for i in `echo $(ELISP)`; do \ rm -f $(lispdir)/$$i ;\ done; fi dist: $(CP) -r $(srcdir) $(top_builddir)/gpm-$(release)/ clean distclean: $(RM) -f $(srcdir)/emacs/*.elc gpm-1.20.4/contrib/emacs004070000017500001750000000000001075432545600137015ustar00niconico00gpm-1.20.4/contrib/emacs/exec.el010060000017500001750000000002670760216311400152170ustar00niconico00(setq command-switch-alist '( ("-exec" . cmdline-exec))) (defun cmdline-exec (name) (eval (car (read-from-string (car command-line-args-left)))) ) gpm-1.20.4/contrib/emacs/t-mouse.el010060000017500001750000000327420760216311400156670ustar00niconico00;;; t-mouse.el --- mouse support within the text terminal ;;; Copyright (C) 1994,1995 Alessandro Rubini ;;; parts are by Ian T Zimmermann , 1995,1998 ;; Maintainer: gpm mailing list: gpm@prosa.it ;; Keywords: mouse gpm linux ;;; 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 GNU Emacs; see the file COPYING. If not, write to ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; Commentary: ;; This package provides access to mouse event as reported by the ;; gpm-Linux package. It uses the program "mev" to get mouse events. ;; It tries to reproduce the functionality offered by emacs under X. ;; The "gpm" server runs under Linux, so this package is rather ;; Linux-dependent. ;; Developed for GNU Emacs 19.34, likely won't work with many others ;; too much internals dependent cruft here. (require 'advice) (defvar t-mouse-process nil "Embeds the process which passes mouse events to emacs. It is used by the program t-mouse.") (defvar t-mouse-filter-accumulator "" "Accumulates input from the mouse reporting process.") (defvar t-mouse-debug-buffer nil "Events normally posted to command queue are printed here in debug mode. See `t-mouse-start-debug'.") (defvar t-mouse-current-xy '(0 . 0) "Stores the last mouse position t-mouse has been told about.") (defvar t-mouse-drag-start nil "Whenever a drag starts in a special part of a window (not the text), the `translated' starting coordinates including the window and part involved are saved here. This is necessary lest they get re-translated when the button goes up, at which time window configuration may have changed.") (defvar t-mouse-prev-set-selection-function 'x-set-selection) (defvar t-mouse-prev-get-selection-function 'x-get-selection) (defvar t-mouse-swap-alt-keys nil "When set, Emacs will handle mouse events with the right Alt (a.k.a. Alt-Ger) modifier, not with the regular left Alt modifier. Useful for people who play strange games with their keyboard tables.") (defvar t-mouse-fix-21 nil "Enable brain-dead chords for 2 button mice.") ;;; Code: ;; get the number of the current virtual console (defun t-mouse-tty () "Returns number of virtual terminal Emacs is running on, as a string. For example, \"2\" for /dev/tty2." (let ((buffer (generate-new-buffer "*t-mouse*"))) (call-process "ps" nil buffer nil "h" (format "%s" (emacs-pid))) (prog1 (save-excursion (set-buffer buffer) (goto-char (point-min)) (if (or ;; Many versions of "ps", all different.... (re-search-forward " +tty\\(.?[0-9a-f]\\)" nil t) (re-search-forward "p \\([0-9a-f]\\)" nil t) (re-search-forward "v0\\([0-9a-f]\\)" nil t) (re-search-forward "[0-9]+ +\\([0-9]+\\)" nil t) (re-search-forward "[\\t ]*[0-9]+[\\t ]+\\([0-9]+\\)" nil t)) (buffer-substring (match-beginning 1) (match-end 1)))) (kill-buffer buffer)))) ;; due to a horrible kludge in Emacs' keymap handler ;; (read_key_sequence) mouse clicks on funny parts of windows generate ;; TWO events, the first being a dummy of the sort '(mode-line). ;; That's why Per Abrahamsen's code in xt-mouse.el doesn't work for ;; the modeline, for instance. ;; now get this: the Emacs C code that generates these fake events ;; depends on certain things done by the very lowest level input ;; handlers; namely the symbols for the events (for instance ;; 'C-S-double-mouse-2) must have an 'event-kind property, set to ;; 'mouse-click. Since events from unread-command-events do not pass ;; through the low level handlers, they don't get this property unless ;; I set it myself. I imagine this has caused innumerable attempts by ;; hackers to do things similar to t-mouse to lose. ;; The next page of code is devoted to fixing this ugly problem. ;; WOW! a fully general powerset generator ;; (C) Ian Zimmerman Mon Mar 23 12:00:16 PST 1998 :-) (defun t-mouse-powerset (l) (if (null l) '(nil) (let ((l1 (t-mouse-powerset (cdr l))) (first (nth 0 l))) (append (mapcar (function (lambda (l) (cons first l))) l1) l1)))) ;; and a slightly less general cartesian product (defun t-mouse-cartesian (l1 l2) (if (null l1) l2 (append (mapcar (function (lambda (x) (append (nth 0 l1) x))) l2) (t-mouse-cartesian (cdr l1) l2)))) (let* ((modifier-sets (t-mouse-powerset '(control meta shift))) (typed-sets (t-mouse-cartesian '((down) (drag)) '((mouse-1) (mouse-2) (mouse-3)))) (multipled-sets (t-mouse-cartesian '((double) (triple)) typed-sets)) (all-sets (t-mouse-cartesian modifier-sets multipled-sets))) (while all-sets (let ((event-sym (event-convert-list (nth 0 all-sets)))) (if (not (get event-sym 'event-kind)) (put event-sym 'event-kind 'mouse-click))) (setq all-sets (cdr all-sets)))) ;;; This fun is partly Copyright (C) 1994 Per Abrahamsen ;; This is basically a feeble attempt to mimic what the c function ;; buffer_posn_from_coords in dispnew.c does. I wish that function ;; were exported to Lisp. (defun t-mouse-lispy-buffer-posn-from-coords (w col line) "Return buffer position of character at COL and LINE within window W. COL and LINE are glyph coordinates, relative to W topleft corner." (save-window-excursion (select-window w) (save-excursion (move-to-window-line line) (move-to-column (+ col (current-column) (if (not (window-minibuffer-p w)) 0 (- (minibuffer-prompt-width))) (max 0 (1- (window-hscroll))))) (point)))) ;; compute one element of the form (WINDOW BUFFERPOS (COL . ROW) TIMESTAMP) (defun t-mouse-make-event-element (x-dot-y-avec-time) (let* ((x-dot-y (nth 0 x-dot-y-avec-time)) (x (car x-dot-y)) (y (cdr x-dot-y)) (timestamp (nth 1 x-dot-y-avec-time)) (w (window-at x y)) (left-top-right-bottom (window-edges w)) (left (nth 0 left-top-right-bottom)) (top (nth 1 left-top-right-bottom)) (right (nth 2 left-top-right-bottom)) (bottom (nth 3 left-top-right-bottom)) (coords-or-part (coordinates-in-window-p x-dot-y w))) (cond ((consp coords-or-part) (let ((wx (car coords-or-part)) (wy (cdr coords-or-part))) (if (< wx (- right left 1)) (list w (t-mouse-lispy-buffer-posn-from-coords w wx wy) coords-or-part timestamp) (list w 'vertical-scroll-bar (cons (1+ wy) (- bottom top)) timestamp)))) ((eq coords-or-part 'mode-line) (list w 'mode-line (cons (- x left) 0) timestamp)) ((eq coords-or-part 'vertical-line) (list w 'vertical-line (cons 0 (- y top)) timestamp))))) ;;; This fun is partly Copyright (C) 1994 Per Abrahamsen (defun t-mouse-make-event () "Makes a Lisp style event from the contents of mouse input accumulator. Also trims the accumulator by all the data used to build the event." (let (ob (ob-pos (condition-case nil (read-from-string t-mouse-filter-accumulator) (error nil)))) (if (not ob-pos) nil (setq ob (car ob-pos)) (setq t-mouse-filter-accumulator (substring t-mouse-filter-accumulator (cdr ob-pos))) ;;now the real work (let ((event-type (nth 0 ob)) (current-xy-avec-time (nth 1 ob)) (type-switch (length ob))) (if t-mouse-fix-21 (let ;;Acquire the event's symbol's name. ((event-name-string (symbol-name event-type)) end-of-root-event-name new-event-name-string) (if (string-match "-\\(21\\|\\12\\)$" event-name-string) ;;Transform the name to what it should have been. (progn (setq end-of-root-event-name (match-beginning 0)) (setq new-event-name-string (concat (substring event-name-string 0 end-of-root-event-name) "-3")) ;;Change the event to the symbol that corresponds to the ;;name we made. The proper symbol already exists. (setq event-type (intern new-event-name-string)))))) ;;store current position for mouse-position (setq t-mouse-current-xy (nth 0 current-xy-avec-time)) ;;events have many types but fortunately they differ in length (cond ;;sink all events on the stupid text mode menubar. ((and menu-bar-mode (eq 0 (cdr t-mouse-current-xy))) nil) ((= type-switch 4) ;must be drag (let ((count (nth 2 ob)) (start-element (or t-mouse-drag-start (t-mouse-make-event-element (nth 3 ob)))) (end-element (t-mouse-make-event-element current-xy-avec-time))) (setq t-mouse-drag-start nil) (list event-type start-element end-element count))) ((= type-switch 3) ;down or up (let ((count (nth 2 ob)) (element (t-mouse-make-event-element current-xy-avec-time))) (if (and (not t-mouse-drag-start) (symbolp (nth 1 element))) ;; OUCH! GOTCHA! emacs uses setc[ad]r on these! (setq t-mouse-drag-start (copy-sequence element)) (setq t-mouse-drag-start nil)) (list event-type element count))) ((= type-switch 2) ;movement (list (if (eq 'vertical-scroll-bar (nth 1 t-mouse-drag-start)) 'scroll-bar-movement 'mouse-movement) (t-mouse-make-event-element current-xy-avec-time)))))))) (defun t-mouse-process-filter (proc string) (setq t-mouse-filter-accumulator (concat t-mouse-filter-accumulator string)) (let ((event (t-mouse-make-event))) (while event (if (or track-mouse (not (eq 'mouse-movement (event-basic-type event)))) (setq unread-command-events (nconc unread-command-events (list event)))) (if t-mouse-debug-buffer (print unread-command-events t-mouse-debug-buffer)) (setq event (t-mouse-make-event))))) ;; this overrides a C function which stupidly assumes (no X => no mouse) (defadvice mouse-position (around t-mouse-mouse-position activate) "Return the t-mouse-position unless running with a window system. The (secret) scrollbar interface is not implemented yet." (if (not window-system) (setq ad-return-value (cons (selected-frame) t-mouse-current-xy)) ad-do-it)) (setq mouse-sel-set-selection-function (function (lambda (type value) (if (not window-system) (if (eq 'PRIMARY type) (kill-new value)) (funcall t-mouse-prev-set-selection-function type value))))) (setq mouse-sel-get-selection-function (function (lambda (type) (if (not window-system) (if (eq 'PRIMARY type) (current-kill 0) "") (funcall t-mouse-prev-get-selection-function type))))) ;; It should be possible to just send SIGTSTP to the inferior with ;; stop-process. That doesn't work; mev receives the signal fine but ;; is not really stopped: instead it returns from ;; kill(getpid(), SIGTSTP) immediately. I don't understand what's up ;; itz Tue Mar 24 14:27:38 PST 1998. (add-hook 'suspend-hook (function (lambda () (and t-mouse-process ;(stop-process t-mouse-process) (process-send-string t-mouse-process "push -enone -dall -Mnone\n"))))) (add-hook 'suspend-resume-hook (function (lambda () (and t-mouse-process ;(continue-process t-mouse-process) (process-send-string t-mouse-process "pop\n"))))) ;;; User commands (defun t-mouse-stop () "Stop getting mouse events from an asynchronous process." (interactive) (delete-process t-mouse-process) (setq t-mouse-process nil)) (defun t-mouse-run () "Starts getting a stream of mouse events from an asynchronous process. Only works if Emacs is running on a virtual terminal without a window system. Returns the newly created asynchronous process." (interactive) (let ((tty (t-mouse-tty)) (process-connection-type t)) (if (or window-system (not (stringp tty))) (error "Run t-mouse on a virtual terminal without a window system")) (setq t-mouse-process (start-process "t-mouse" nil "mev" "-i" "-E" "-C" tty (if t-mouse-swap-alt-keys "-M-leftAlt" "-M-rightAlt") "-e-move" "-dall" "-d-hard" "-f"))) (setq t-mouse-filter-accumulator "") (set-process-filter t-mouse-process 't-mouse-process-filter) (process-kill-without-query t-mouse-process) t-mouse-process) (provide 't-mouse) ;;; t-mouse.el ends here gpm-1.20.4/contrib/init004070000017500001750000000000001076632743400135555ustar00niconico00gpm-1.20.4/contrib/init/gpm.init010070000017500001750000000023241076632743400153050ustar00niconico00#!/bin/sh # $Id: gpm.init,v 1.2 2002/05/28 19:13:51 nico Exp $ # # chkconfig: 2345 85 15 # description: \ # gpm provides mouse support to text-based Linux applications as \ # well as console cut-and-paste operations using the mouse. # # processname: gpm # pidfile: /var/run/gpm.pid # config: /etc/sysconfig/mouse # source function library . /etc/init.d/functions OWL_STARTUP_ENABLE=1 MOUSECFG=/etc/sysconfig/mouse case "$1" in start) if [ -f "$MOUSECFG" ]; then . "$MOUSECFG" else MOUSETYPE="none" fi if [ "$MOUSETYPE" = "none" ]; then echo "Not starting gpm (no mouse is configured)" exit 0 fi if [ "$MOUSETYPE" = "Microsoft" ]; then MOUSETYPE=ms fi if [ -n "$MOUSETYPE" ]; then GPM_ARG="-t $MOUSETYPE" else GPM_ARG="" fi if [ "0$OWL_STARTUP_VERSION" -ge 3 ]; then daemon --pidfile /var/run/gpm.pid --expect-user root \ -- gpm "$GPM_ARG" else daemon gpm "$GPM_ARG" fi ;; stop) if [ "0$OWL_STARTUP_VERSION" -ge 3 ]; then killproc --pidfile /var/run/gpm.pid --expect-user root gpm else killproc gpm fi ;; restart|reload) $0 stop $0 start ;; status) status --pidfile /var/run/gpm.pid --expect-user root gpm ;; *) echo "Usage: gpm {start|stop|restart|status}" exit 1 esac exit $? gpm-1.20.4/contrib/other004070000017500001750000000000001076632743400137335ustar00niconico00gpm-1.20.4/contrib/other/README010060000017500001750000000001710760216311400146540ustar00niconico00Have a look into MANIFEST for more informations. README - this file TPdetect.cc - sample TP detection gpm-1.20.4/contrib/other/TPdetect.cc010060000017500001750000000134710760216311400160260ustar00niconico00#include #include #include #include #include unsigned char* inbuffer; unsigned char* outbuffer; // wait for up to 0.1seconds for an acknowledgement int getack(int fd) { fd_set set; timeval timeout; FD_ZERO(&set); FD_SET(fd,&set); timeout.tv_sec=0; timeout.tv_usec=100000; if (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) { int b=read(fd,inbuffer,1); if(b==1) { if(inbuffer[0]==0xfa) { //printf("<< Acknowledged\r\n"); return 1; } else if (inbuffer[0]=0xfe) printf("<- PS/2: Error\r\n"); else printf("<- Not an acknowledgement:%02x\r\n",inbuffer[0]); }; }; return 0; }; // Try to receive n bytes int receive(int fd,int n) { int a=0,b; while(a TP: Send extended ID\r\n"); command(fd,0xe1); if (! getack(fd)) { if(inbuffer[0]==0xfe) { // give it a second try command(fd,0xe1); if(getack(fd)) goto ack; } printf("No trackpoint controller detected\r\n"); return 0; } ack: int a=0; while(select(FD_SETSIZE,&set,NULL,NULL,&timeout)) { read(fd,inbuffer+a,1); a++; } char * version; if(inbuffer[0]==0x01) { switch(inbuffer[1]) { case 0x01: version = "8E/98"; break; case 0x02: version = "A4"; break; case 0x03: version = "AB"; break; case 0x04: version = "03"; break; case 0x05: version = "B2/B4"; break; case 0x06: version = "B1/B3/B5/B8/2B"; break; case 0x07: version = "?"; break; case 0x08: version = "?"; break; case 0x09: version = "?"; break; case 0x0A: version = "35"; break; case 0x0B: version = "3A/3B"; break; case 0x0C: version = "3C"; break; case 0x0D: version = "3D"; break; case 0x0E: version = "3E"; break; default: printf("Unrecognized ID: %02x\n",inbuffer[1]); return 0; } printf("IBM Trackpoint controller detected. Version %s \r\n",version); return 1; } else { printf("No IBM trackpoint controller detected\r\n"); printf("Extended ID: %02x %02x\r\n",inbuffer[0],inbuffer[1]); return 0; } } // Reset PS/2 device int reset(int fd) { command(fd,0xff); printf("-> PS/2: Reset\r\n"); getack(fd); receive(fd,2); if(inbuffer[0]==0xaa && inbuffer[1]==0x00) { printf("<- PS/2: Succesfull initialization\r\n"); return 1; } else return 0; } // Get PS/2 ID int getdeviceid(int fd) { command(fd,0xf2); getack(fd); printf("-> PS/2: Get device ID\r\n"); if(receive(fd,1)==1) { printf("<- PS/2: Device ID: %02x\n",inbuffer[0]); return inbuffer[0]; } } void enabledatareport(int fd) { command(fd, 0xf4); printf("-> PS/2: (re)Enable data-reporting\r\n"); getack(fd); } void disabledatareport(int fd) { command(fd, 0xf5); printf("-> PS/2: Disable data-reporting\r\n"); getack(fd); } void setsamplerate(int fd, int rate) { command(fd,0xf3); printf("-> PS/2: Set sample rate: %u\r\n",rate); getack(fd); command(fd,rate); getack(fd); } void setresolution(int fd, int res) { command(fd,0xe8); printf("-> PS/2: Set resolution: %u\r\n",res); getack(fd); command(fd,res); getack(fd); } void getstatus(int fd) { command(fd,0xe9); printf("-> Send status\r\n"); receive(fd,3); printf("<- Status is: 0x%02x,0x%02x,0x%02x\n",inbuffer[0],inbuffer[1],inbuffer[2]); } void getlogiid(int fd) { receive(fd,3); unsigned char a = inbuffer[0]; unsigned char id = ((a >> 4) & 0x07) | ((a<<3) & 0x78); printf("Logi-id: %d\r\n", id); }; // Put trackpoint device into transparent mode void enabletransparent(int fd) { command(fd,0xe2); getack(fd); command(fd,0x4e); getack(fd); printf("-> TP: Set soft-transparent\r\n"); } // Get trackpoint device out of transparent mode // Notice the command gives not-ack because its in transparent mode, // just ignore these. After the command finishes to acknowledges are sent. void disabletransparent(int fd) { command(fd,0xe2); //getack(fd); command(fd,0xb9); getack(fd); printf("-> TP: Cancel soft-transparent\r\n"); } // Detect external device on trackpoint controller bool detectExternal(int fd) { command(fd,0xe2); getack(fd); command(fd,0x21); getack(fd); receive(fd,1); if(inbuffer[0] && 8) { printf("<- TP: External device present\r\n"); return true; } else { printf("<- TP: No external device\r\n"); return false; } } // IMPS/2 magic-initialization and detection bool detectIMPS(int fd) { setsamplerate(fd,200); setsamplerate(fd,100); setsamplerate(fd,80); if(getdeviceid(fd)==3) { printf("IMPS/2 mouse detected\r\n"); } } int main() { inbuffer = new unsigned char[200]; outbuffer = new unsigned char[200]; int fd = open("/dev/psaux", O_RDWR); reset(fd); // If kernel<2.4.9 remember to disable datareport, // in later kernels reset is enough disabledatareport(fd); sleep(1); // make sure we dont get any more confusing datareports. if(detectTP(fd)) { if(detectExternal(fd)) { enabletransparent(fd); if(! detectIMPS(fd)) disabletransparent(fd); setsamplerate(fd,200); } } else detectIMPS(fd); enabledatareport(fd); close(fd); } gpm-1.20.4/contrib/scripts004070000017500001750000000000001076632743400143015ustar00niconico00gpm-1.20.4/contrib/scripts/create_vcs010070000017500001750000000010371076632743400164220ustar00niconico00#! /bin/sh # # Script by Jakub Jelinek # Modified by Ian Zimmerman to reflect names from # kernel device list # $Id: create_vcs,v 1.2 2002/05/28 19:13:52 nico Exp $ if test -e /dev/vcs0 || test -e /dev/vcs then exit fi I=0 while [ $I -lt 25 ] do mknod /dev/vcs$I c 7 $I chmod 622 /dev/vcs$I chown root.tty /dev/vcs$I mknod /dev/vcsa$I c 7 `expr $I + 128` chmod 622 /dev/vcsa$I chown root.tty /dev/vcsa$I I=`expr $I + 1` done ln -s vcs0 /dev/vcs ln -s vcsa0 /dev/vcsa gpm-1.20.4/contrib/scripts/debug_to_report010070000017500001750000000004441076632743400174700ustar00niconico00 cat $1 | sed 's/gpm_debug_log/gpm_report/g' > $1.tmp cat $1.tmp | sed 's/LOG_NOTICE/GPM_PR_INFO/g' > $1.tmp2 cat $1.tmp2 | sed 's/LOG_ERR/GPM_PR_ERR/g' > $1.tmp cat $1.tmp | sed 's/LOG_WARN/GPM_PR_WARN/g' > $1.tmp2 cat $1.tmp2 | sed 's/LOG_DEBUG/GPM_PR_DEBUG/g' > $1.tmp echo "done:" $1.tmp gpm-1.20.4/contrib/scripts/gpm_release010070000017500001750000000014701076632743400165700ustar00niconico00#!/bin/sh # # Date: 26th of September 2001 # Description: still missing # Author: Nico Schottelius (nicos@pcsystems.de), 26th of September 2001 # Copying: GPL 2.0 # if [ $# -ne 1 ]; then echo `basename $0`': dir' echo 'Hey, hey guy, what to release ?' exit 1 fi if [ ! -d $1 ]; then echo `basename $0`': dir' echo 'HEY! DIRECTORY! We need a gpm directory!' exit 1 fi version=`echo $1 | sed 's/\/$//' | sed 's/gpm-//'` echo -n "Releasing gpm-$version ..." cd $1 cat configure.in | sed "s/release=.\*/release=$version/" > configure.on mv configure.on configure.in autoconf cat src/headers/gpmCfg.h | sed "s/\(#define GPM_DATE\).*/\1 \"`date`\"/" > src/headers/gpmCfg.i; mv src/headers/gpmCfg.i src/headers/gpmCfg.h cd .. tar cfz gpm-$version.tar.gz $1 tar cfI gpm-$version.tar.bz2 $1 echo done. gpm-1.20.4/contrib/scripts/gunze-setup010070000017500001750000000170461076632743400166010ustar00niconico00#!/bin/sh # # gunze-setup, copied and adapted from microtouch-setup. # Most of this code is duplicated, this is definitely not good. # # This program is execute by tclsh if we are in the console, and by wish # otherwise (assuming we are under a graphic environment #the following is a comment for tcl \ if [ $TERM = "linux" ] ; then exec tclsh $0 $* ; fi #the following is another comment for tcl \ exec wish $0 $* ########### That's Tcl... # The Gunze touchscreens don't adapt their output to calibration, so # we must save calibration information somewhere... set datafile /etc/gpm-calibration puts "Calibration program for Gunze touch-screens" # check generic permission set who [exec whoami] if [string compare $who root] { puts stderr "you must be root to be able to run this program" } # check if we can access this file if [catch {set F [open $datafile a]} err] { puts stderr "$argv0: Can't open $datafile: $err" exit 1 } close $F # Look for /dev/touchscreen or /dev/mouse if [file exists /dev/mouse] { set dev /dev/mouse } if [file exists /dev/touchscreen] { set dev /dev/touchscreen } if ![info exists dev] { puts stderr "$argv0: need to access /dev/touchscreen or /dev/mouse" exit 1 } # horrible, for the linux console proc goto {x y} { set x [expr $x] set y [expr $y] puts -nonewline [format "\x1B\[%03i;%03iH" $y $x] } # an abort procedure, and one to read touchscreen data proc do_abort {msg} { if ![string compare $env(TERM) linux] { goto 0 $env(LINES)-2 } else { wm withdraw . } puts stderr $msg killall -CONT gpm exit 1 } proc get_position file { global dev while 1 { gets $file string if [scan $string %c%d,%d cmd x y]!=3 { do_abort "Received wrong data \"$string\" from $dev" } # If release ('R') it's done if $cmd==0x52 { return "$sx $sy" } # If a touch event ('T'), save it if $cmd==0x54 { set sx $x; set sy $y } else { do_abort "Received wrong data \"$string\" from $dev" } } } if ![string compare $env(TERM) linux] { # Text-mode calibration if {![info exists env(COLUMNS)] || ![info exists env(LINES)]} { puts stderr "Please set COLUMNS and LINES in your environment" puts stderr " for example, you can issue" puts stderr " eval `resize`" puts stderr " in your shell before running this program" exit 1 } fconfigure stdout -buffering none exec clear > /dev/tty # To calibrate, draw targets at 1/8 and 7/8 x-y set x [expr $env(COLUMNS)/8] set y [expr $env(LINES)/8] set X [expr $env(COLUMNS) - $x] set Y [expr $env(LINES) - $y] # half x and y set hx [expr $env(COLUMNS)/2] set hy [expr $env(LINES)/2] goto $hx-10 $hy-1; puts -nonewline "Please touch the lower" goto $hx-10 $hy-0; puts -nonewline "left target, then the" goto $hx-10 $hy+1; puts -nonewline "upper right target." exec killall -STOP gpm set F [open $dev r+]; # $dev is /dev/touchscreen or /dev/mouse fconfigure $F -buffering none -translation auto # Draw the target goto $x $Y-1; puts -nonewline "|" goto $x-1 $Y; puts -nonewline "-+-" goto $x $Y+1; puts -nonewline "|" # Read coordinates set first [get_position $F] #remove the target, draw the other goto $x $Y-1; puts -nonewline " " goto $x-1 $Y; puts -nonewline " " goto $x $Y+1; puts -nonewline " " goto $X $y-1; puts -nonewline "|" goto $X-1 $y; puts -nonewline "-+-" goto $X $y+1; puts -nonewline "|" # Read coordinates set second [get_position $F] # remove the target goto $X $y-1; puts -nonewline " " goto $X-1 $y; puts -nonewline " " goto $X $y+1; puts -nonewline " " close $F exec killall -CONT gpm goto 0 $env(LINES)-2 # Now save the coordinates set F [open $datafile w] puts $F "# Calibration coordinates for Gunze device" puts $F "$first $second" close $F puts "Done" exit 0 } # X calibration. This is Tk, so we can use the canvas items. # However, there is uncertainty about the absolute X and Y... set wid [winfo screenwidth .] set hei [winfo screenheight .] wm geometry . ${wid}x${hei}+0+0 set x [expr $wid/8] set y [expr $hei/8] set X [expr $wid - $x] set Y [expr $hei - $y] set hx [expr $wid/2] set hy [expr $hei/2] set cwid [expr 2*$x] set chei [expr 2*$y] # The offset variables account for window manager borders etc set xoff1 0 set yoff1 0 set xoff2 0 set yoff2 0 proc recanvas {} { global x y X Y xoff1 xoff2 yoff1 yoff2 catch {.l.c delete line} catch {.r.c delete line} set x1 [expr $x-$xoff1] set y1 [expr $Y-$yoff1] set x2 [expr $X-$xoff2] set y2 [expr $y-$yoff2] .l.c create line [expr $x1-50] $y1 [expr $x1+50] $y1 \ -width 3 -fill red -tag line .l.c create line $x1 [expr $y1-50] $x1 [expr $y1+50] \ -width 3 -fill red -tag line .r.c create line [expr $x2-50] $y2 [expr $x2+50] $y2 \ -width 3 -fill red -tag line .r.c create line $x2 [expr $y2-50] $x2 [expr $y2+50] \ -width 3 -fill red -tag line } pack [frame .l] -side left -expand true -fill both pack [frame .m] -side left -expand true -fill both pack [frame .r] -side left -expand true -fill both pack [canvas .l.c -width $cwid -hei $chei -scrollregion "0 0 $cwid $chei" \ ] -side bottom pack [frame .l.f] -expand true -fill both; #filler pack [canvas .r.c -width $cwid -hei $chei -scrollregion "0 0 $cwid $chei" \ ] -side top pack [frame .r.f] -expand true -fill both; #filler pack [label .m.t -text "Gunze Calibrator" -foreground blue] -pady 40 pack [label .m.l -bd 5 -relief raised] -expand true -fill both pack [label .m.s] -expand true -fill both bind .l.c { set xoff1 [expr %X - %x] set yoff1 [expr %Y - %y] set x1 [expr $x-$xoff1] set y1 [expr $Y-$yoff1] catch {.l.c delete line} .l.c create line [expr $x1-50] $y1 [expr $x1+50] $y1 \ -width 3 -fill red -tag line .l.c create line $x1 [expr $y1-50] $x1 [expr $y1+50] \ -width 3 -fill red -tag line set done1 1 update } bind .r.c { set xoff2 [expr %X - %x] set yoff2 [expr %Y - %y] set x2 [expr $X-$xoff2] set y2 [expr $y-$yoff2] catch {.r.c delete line} .r.c create line [expr $x2-50] $y2 [expr $x2+50] $y2 \ -width 3 -fill red -tag line .r.c create line $x2 [expr $y2-50] $x2 [expr $y2+50] \ -width 3 -fill red -tag line set done2 1 update } set done1 0; set done2 0 update .m.l config -text "Please move the mouse towards\n\ the lower left corner, until a cross\n\ appears (there's no need to click)" vwait done1 update if !$done2 { .m.l config -text "Please move the mouse towards\n\ the upper right corner, until a cross\n\ appears (there's no need to click)" vwait done2 } .m.l config -text "\nWait....\n" after 1000 .m.l config -text "Please touch the lower-left taget\n\ and then the upper-right target\n\ to calibrate the touch screen" update exec killall -STOP gpm set F [open $dev r+]; # $dev is /dev/touchscreen or /dev/mouse fconfigure $F -buffering none -translation auto .m.s configure -text "Calibration started" update # Read coordinates set first [get_position $F] .l.c itemco line -fill green .m.s configure -text "First target ok" update # Read coordinates set second [get_position $F] .r.c itemco line -fill green .m.s configure -text "Second target ok" update close $F exec killall -CONT gpm # Now save the coordinates set F [open $datafile w] puts $F "# Calibration coordinates for Gunze device" puts $F "$first $second" close $F after 1000 .m.s configure -text "" pack [button .m.b -text Ok -command exit] exit 0 gpm-1.20.4/contrib/scripts/make_diff010070000017500001750000000003001076632743400162010ustar00niconico00#!/bin/sh # Date: 3rd of October 2001 # Description: still missing # Author: Nico Schottelius (nicos@pcsystems.de), 3rd of October 2001 # Copying: GPL 2.0 # diff -u --recursive --new-file $@ gpm-1.20.4/contrib/scripts/microtouch-setup010070000017500001750000000140501076632743400176150ustar00niconico00#!/bin/sh # # This program is execute by tclsh if we are in the console, and by wish # otherwise (assuming we are under a graphic environment #the following is a comment for tcl \ if [ $TERM = "linux" ] ; then exec tclsh $0 $* ; fi #the following is another comment for tcl \ exec wish $0 $* ########### That's Tcl... puts "Calibration program for Microtouch screens" set who [exec whoami] if [string compare $who root] { puts stderr "you must be root to be able to run this program" } if ![string compare $env(TERM) linux] { # Text-mode calibration if {![info exists env(COLUMNS)] || ![info exists env(LINES)]} { puts stderr "Please set COLUMNS and LINES in your environment" puts stderr " for example, you can issue" puts stderr " eval `resize`" puts stderr " in your shell before running this program" exit 1 } fconfigure stdout -buffering none exec clear > /dev/tty proc goto {x y} { set x [expr $x] set y [expr $y] puts -nonewline [format "\x1B\[%03i;%03iH" $y $x] } # To use "calibrate extended we must draw targets at 1/8 and 7/8 x-y set x [expr $env(COLUMNS)/8] set y [expr $env(LINES)/8] set X [expr $env(COLUMNS) - $x] set Y [expr $env(LINES) - $y] # half x and y set hx [expr $env(COLUMNS)/2] set hy [expr $env(LINES)/2] goto $hx-10 $hy-1; puts -nonewline "Please touch the lower" goto $hx-10 $hy-0; puts -nonewline "left target, then the" goto $hx-10 $hy+1; puts -nonewline "upper right target." exec killall -STOP gpm set F [open /dev/mouse r+] fconfigure $F -buffering none puts $F "\1CX\r" set ack [gets $F]; # Acknowledge goto $hx-18 $hy+3; puts -nonewline "received acknowledge: please start" goto $x $Y-1; puts -nonewline "|" goto $x-1 $Y; puts -nonewline "-+-" goto $x $Y+1; puts -nonewline "|" set ack [gets $F]; # First calibration point goto $hx-5 $hy+4; puts -nonewline "received acknowledge: please go on" #remove the target, draw the other goto $x $Y-1; puts -nonewline " " goto $x-1 $Y; puts -nonewline " " goto $x $Y+1; puts -nonewline " " goto $X $y-1; puts -nonewline "|" goto $X-1 $y; puts -nonewline "-+-" goto $X $y+1; puts -nonewline "|" set ack [gets $F]; # Next calibration point goto $hx-5 $hy+5; puts -nonewline "received acknowledge: looks ok" goto $X $y-1; puts -nonewline " " goto $X-1 $y; puts -nonewline " " goto $X $y+1; puts -nonewline " " close $F exec killall -CONT gpm goto 0 $env(LINES)-2 puts "Done" exit 0 } # X calibration. This is Tk, so we can use the canvas items. # However, there is uncertainty about the absolute X and Y... set wid [winfo screenwidth .] set hei [winfo screenheight .] wm geometry . ${wid}x${hei}+0+0 set x [expr $wid/8] set y [expr $hei/8] set X [expr $wid - $x] set Y [expr $hei - $y] set hx [expr $wid/2] set hy [expr $hei/2] set cwid [expr 2*$x] set chei [expr 2*$y] # The offset variables account for window manager borders etc set xoff1 0 set yoff1 0 set xoff2 0 set yoff2 0 proc recanvas {} { global x y X Y xoff1 xoff2 yoff1 yoff2 catch {.l.c delete line} catch {.r.c delete line} set x1 [expr $x-$xoff1] set y1 [expr $Y-$yoff1] set x2 [expr $X-$xoff2] set y2 [expr $y-$yoff2] .l.c create line [expr $x1-50] $y1 [expr $x1+50] $y1 \ -width 3 -fill red -tag line .l.c create line $x1 [expr $y1-50] $x1 [expr $y1+50] \ -width 3 -fill red -tag line .r.c create line [expr $x2-50] $y2 [expr $x2+50] $y2 \ -width 3 -fill red -tag line .r.c create line $x2 [expr $y2-50] $x2 [expr $y2+50] \ -width 3 -fill red -tag line } pack [frame .l] -side left -expand true -fill both pack [frame .m] -side left -expand true -fill both pack [frame .r] -side left -expand true -fill both pack [canvas .l.c -width $cwid -hei $chei -scrollregion "0 0 $cwid $chei" \ ] -side bottom pack [frame .l.f] -expand true -fill both; #filler pack [canvas .r.c -width $cwid -hei $chei -scrollregion "0 0 $cwid $chei" \ ] -side top pack [frame .r.f] -expand true -fill both; #filler pack [label .m.t -text "MicroTouch Calibrator" -foreground blue] -pady 40 pack [label .m.l -bd 5 -relief raised] -expand true -fill both pack [label .m.s] -expand true -fill both bind .l.c { set xoff1 [expr %X - %x] set yoff1 [expr %Y - %y] set x1 [expr $x-$xoff1] set y1 [expr $Y-$yoff1] catch {.l.c delete line} .l.c create line [expr $x1-50] $y1 [expr $x1+50] $y1 \ -width 3 -fill red -tag line .l.c create line $x1 [expr $y1-50] $x1 [expr $y1+50] \ -width 3 -fill red -tag line set done1 1 update } bind .r.c { set xoff2 [expr %X - %x] set yoff2 [expr %Y - %y] set x2 [expr $X-$xoff2] set y2 [expr $y-$yoff2] catch {.r.c delete line} .r.c create line [expr $x2-50] $y2 [expr $x2+50] $y2 \ -width 3 -fill red -tag line .r.c create line $x2 [expr $y2-50] $x2 [expr $y2+50] \ -width 3 -fill red -tag line set done2 1 update } set done1 0; set done2 0 update .m.l config -text "Please move the mouse towards\n\ the lower left corner, until a cross\n\ appears (there's no need to click)" vwait done1 update if !$done2 { .m.l config -text "Please move the mouse towards\n\ the upper right corner, until a cross\n\ appears (there's no need to click)" vwait done2 } .m.l config -text "\nWait....\n" after 1000 .m.l config -text "Please touch the lower-left taget\n\ and then the upper-right target\n\ to calibrate the touch screen" update exec killall -STOP gpm set F [open /dev/mouse r+] fconfigure $F -buffering none puts $F "\1CX\r" set ack [gets $F]; # Acknowledge .m.s configure -text "Calibration started" update set ack [gets $F]; # First calibration point .l.c itemco line -fill green .m.s configure -text "First target ok" update set ack [gets $F]; # Next calibration point .r.c itemco line -fill green .m.s configure -text "Second target ok" update close $F exec killall -CONT gpm after 1000 .m.s configure -text "" pack [button .m.b -text Ok -command exit] exit 0 gpm-1.20.4/contrib/scripts/mkinstalldirs010070000017500001750000000013271076632743400171660ustar00niconico00#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.2 2002/05/28 19:13:52 nico Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" 1>&2 mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here gpm-1.20.4/contrib/scripts/replace_2_with_3_spaces010070000017500001750000000005151076632743400207530ustar00niconico00# 8 -> 2*4 --> 4*3 = 12 cat $1 | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp # 6=3*2 --> 3*3=9 cat $1.tmp | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp2 # 4=2*2 --> 2*3=6 cat $1.tmp2 | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp # 2=1*2 --> 1*3=3 cat $1.tmp | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp2 echo done: $1.tmp2 gpm-1.20.4/contrib/scripts/replace_tab_with_3_spaces010070000017500001750000000004451076632743400213620ustar00niconico00# 4 tabs cat $1 | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp # 3 tabs cat $1.tmp | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp2 # 2 tabs cat $1.tmp2 | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp # 1 tab cat $1.tmp | sed 's/^ \([^ ]\)/ \1/g' > $1.tmp2 rm $1.tmp echo done: $1.tmp2 gpm-1.20.4/contrib/scripts/test_gpm010070000017500001750000000013761076632743400161340ustar00niconico00#!/bin/sh # # Date: 18th of September 2001 # Description: Test gpm with this script :) # Author: Nico Schottelius (nicos@pcsystems.de), 3rd of October 2001 # Copying: GPL 2.0 # Version: 0.2 # PREFIX=test- POSTFIX= if [ $# -ne 1 ]; then echo `basename $0`': dir' echo 'Hey, hey guy, what to test ?' exit 1 fi if [ ! -d $1 ]; then echo `basename $0`': dir' echo 'HEY! I need a DIRECTORY! Not something else!' exit 1 fi echo rm -rf $PREFIX`basename $1`$POSTFIX -r rm -rf $PREFIX`basename $1`$POSTFIX -r echo cp $1 $PREFIX`basename $1`$POSTFIX -r cp $1 $PREFIX`basename $1`$POSTFIX -r echo rm -rf mkdir objdir rm -rf objdir/ && mkdir -p objdir && cd objdir echo configure ../$PREFIX`basename $1`$POSTFIX/configure --prefix=/usr/sys echo make make gpm-1.20.4/doc004070000017500001750000000000001101761662200117055ustar00niconico00gpm-1.20.4/doc/Announce010060000017500001750000000041361101736502000134510ustar00niconico00This is to announce gpm-1.0, available by ftp from iride.unipv.it:/pub/gpm/gpm-1.0.tar.gz (my site) and sunsite.unc.edu:/pub/Linux/Incoming/gpm-1.0.tar.gz its final destination on sunsite and mirrors will be /pub/Linux/system/Daemons What's gpm? Gpm ("general purpose mouse") is a user-level daemon in charge of mouse management. It can deliver mouse events to clients on a per-console basis. Its client library eases writing mouse-sensitive application which will run under both the Linux console and xterm. Gpm is part of slackware since November 1994 (gpm-0.90). From 0.98.x onward it supported two mice running concurrently (like you do with "MultiMouse") and it can repeat events to an external fifo (like you do with "mconv"). What's new? What made me switch to 1.0 is the availability of the high-level library, a useful tool for mouse programmers, together with a sample application using that library ("hltest"). "mouse-test" is available as well -- it is a tiny utility meant to help you in detecting what protocol does your mouse speak. Not too smart (it has to run attended), but useful when you change mouse. It works well with serial mice, and is otherwise untested. gpm-root is now capable to draw recursive menus. Console locking is still missing, lazy me. The daemon is able to manage two mice running concurrently, this should be useful for those owning a laptop. t-mouse.el is enhanced, in mode-line and vertical-line management (not by me, actually). The alpha architecture is supported. What about the future, after 1.0? Most likely I'll release bug-fix updates in the near future (I only own one mouse :-). After that I'll consider making gpm a kernel module, implementing a mouse-type independent mouse driver. The device driver will be completely compatible with applications linked with libgpm version 1.0 or later. In this sense 1.0 is incompatible with previous versions: applications linked with older libraries won't run with the kernel module. I never use text consoles. Then, gpm is not important for you (unless you write mouse-sensitive curses-based application). gpm-1.20.4/doc/FAQ010060000017500001750000000210400760216311400123100ustar00niconico00 This file tries to summarize the questions that I've been responding over and over. It is meant to save some time to both you and me :) If your problem with gpm isn't described here, feel free to ask me by Email. -- __ o La forza dei forti sta nel traversare le traversie con occhio sereno _`\<, (Paperino) __( )/( )__ rubini@prosa.it +39-382-529554 1. Installation / Compiling 2. Running problems 3. other questions =========================================================================== 1. Installation / Compiling =========================================================================== Q: Compilation fails with yacc gpm-root.y make: /usr/bin/make: cannot execute binary file make: *** [gpm-root.c] Error 126 A: This is a typical error (I've got several of them reported), though not related to gpm. It looks like you have an old slackware installation, like mine, or another faulty setup. I've been reported that slackware-3 is wrong as well. The 'yacc' executable is a shell script that calls bison, and it lacks the '#!/bin/sh' line (or has it incorrect, missing the '!'). I don't remember the details, but while it runs under your shell, it can't be executed under make. I looked in the binfmt sources in the kernel, and /bin/sh doesn't appear explicitly, so you must fix the first line in the 'yacc' script, and everything should go fine. Note however that the server has already been compiles. Only the gpm-root client, written with yacc, is affected by this problem. =========================================================================== 2. Running problems =========================================================================== Q: My serial mouse works in X with ms protocol, but behaves erratically with gpm on the text console, and I get involuntary pastes. A: Many ms protocol mice equipped with three buttons use an extension to the protocol, which consists in repeating events (thus with no effect under the normal protocol) to signal a change in the middle button. Unfortunately, some old true-ms protocol mice do repeat events, thus triggering the middle-button in gpm. If you're running your mouse with ``-t ms'', you'd better try ``-t bare'', which is the unadorned ms protocol of the old days. My choice to use the third-button extension as the default, was taken because a true ms protocol doesn't repeat event notification, and because many three button mice feature the extension. --------------------------------------------------------------------------- Q: I have a serial mouse. It works fine except that when I try to drag the mouse with the middle button pressed, gpm assumes that the middle button has been released. Dragging with the other buttons works just fine. A: You are probably running your mouse with ``-t ms''. In this mode dragging with the middle button has been deliberately disabled in order to prevent problems with faulty mice that fail to report middle-button events during mouse motion. Try using ``-t ms+'' or ``-t ms+lr'' instead. --------------------------------------------------------------------------- Q: My mouse gets into a state where it thinks the middle button is up when it's down and vice versa. A: Your mouse uses an extension to the m$ protocol in order to report the middle button. It sends empty events (i.e., no-motion & no-button-change) in order to report a change in the status of the middle button. Unfortunately many devices that report middle-button events in this way often fail miserably to report them correctly during mouse motion. Since the protocol does not distinguish between the button going up and the button going down it can easily get out of step with reality. There are two solutions: either use ``-t ms'', which disallows dragging with the middle button, so you can get back to normal simply by moving the mouse without any buttons pressed; or (probably better) use ``-t ms+lr'', which allows you to reset the state of the middle button by pressing the other two buttons together. (If you want you can also deliberately get gpm out of step with reality by pressing the left and right buttons while holding the middle button!) Note that there are many more faulty mice in the world than non-faulty ones so you will probably will have to use ``-t ms+lr'' rather than ``-t ms+''. Note also that most 3-button mice that use the microsoft protocol can be made to use the MouseSystems protocol instead. You might want to read about this in the ``3 Button Serial Mouse mini-HOWTO''. --------------------------------------------------------------------------- Q: My mouse doesn't sense the middle button in X, while it works with gpm. A: Gpm uses a different decoder (see the previous two answers). You can use the ``-R'' option to repeat mouse data to X (look at the man page). --------------------------------------------------------------------------- Q: I have a busmouse, and I have the single-open problem. Is there any way around it? A: Try the -R option of gpm (look at the man page) --------------------------------------------------------------------------- Q: I run "-t ms", and I get double-paste when I press the middle button. Is there any workaround? A: Try "-t mman" instead. --------------------------------------------------------------------------- Q: I have one of the new devices of old dear Bill, and gpm doesn't work any more. What can I do? A: Bill chose to use its own Plug-and-Pray specification, which finally managed to break what worked painlessly for ages. The decoder for any gpm up to 1.12 (and also any X version being used at the time) is unable to deal with the new devices, which claim to be designed to work with older drivers. Try to use "-t pnp" instead of "-t ms" and see if it works with this gpm version. Actually, this version might even work with "-t ms" or "-t bare", but I'm not sure about it. If the version of X you run has problems, while gpm now works, try passing the "-R" option to gpm (see the man page). Note that "-t pnp" is strongly discouraged, as any time the serial port is opened (for example when switching from X to text mode if "-R" is not active) it will take several seconds to be initialized -- a design misfeature of pnp. If either "-t ms" or "-t bare" work use them instead. If you are in the software field, you can enjoy the inaccuracies of the specs and design bugs directly from the originators: http://www.microsoft.com/hwdev/download/pnpcom.exe. You'll find the following, and more: - no support for real multitasking (the mouse driver must be able to keep hold of processor time for at least 1 second). - no pnp vendor will be able to support three buttons any more (no more mouse protocols, all mice must behave the same). - similary, only 1200 baud devices (any serial device) are supported, because the initialization string of pnp devices only tells the vendor and release, with no information about required port configuration. - people with UPS will have great troubles with ms software because the pnp probing sequence plays with DTR, and w95 probes all serial ports. This funny idea might turn off the UPS connected with your computer just after booting w95. Don't despair. They will manage to make worse designs later on. --------------------------------------------------------------------------- Q: I have an old 386 computer around here and gpm is _really_ slow. Is there any way I can make it faster ? A: Go into src/headers/gpmCfg.h and look for DEF_CLUSTER. Change its values from 0 to 10. --------------------------------------------------------------------------- Q: gpm.conf is not accepted / does not work, but gpm works from command line. A: gpm.conf is not from gpm itself. Please contact your distrubtion support to clearify whats wrong. =========================================================================== 3. other questions =========================================================================== Q: I am gonna buy computer X, do I have any chance getting gpm running on it? A: a) If it does not work, you could at least try to port it ;) b) As report by a friend, gpm currently runs on Linux on - i386 - Alpha - ARM - PA-RISC - ia64 (Itanium) - PPC - m68k - MIPS - SPARC It's possible that you need some patches for some architecture. gpm-1.20.4/doc/HACK_GPM010060000017500001750000000014161101736502000131120ustar00niconico00Hello! Nice that you read this document, looks like someone wants to improve gpm again. I assume you have a good idea or you did some good work you want to see in the main gpm tree. To make life easy for you and me, please follow the instructions: * if you send a patch, explain why it's needed * if possible, please patch against latest cvs sources (see README) * if the patch introduces generally new things, explain how it works * use 3 spaces tabs in the source files (if you use tabs, look into contrib/scripts/replace_tab_with_3_spaces) * if the patch is not big, use one file * if you have to use more files, tar them * include directory structure (src/mice.c and not mice.c) * everything fine ? So send the patch. Thanks for your help, Nico gpm-1.20.4/doc/Makefile.in010060000017500001750000000121741101736502000140260ustar00niconico00# -*-makefile-*- (gpm/doc) # # Copyright (C) 1994 Alessandro Rubini # Copyright (C) 1998 Ian Zimmerman # Copyright (C) 2001 Nico Schottelius # # # Do you ever got headache from reading Makefiles ? I will help you and # me to understand this Makefile: # # The main file is doc.gpm (which is generated by configure from doc.gpm.in). # # doc.gpm is not 'real' texinfo, real texinfo is generated by infofilter # to gpm.texinfo. # # gpm.texinfo is the source of all other formats. # # info is generated by makeinfo (I make that for you). # # man pages are generated with the help of manpager. # # dvi is generated from texinfo with a small block in this Makefile. # # ps is generated from dvi source. # SHELL = /bin/sh srcdir = @srcdir@ top_builddir = .. include $(top_builddir)/Makefile.include MANPAGES = gpm.8 mev.1 gpm-root.1 gpm-types.7 mouse-test.1 all: $(srcdir)/gpm.info gpm.man # HTML (texi2html) %.html: %.texinfo if [ $(TEXI2HTML) != "no" ]; then $(TEXI2HTML) -monolithic $< ;fi # TEXINFO (-) %.texinfo: doc.% Makefile @rm -f $@ # correct here ? $(SED) -f $(srcdir)/infofilter $< > $@ chmod 400 $@ # PS (dvips) %.ps: %.dvi if [ $(DVIPS) != "no" ]; then $(DVIPS) -f $< > $@; fi # INFO (makeinfo) %.info: %.texinfo if [ "$(MAKEINFO)" != "no" ]; then $(MAKEINFO) --no-split $< -o $@; fi # TXT (-) %.txt: %.info $(AWK) -f $(srcdir)/mktxt $< > $@ # MAN (-) $(MANPAGES): gpm.man gpm.man: doc.gpm $(srcdir)/manpager $(AWK) -f $(srcdir)/manpager doc.gpm for i in gpm-root.1 gpm-types.7 gpm.8 mev.1 mouse-test.1; do \ expand $$i | sed s/^'[ ]*'//g > $$i.new; \ mv $$i.new $$i; \ done; touch gpm.man # DVI # This rule is somewhat a rewrite of texi2dvi. I like make more than sh :-) %.dvi: %.texinfo # create a spurious index file to please silly sh (bash will work anyway) # is this still needed for someone ? touch $*.oo # get the index list, but only if tex is installed # check the file list, the file and if needed run TeX again # # can somebody tell me in a very short way what format dvi is and why we # cannot generate ps directly ? if [ -n "`ls $*.?? $*.aux 2>/dev/null`" -a "$(TEX)" != "no" -a \ "$(TEXINDEX)" != "no" ]; then \ for i in `ls $*.?? $*.aux 2>/dev/null`; do cp $$i $$i~; done; \ $(TEX) $< \ old="`ls $*.??~ $*.aux~ 2>/dev/null | $(SED) 's/~//g'`"; \ new="`ls $*.?? $*.aux 2>/dev/null`"; \ need="n"; \ if test "$$old" != "$$new"; then need="y"; \ else \ for i in `ls $*.?? $*.aux 2>/dev/null`; do \ cmp -s $$i $$i~; if test $$? -ne 0; then need="y" break; fi; \ done; \ fi; \ if test "$$need" = "y"; then \ $(TEXINDEX) $*.?? && $(TEX) $<; \ fi; \ fi # Main portion all: $(srcdir)/gpm.info $(MANPAGES) # why gpmdoc.ps and gpm.ps?? # there is no gpm.ps in my tree and no rule to generate gpm.ps. gpmdoc.ps: gpm.ps -$(CP) $< $@ # install & uninstall installdirs: $(MKDIR) $(man1dir) $(man7dir) $(man8dir) $(infodir) install: all installdirs $(INSTALL_DATA) -m 644 mev.1 $(man1dir) $(INSTALL_DATA) -m 644 mouse-test.1 $(man1dir) $(INSTALL_DATA) -m 644 gpm-root.1 $(man1dir) $(INSTALL_DATA) -m 644 gpm-types.7 $(man7dir) $(INSTALL_DATA) -m 644 gpm.8 $(man8dir) $(INSTALL_DATA) -m 644 $(srcdir)/gpm.info $(infodir) # Use install-info if available -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ if [ -f $(infodir)/dir ] ; then \ install-info --dir-file=$(infodir)/dir $(infodir)/gpm.info; \ fi; \ fi #itz Sat Dec 26 23:21:05 PST 1998 #i keep all my infopages compressed and i'm tired to do it by #hand, so check if there are any compressed pages and do this #one too -ls $(infodir)/*[-.]info.gz >/dev/null 2>&1 \ && gzip -f $(infodir)/gpm.info # Hmm.... shouldn't man pages be compressed too? # maybe they should, but at least at my system they are not. # This potentially leaves around cached manpages, # e.g. /var/cache/man/cat1/mev.1.gz. Deleting these is not our job, # but the job of the man program on the host. uninstall: cd $(man1dir) && rm -f mev.1 mouse-test.1 gpm-root.1 rm -f $(man7dir)/gpm-types.7 $(man8dir)/gpm.8 rm -f $(infodir)/gpm.info $(infodir)/gpm.info.gz -if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ if [ -f $(infodir)/dir ] ; then \ install-info --dir-file=$(infodir)/dir \ --remove $(infodir)/gpm.info; \ fi; \ fi # configure & unconfigure Makefile: $(top_builddir)/config.status $(srcdir)/Makefile.in cd $(top_builddir) && $(SHELL) config.status ## CLEANUP section # normal cleanup clean: rm -f gpmdoc.ps gpmdoc.txt $(MANPAGES) *~ rm -f gpm.?? gpm.??? rm -f gpm.texinfo # for creating distribution distclean: clean rm -f Makefile doc.gpm # to even remove things we leave for end-users allclean: distclean rm -f gpm.info # Maintainer portion, use at your own risk # ignore this: TAGS: ## DIST section # when we cleaned it, we can securely copy us. dist: distclean # unneeded now: using pax + -s option and create tars in .. #$(CP) -r $(srcdir) $(top_builddir)/gpm-$(release)/ .INTERMEDIATE: gpm.ps .SECONDARY: %.ps %.texinfo %.dvi gs: gpm.ps gs -sDEVICE=linux -r640x480x2 $< gv: gpm.ps ghostview gpm.ps -magstep -1 -a4 gpm-1.20.4/doc/README.1.20.2010060000017500001750000000041021075432562600133670ustar00niconico00 Dear reader, you are reading this document, because you saw that there is a new release of gpm available, gpm 1.20.2. Unfortunately this release is broken, but that's not a big problem. gpm is broken for some time and I did not spent any time to the project for about two years. Some weeks ago, I was contacted by someone asking me to write a very small feature for gpm (a small client program, included in this release). I answered the person that I do not have the time to code that part, but if he really insists that I should write that code, he should think about sponsoring me [0]. Some days later I recieved an email that he wanted to sponsor me. I was a little bit surprised, because it was the first person really considering my sponsoring plans. So I coded that small program and had some views in the old code of gpm. There's so much information in it, so many hacks, so many dirty tricks and there are still many people using it. So I considered to try to spent more time to gpm, perhaps even creating a more clean (and better maintainable) version of it. But I _am_ actually a pretty busy person, working almost all time, if not doing sports (just about 6 hours a week) or sleeping. So I thought, perhaps you can help me to get more time for coding FOSS [1] in general or gpm in specific: My idea is, that if you consider sponsoring my work, I can begin to work less "traditionally" and also finance my second study in computer science, which I will begin in autumn 2008, if I have the money to do it (living in Switzerland is not that cheap). I am looking forward to get any feedback from you about this idea at nico-gpm-sponsoring (at) schottelius.org. Thanks for reading, Nico Schottelius, 12. May 2007 P.S.: GPM is alive! [0]: Sponsoring information: http://nico.schottelius.org/about/support [1]: FOSS: http://nico.schottelius.org/documentations/foss/the-term-foss/ gpm-1.20.4/doc/README.etouch010060000017500001750000000025371101736502000141310ustar00niconico00 This file tells how to use gpm and X with a Elotouch screen with serial interface at 9600 Baud No parity. CALIBRATION ----------- Calibration is done in console mode using the program "elocalib" available from http://www.dobit.com/emblin/pub/elocalib.tgz See also elocalib --help To start calibration at console 128x48, for screen 1024x786 > elocalib /dev/ttyS0 -c128 -r48 -w1024 -h768 Touch the upper-left corner and write down the coordinates Xmin, Ymin Touch the bottom-right corner and write down the coordinates Xmax, Ymax Update the file gpm-calibration with this coordinates > cat /usr/local/etc/gpm-calibration # EloTouch calibration coordinates Xmin Ymin Xmax Ymax 4010 80 80 4010 GPM OPERATION ------------- > gpm -m /dev/ttyS0 -t etouch -o clickontouch -Rsumma X OPERATION ----------- In order to use the touchscreen in X, you should install in your system the "gpmsumma" module available from http://www.annet.pl/~anowak/mtouch/gpmsumma_drv.o or from http://www.dobit.com/emblin/pub/gpm_etouch.tgz /usr/lib/X11/modules/input/gpmsumma_drv.o Then add the following sections to your XF86config: Section "InputDevice" Identifier "EloTouch" Driver "gpmsumma" Option "Device" "/dev/gpmdata" Option "SendCoreEvents" "On" EndSection Section "ServerLayout" InputDevice "EloTouch" "SendCoreEvents" ... EndSection gpm-1.20.4/doc/README.gunze010060000017500001750000000163671101736502000140000ustar00niconico00This file tells how to use gpm and X with a Gunze touchscreen. It is pretty similar to README.microtouch, and I plan to unify them as soon as I port the two implementation to offer a consistent look and feel. Currently the Gunze implementation is more configurable but has a worse calibration management (it must write to /etc/gpm-calibration). DEVICE CONFIGURATION -------------------- The gpm decoder requires the Gunze device to be in Gunze Mode (not in Elo Emulation Mode). The supported serial speeds are 9600 and 19200 baud, the latter being the default speed (in other words, to decode data at 9600 you must use the "-b 9600" option of gpm; no "-b" option selects 19200 baud). Currently, the only device supported is the 10-bit one. USER INTERFACE -------------- The decoder currently implemented in gpm is quite simple: it only supports mouse motion and button-1 events. This will soon change: I plan to implement corner-taps for button-2 and button-3, as well as a different "mode" where motion is not supported and any touch event is converted to a button-1 click. In the default (and only) mode, when a user touches the screen, the decoder generates mouse motion events. Tapping on the screen generates button-press (as well as drag and release) events. A "tap" is a finger-down (or pen-down) event generated quickly after a finger-up. A touch event is considered a "tap" if the lapse since the last finger-up is less than or equal to the double-click interval (the default is 250ms, and the value is chosen by specifying the "-i" option of gpm). This means that you'll usually move the pointer to the desired position and then tap on it. Double-and triple clicks are easily generated by repeated tapping. Since tapping is usually accompanied by a small movement, the decoder will use the coordinates of the finger-up event for the button-press. Further dragging will be relative to the tapping position (i.e., the finger-up position). Moreover, the last coordinate pair received on finger-up is discarded, because it usually is slightly offset (due to the non-negligible area of the fingertip). My own experience with the Gunze device, revealed that sometimes the finger bounces, generating very fast finger-up/finger-down pairs. The gpm decoder, therefore, ignores any quick succession of finger-up and finger-down events. The default is to ignore any release-press pair if the time lapse is less than 100ms (note, however, that this time lapse is configurable). GPM OPERATION ------------- In order to run the touchscreen with gpm, you need to update the /dev/mouse symbolic link to point to the right serial port; then invoke gpm with a command line like gpm -t gunze If /dev/mouse is not updated to point to the touchscreen serial port, use gpm -t gunze -m /dev/ttyS0 or an equivalent command. Unfortunately, there is currently no way to paste text, but I'll implement corner-tapping to achieve that. Gunze-specific Configuration ---------------------------- It is possible to specify device-specific options to gpm in order to customize the behaviour of the Gunze decoder. The options are passed as argument to the "-o" command line (reminiscent of the mount command). The following options are recognized: smooth= The decoder smooths mouse movements, to prevent the jumpy behaviour that usually results from finger movement. The default smoothin factor is 9, you can specify a different value if you wish: "gpm -t gunze -o smooth=3" gives faster (and more jumpy) motion, while "gpm -t gunze -o smooth=30" gives a very slow feeling.x debounce= The option is used to specify the minimum time lapse, in milliseconds between finger-up and finger-down events. Smaller time intervals are discarded to achieve debouncing. Note that the maximum time lapse is the one used for double-click detection, and is specified with the "-i" command-line option, common to every other mouse type. Please note that more than one option can be specified, by using the comma ``,'' as a separator. For example: gpm -t gunze -o smooth=5,debounce=150 Calibration ----------- To calibrate the touchscreen, use the program "gunze-setup" found in the source tree of gpm. The gpm daemon must already be running in order for the program to work flawlessly, as the program stops and restarts gpm internally (it depends on gpm for correct serial port initialization). The calibration program uses either /dev/touchscreen (if available) or /dev/mouse (otherwise) as the serial port to communicate with the touchscreen. You'll need therefore to create a symlink for one of those names before running "gunze-setup". After calibration, the calibration values can be found in the file /etc/gpm-calibration, but gpm must be restarted in order to be able to read them. This can be construed as a bug, and avoiding to stop the program is in my TODO list. X OPERATION ----------- In order to use the touchscreen in X, you should install in your system the "Summa" module, as modified by Frank Holtz (the driver is available from http://www.hof-berlin.de/tablet/tablet.html, as well as in the gpm CVS tree and from gpm-1.18.2 in the gpm release as well). The compiled module (xf86Summa.so) should go in the module directory of your X server, usually /usr/X11/lib/modules, when it sits in the right place, a proper XF86Config will arrange for its loading. Gpm must run in repeater mode, with a command line like: gpm -t gunze -Rsumma , which instructs gpm to repeat packets according to the Summa protocol. Then, you need to add the following sections to your XF86config: Section "module" Load "xf86Summa.so" EndSection Section "Xinput" Subsection "SummaSketch" Port "/dev/gpmdata" DeviceName "touchscreen" Mode Absolute AlwaysCore EndSubSection EndSection Moreover, you should disable the "Pointer" section. I used a trick like this one: Section "Pointer" Protocol "MouseSystems" Device "/dev/fifo" EndSection Where /dev/fifo is just a plain unused fifo ("mknod /dev/fifo p") If, when calling ``startx'', it won't work with a message of ``Invalid Subsection Name'', please check the previous error lines, as they explain what is wrong. They usually look like: (--) no ModulePath specified using default: /usr/X11R6/lib/modules xf86Summa.so: Unknown error loading module It is pretty clear, if your are careful in reading the messages (I am not that careful, and lose half an hour in trying to figure out what was wrong). Calibration ----------- To calibrate the touchscreen, use the program "gunze-setup" found in the source tree of gpm (yes, it is the same program used for the text mode). The gpm daemon must already be running in order for the program to work flawlessly, as the program stops and restarts gpm internally (it depends on gpm for correct serial port initialization). The calibration program uses either /dev/touchscreen (if available) or /dev/mouse (otherwise) as the serial port to communicate with the touchscreen. You'll need therefore to create a symlink for one of those names before running "gunze-setup". gpm-1.20.4/doc/README.microtouch010060000017500001750000000065221101736502000150140ustar00niconico00 This file tells how to use gpm and X with a touch screen (this is being written as an addition to gpm 1.17.5 and currently the only supported touchscreen is the MicroTouch). USER INTERFACE -------------- The decoder currently implemented in gpm is quite simple: it only supports mouse motion and button-1 events. When a user touches the screen, the decoder generates mouse motion events. Tapping on the screen generates button-press (as well as drag and release) events. A "tap" is a finger-down event generated quickly after a finger-up (half a secon at most). This means that you'll usually move the pointer to the desired position and then tap on it. Double-and triple clicks are easily generated by repeated tapping. Since tapping is usually accompanied by a small movement, the decoder will use the coordinates of the finger-up event for the button-press. Further dragging will be relative to the tapping position (i.e., the finger-up position). Moreover, the last coordinate pair received on finger-up is discarded, because it usually is slightly offset (due to the non-negligible area of the fingertip) GPM OPERATION ------------- In order to run the touchscreen with gpm, you need to update the /dev/mouse symbolic link to point to the right serial port; then invoke gpm with a command line like gpm -t mtouch Unfortunately, there is currently no way to paste text. I think some modifier key should be eligible to this role but this would mean an in-depth modification to gpm. We have to discuss about it to make the right choice. Calibration ----------- To calibrate the touchscreen, use the program "microtouch-setup" found in the source tree of gpm. The gpm daemon must already be running in order for the program to work flawlessly, as the program stops and restarts gpm internally (it depends on gpm for correct serial port initialization). "microtouch-setup" uses /dev/mouse to access the serial port, so /dev/mouse should point to a "ttyS" device. X OPERATION ----------- In order to use the touchscreen in X, you should install in your system the "Summa" module, as modified by Frank Holtz (the driver is available from http://www.hof-berlin.de/tablet/tablet.html). Gpm must run in repeater mode, with a command line like: gpm -t mtouch -Rsumma , which instructs gpm to repeat packets according to the Summa protocol. Then, you need to add the following sections to your XF86config: Section "module" Load "xf86Summa.so" EndSection Section "Xinput" Subsection "SummaSketch" Port "/dev/gpmdata" DeviceName "touchscreen" Mode Absolute AlwaysCore EndSubSection EndSection Moreover, you should disable the "Pointer" section. I used a trick like this one: Section "Pointer" Protocol "MouseSystems" Device "/dev/fifo" EndSection Where /dev/fifo is just a plain unused fifo ("mknod /dev/fifo p") Calibration ----------- To calibrate the touchscreen, use the program "microtouch-setup" found in the source tree of gpm (yes, it is the same program used for the text mode). The gpm daemon must already be running in order for the program to work flawlessly, as the program stops and restarts gpm internally (it depends on gpm for correct serial port initialization). "microtouch-setup" uses /dev/mouse to access the serial port, so /dev/mouse should point to a "ttyS" device. gpm-1.20.4/doc/README.synaptics010060000017500001750000000370371101736502000146620ustar00niconico00This README describes the support for the Synaptics ToucPads. In addition to translating finger motion into mouse motion and supporting the buttons, this support currently has several features: - a "tap" on the TouchPad causes a left mouse click - a "tap" followed quickly by a finger motion causes a left button drag type action. - a "tap" in one of the corners causes an action the default configuration is upper right causes middle mouse click and lower right causes right mouse click - more pressure on the touch pad speeds the motion of the cursor - a "tap" with a motion component (default > 2mm) initiates a toss and catch sequence. This is terminated by a finger touch on the pad (the toss also ends after 1 sec since that is the idle timeout period for the touchpad). - if the finger moves close to an edge then the mouse motion will be continued in that direction so that you don't need to pick up your finger and start moving again. This continued motion is pressure sensitive (more pressure is faster motion). - Scrolling by putting the finger at the edge, an dmoving up or down. - Recognition of Stick. - Multi fingers are recognized to to stop erradic motions, and to change which mouse button is reported. - Palm detection so the palm does not move the mouse. These features can be enabled/disabled and many of them have time and speed parameters which can be adjusted to the taste of the user. These parameters can be provided in the "/usr/etc/gpm-syn.conf" file (or /usr/local/etc/gpm-syn.conf, or /etc/gpm-syn.conf, according to how you ran configure). Each line in this file has the following syntax: [param-name] Where param-name is one of the following param-name value description ====================== ===== =========== /* feature enable configuration values all default to 1 (TRUE) */ /* flags are true if the first char of the value is in the string "YyTt1" */ /* flags are false if the first char of the value is in the string "NnFf0" */ edge_motion_enabled flag is edge motion enabled edge_motion_speed_enabled flag does pressure control speed of edge motion corner_taps_enabled flag are corner taps enabled tap_gesture_enabled flag are taps gesture enabled pressure_speed_enabled flag does pressure control speed in non edges tossing_enabled flag is toss/catch enabled does_toss_use_static_speed flag is toss/catch speed based on toss dist /* pressure induced speed related configuration constants */ low_pressure 0-255 the lowest pressure which triggers speed processing. If this is less than speed_up_pressure then the motion is slowed down. When the pad pressure is between these values. The default value is 60 pressure is described by Synaptics as follows: 0 : no finger contact 10 : hovering NEAR pad surface 30 : very light finger contact 80 : normal finger contact 110: very heavy finger contact 200: finger lying flat on surface 255: whole palm on pad surface speed_up_pressure 0-255 the lowest pressure at which speed is increased. If the pad pressure is less than this value then the motion will bs slowed down. If greater, then the motion will be sped up. The default value is 60 pressure_factor float the multiplicative factor applied to the pressure difference to be applied to the speed. This is used as follows: 1 + pf * (press - speed_up) The difference in pressure between the measured pressure and the speed up pressure is multiplied by this value which is then applied to the nominal mouse speed. The default value is 0.05 standard_speed_factor float the standard speed factor used to scale touchpad deltas into mouse deltas. The touchpads have resolutions in the 1000 points/inch range (much more detail than a mouse). The default value is 0.08 /* toss/catch related constants */ min_toss_time msec This number specifies the minimum finger contact time which is to be considered a toss (in milliseconds). The default value is 100 (0.1 sec) max_toss_time msec This number specifies the maximum finger contact time which is to be considered a toss (in milliseconds). The default value is 300 (0.3 sec) prevent_toss_time msec This number specifies the minimum finger release time after a toss is terminated before reacting to taps (in milliseconds). This prevents the "catch" tap from causing a mouse button tap. The default value is 300 (0.3 sec) min_toss_dist mm This number specifies the minimum finger move distance which is to be considered a toss (in millieters). The default value is 2 static_toss_speed int If does_toss_use_static_speed is 1 (TRUE) then this specifies the speed to be used. The default value is 70 toss_speed_factor float This is a multiplier against the toss distance in touchpad units used to scale the distance to a speed. The default value is 0.5 /* edge motion related configuration constants */ edge_speed int This is the nominal speed for use when in the edge regions. The defalt value is 20 /* corner tap actions */ upper_left_action int This is the mouse button which will be activated on a tap in the upper left corner of the touchpad. 0: None 1: Left 2: Middle 3: Right 4: Fourth 5: Up 6: Down 7: Toggle pad on/off The default value is 0 (none) upper_right_action int This is the mouse button which will be activated on a tap in the upper right corner of the touchpad. The default value is 2 (middle) lower_left_action int This is the mouse button which will be activated on a tap in the lower left corner of the touchpad. The default value is 0 (none) lower_right_action int This is the mouse button which will be activated on a tap in the lower right corner of the touchpad. The default value is 3 (right) /* wmode parameters */ wmode_enabled flag This is to enable the wmode of Synaptics touchpad which supports more configurable options and buttons. The default value is 1 (enabled) drag_lock_enabled flag Whether to enable drag lock, that is, do not break a drag until next tap even when the finger is off the pad. The default value is 0 (disable) finger_threshold int The threshold of the pressure reading to consider the finger is on the pad. The default value is 30 tap_lower_limit msec The lower bound of finger contact time to be considerred a tap. The default value is 5 (0.005 sec) tap_upper_limit msec The upper bound of finger contact time to be considerred a tap. The default value is 200 (0.2 sec) tap_range int The maximum displacement of finger contact to be considered a tap. The default value is 100 (0.1 sec) tap_interval msec The time length of button press generated when a tap is recognized, which is also the time within which further finger contact will be consider a drag (or multiple click, if it's also a tap). The default value is 200 (0.2 sec) pads_tap_interval int Equivalent to tap_interval, but the pads interval. Used when wmode is disabled and multi finger is enabled. The default value is 8. multiple_tap_delay msec Break length between button presses when generating multiple click. The default value is 30 (0.03 sec) palm_detect_enabled flag This enables the palm detection in the pad so a palm does no move the mouse. Actually this is the width of the finger on the pad. The default value is 1 (enabled) palm_detect_level int At what palm detection level should the pad be ignored? Value should be between 0-11, where 11 is a full palm at pad, and 0 is a normal finger size. Default value is 12 (meaning disabled). multi_finger_tap_enable flag This enables the ability to use 2 and 3 fingers during a tap, to press right and middle button respectively. The detection is not 100% perfect. If the pad supports finger detection, its values are used. The default value is 1 (enabled) multi_finger_stop_enabled flag When more than one finger is one the pad, an average value (weighted with the the pressure) between the fingers is reported. This gives erradic movements when adding or removing fingers, or when just accidental touches the pad. This option stops the mouse movement for a given time, to let the movement settle. The default value is 1 (enabled). multi_finger_stop_delay Int Number of packets that should be ignored when adding or removing an additional finger to stop erradic movements. The default value is 8. /* Additional options */ touch_pad_enabled flag This will stop the interpreting of the touchpad (thought not the stick if any). As such not that usefull, but in a combination with a corner toggle on/off, this may come useful. A corner tap is interpretated if it turns the pad on. The default value is 1 (enabled). stick_enabled flag Some touchpads have an additional stick which uses the same port. This is an attempt to enable the use while using the touchpad. The default value is 1 (enabled). scrolling_enabled flag This enables the scrolling gesture, which emulates the wheel on a wheel mouse. Putting the finger on the edge and moving it up and down, is eqvivalent with rolling the wheel up and down. The default value is 1 (enabled). scrolling_edge int This decides which edge(s) starts the scrolling gesture. Legal values are (added if more than one edge): 1: Left edge 2: Right edge 4: Top edge 5: Bottom edge The default value is 2 (Right edge). auto_scrolling_enabled flag This enables whether to keep scrolling if the finger moves to the top or bottom edge. The default value is 1 (enabled). gpm-1.20.4/doc/README.twiddler010060000017500001750000000125231101736502000144540ustar00niconico00 NEW FEATURE IN BETA-2 OVER BETA-1 (ONLY TWIDDLER CHANGES) Fixed typo in twiddler.c which prevented compiling Fixed segfault when using more than one thumb-key at a time Should fix problem when non-ascii chars appear in the cfg file Changed algorithm for dhouble-click Added shift etc. support Added VT change and Execution of commands DETAILED DESCRIPTION OF GPM SUPPORT FOR THE TWIDDLER KEYBOARD Gpm-1.14 and later support the twiddler keyboard, by HandyKey Corp. (the keyboard is described at www.handykey.com). This document describes the current status of the gpm decoder. Mouse support ============= Motion ------ The mouse functionality of the keyboard is supported by gpm. Three decoders are currently available: - a "static" decoder, which turns twiddler position to mouse displacement. The decoder locks the mouse when the ``mouse'' button is pressed and any further motion moves the cursor, as long as ``mouse'' is kept down. This is compiled if "-DTWIDDLER_STATIC" (for example by invoking ``make CC="gcc -DTWIDDLER_STATIC"''. - a "ballistic" decoder, which turns twiddler position to mouse speed. If the keyboard is hole vertical the mouse cursor won't be moved. To compile this decoder -DTWIDDLER_BALLISTIC must be used. - a "mixed" decoder, that behaves like the static one when the device is near-to-vertical and like the ballistic one for large inclination. This is compiled by default Problems ........ The current decoder doesn't allow tuning the parameters at run time. I plan to implement twiddler chords to change the resolution, acceleration and threshold of the mixed decoder, and the other ones as well. If different people routinely use different decoders, I'll make it possible to choose which decoder to run. I will also implement the chord to switch up/down. Buttons ------- The first (left) mouse button is bound to the right key ("a", green, R000). The other buttons are bound to M000 ("e", blue) and L000 ("SP", red). This is consistent with the twiddler manual. To ease using the fingers like with conventional mice, keys 0R00 and 00R0 (i.e., "b" and "c") are bound to the middle and right button as well. Since someone prefers to reverse the order of the keys (i.e., L000 is the left mouse button), they will use "-B 321" on the gpm command line. To ease them, 0L00 is bound to the middle button, and 00L0 is bound to the *left* button. Thus, with "-B 321" it will be the right button. In summary: Left button (B1): R000 R000 Middle button (B2): M000 0R00 Right button (B3): L000 00R0 For people using "-B 321" Left button (B1): L000 L000 Middle button (B2): M000 0L00 Right button (B3): R000 00L0 Problems ........ None, by now. Keyboard support ================ Configuration file ------------------ The keyboard map is stored in run-time tables within gpm. There is no precompiled table, so a configuration file is needed. I chose not to precompile values because that would mean to pre-parse a configurazion file, and provide documentation as well. Using a compulsory configuration file reliefs my workload :-) The file "gpm-twiddler.conf" that appears in the gpm configuration includes the default keyboard map, and can be used right away. If the file is not in place, gpm will complain about its absence. By default the file must live in /usr/etc (or /usr/local/etc, or whatever you gave as a prefix to ./configure). The behaviour is similar for different installation prefixes. The file is not installed by "make install". If the file is missing, gpm will exit producing a message like this: ./gpm: /usr/etc/gpm-twiddler.conf: No such file or directory The distributed configuration file includes its own documentation. If you want to add keys to the default file, you can avoid editing it by writing a "gpm-twiddler.user" file and putting it in the same directory as gpm-twiddler.conf. Gpm will read both files, in sequence, but won't complain if gpm-twiddler.user doesn't exist. Gpm will print an error message for any incorrect line in any of the configuration files: error messages include the file name and the line number where the error appears, as well as a description of the type of error. If any error is encountered, gpm will exit. The daemon will print a warning message for any redefined key, but will use the new definition. Therefore, if you want to redefine keys in your user file, just redirect standard error to /dev/null after checking you are willing to override default definitions. General information ------------------- A key press is reported when any key of the chord is released: this avoides reporting false keys when a multi-key chord is being composed. The twiddler driver in gpm implements auto-repeat. Auto-repeat is invoked by double-clicking a chord and keeping it pressed. If the double-click takes more than .3 seconds, it won't be considered a double-click; auto-repeat will start .5 seconds after the double-click. Gpm unblanks the screen when keys are composed using the twiddler. Problems -------- Gpm doesn't currently report keypresses to the X server. You should use other twiddler drivers for Linux if you need this functionality. For example get the driver by Jeff Levine (there is a link to the driver in www.handykey.com). I would like to thank HandyKey Corp. for sending a twiddler keyboard to me and Torben Fjerdingstad for his help in testing out the driver. gpm-1.20.4/doc/doc.gpm.in010060000017500001750000002554211100257401600136450ustar00niconico00\input texinfo @c -*-texinfo-*- % % doc.gpm - main file for the documentation % % Copyright 1994,1995,1998 rubini@linux.it (Alessandro Rubini) % Copyright (C) 1998 Ian Zimmerman % Copyright (C) 2001-2008 Nico Schottelius % %%%% %------------------------------------------------------------------------------ % % NOTE FOR THE UNAWARE USER % ========================= % % This file is a texinfo source. It isn't the binary file of some strange % editor of mine. If you want ASCII, you should "make gpm.txt". % % Some strings maybe changed from the configure script. % %------------------------------------------------------------------------------ % % This is not a conventional info file... % I use two extra features: % - The '%' as a comment marker ("\%" -> "%") % - leading blanks are allowed (and removed) % @comment %**start of header @setfilename gpm.info @settitle gpm @value{version} @iftex @afourpaper @end iftex @comment %**end of header @ifinfo @format @dircategory Miscellaneous @direntry * Gpm: (gpm). Text-mode (non-X) mouse library and server daemon. @end direntry @end format @end ifinfo @setchapternewpage off @set version @release@ @set update-month @release_date@ @finalout @ifinfo %ASCII_BEGIN This file is a user's and programmer's manual for gpm @value{version}. Copyright (C) 1994,1995,1998 Alessandro Rubini Copyright (C) 2001-2008 Nico Schottelius Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation. @end ifinfo @setchapternewpage odd @titlepage @c use the new format for titles @title gpm @value{version} @subtitle A general purpose mouse server for the Linux console @subtitle @value{update-month} @author by Nico Schottelius @end titlepage @setchapternewpage off @headings single @ifinfo This file documents the @value{version} release of the "General Purpose Mouse" (gpm) server for the Linux text console (@value{update-month}). @node Top, Overview, (dir), (dir) @top gpm @menu * Overview:: * Server Invocation:: * Gpm Internals:: * The ClientLib:: * Demo Clients:: * Type Index:: * Function Index:: * Variable Index:: @end menu @end ifinfo %########################################################################## %########################################################################## @node Overview, Server Invocation, Top, Top @chapter Overview @cindex Overview of Gpm @cindex Gpm Overview The @dfn{gpm} package is a mouse server for the Linux console. It is meant to provide cooked mouse events to text-only applications, such as editors and simple menu-based apps. The daemon is also able to repeat packets in "msc" format to a graphic application. This last feature is meant to override the single-open problem of busmice. The roots of @code{gpm} come from the @file{selection-1.5} package, by Andrew Haylett. The first application to support the mouse has been The Midnight Commander, by Miguel de Icaza. @file{mc-0.11} and later releases offer mouse support if you have the mouse server running on your system. The file @file{t-mouse.el} provides support for using the mouse from within Emacs. @xref{Emacs Support}. As of release 0.96, a default-handler is released with gpm, and can be used to handle Control-Mouse events to draw menus on the screen. The @code{gpm-root} program, however, needs kernel 1.1.73 or newer. @xref{gpm-root}. Release 1.00 has been an incompatible one (is is incompatible with releases older than 0.97), but is compatible with the kernel-level mouse driver (available as @file{kmouse-?.??.tar.gz} from the mirrors of @uref{ftp://tsx-11.mit.edu}. With 1.0 the high level library is available, together with a demonstration/test program. A small utility to help in detecting your mouse-type is also included. As of release 1.20.0 the default device is removed. Now -m is a must. Release 1.20.1 introduces the must for -t and a specific way to use -m,-t,-o: Now you've got to use -m first, then -t and at last -o. This seems to be more complex, but makes using of multiply mice possible with clean code. @menu * Building the Release:: @end menu %========================================================================= @node Building the Release, , Overview, Overview @section Compiling and Installing @cindex Building Gpm Just say @code{./configure && make && make install} to your shell. You'll need gpm installed to compile the latest release of The Midnight Commander with mouse support enabled. Binaries are not released with the package because it's safer for you to compile the package by yourself. %========================================================================= %@node Kernel Patches %@section Kernel Patches %@cindex Kernel Patches %@cindex Patches to Apply % %Old Linux kernels need to be patched to provide features I rely on. As %of 1.1.32, however, my patches are in the official release, so you won't %need any kernel recompilation. Remember, anyway, to enable selection while %compiling the kernel, or this package won't work. Refer to %@file{kernel/README} to probe further. % %Other features are needed to run the @t{gpm-root} client. They are %really functional only since 1.1.73. 1.1.68, however, should be sufficient. % %########################################################################## @node Server Invocation, Gpm Internals, Overview, Top @chapter Server Invocation @cindex The Server @cindex Command Line (gpm) %MANPAGE gpm.8 %M .TH GPM 8 "February 2002" %M .UC 4 %M .SH NAME %M gpm \- a cut and paste utility and mouse server for virtual consoles %M .SH SYNOPSIS %M .B gpm %M [ %M .I options %M ] %M .br %M .SH DESCRIPTION %M This package tries to be a useful %M mouse server for applications running on the Linux console. It is %M based on the "selection" package, and some of its code %M comes from selection itself. This package is intended as a replacement %M for "selection" as a cut-and-paste mechanism; it also provides %M additional facilities. The "selection" %M package offered the first cut-and-paste implementation for Linux using %M two mouse buttons, and the cut buffer is still called "selection buffer" %M or just "selection" throughout this document. %M %M The information below is extracted from the texinfo file, which is the %M preferred source of information. The @code{gpm} executable is meant to act like a daemon (thus, @code{gpmd} would be a better name for it). This section is meant to describe the command-line options for @code{gpm}, while its internals are outlined in the next section. @xref{Gpm Internals}. Due to restrictions in the @code{ioctl(TIOCLINUX)} system call, @code{gpm} must be run by the superuser. The restrictions have been added in the last 1.1 kernels to fix a security hole related to selection and screen dumping. The server can be configured to match the user's taste, and any application using the mouse will inherit the server's attitude. From release 1.02 up to 1.19.2 is was possible for any user logged on the system console to change the mouse @emph{feeling} using the @t{-q} option. This is no longer possible for security reasons. As of 0.97 the server program puts itself in the background. To kill @code{gpm} you can just reinvoke it with the @samp{-k} cmdline switch, although @code{killall gpm} can be a better choice. @menu * Special Commands:: * Command Line:: * Bugs and Problems:: * Mouse Types:: @end menu %M .SH SPECIAL COMMANDS %========================================================================== @node Special Commands, Command Line, Server Invocation, Server Invocation @section Special Commands Version 1.10 adds the capability to execute @emph{special} commands on certain circumstances. Special commands default to rebooting and halting the system, but the user can specify his/her personal choice. The capability to invoke commands using the mouse is a handy one for programmers, because it allows to issue a clean shutdown when the keyboard is locked and no network is available to restore the system to a sane state. Special commands are toggled by triple-clicking the left and right button -- an unlikely event during normal mouse usage. The easiest way to triple-click is pressing one of the buttons and triple-click the other one. When special processing is toggled, a message appears on the console (and the speaker beeps twice, if you have a speaker); if the user releases all the buttons and presses one of them again within three seconds, then the special command corresponding to the button is executed. The default special commands are: @table @var @item left button Reboot the system by signalling the init process @item middle button (if any) Execute @code{/sbin/shutdown -h now} @item right button Execute @code{/sbin/shutdown -r now} @end table The @samp{-S} command line switch enables special command processing and allows to change the three special commands. To accept the default commands use @samp{-S ""} (i.e., specify an empty argument). To specify your own commands, use a colon-separated list to specify commands associated to the left, middle and right button. If any of the commands is empty, it is interpreted as `send a signal to the init process'. This particular operation is supported, in addition to executing external commands, because sometimes bad bugs put the system to the impossibility to fork; in these rare case the programmer should be able to shutdown the system anyways, and killing init from a running process is the only way to do it. As an example, @samp{-S ":telinit 1:/sbin/halt"}, associates killing init to the left button, going single user to the middle one, and halting the system to the right button. System administrators should obviously be careful about special commands, as gpm runs with superuser permissions. Special commands are best suited for computers whose mouse can be physically accessed only by trusted people. %M .SH COMMAND LINE OPTIONS %========================================================================== @node Command Line, Bugs and Problems, Special Commands, Server Invocation @section Command Line Options Available command line options are the following: @table @code @item -a @var{accel} Set the acceleration value used when a single motion event is longer than @var{delta} (see @samp{-d}). @item -A[@var{limit}] Start up with selection pasting disabled. This is intended as a security measure; a plausible attack on a system seems to be to stuff a nasty shell command into the selection buffer (@code{rm -rf /}) including the terminating line break, then all the victim has to do is click the middle mouse button .. As of version 1.17.2, this has developed into a more general aging mechanism; the gpm daemon can disable (@emph{age}) selection pasting automatically after a period of inactivity. To enable this mode just give the optional @var{limit} parameter (no space in between !) which is interpreted as the time in seconds for which a selection is considered valid and pastable. As of version 1.15.7, a trivial program called @code{disable-paste} is provided. The following makes a good addition to @file{/etc/profile} if you allow multiple users to work on your console. @code{case $( /usr/bin/tty ) in @* /dev/tty[0-9]*) /usr/bin/disable-paste ;; @* esac} @item -b @var{baud} Set the baud rate. @item -B @var{sequence} Set the button sequence. @samp{123} is the normal sequence, @samp{321} can be used by left-handed people, and @samp{132} can be useful with two-button mice (especially within Emacs). All the button permutations are allowable. @item -d @var{delta} Set the delta value. When a single motion event is longer than @var{delta}, @var{accel} is used as a multiplying factor. (Must be 2 or above) @item -D Do not automatically enter background operation when started, and log messages to the standard error stream, not the syslog mechanism. This is useful for debugging; in previous releases it was done with a compile-time option. @item -g @var{number} With glidepoint devices, emulate the specified button with tapping. @var{number} must be @samp{1}, @samp{2}, or @samp{3}, and refers to the button number @emph{before} the @samp{-B} button remapping is performed. This option applies to the mman and ps2 decoding. No button is emulated by default because the ps2 tapping is incompatible with some normal ps2 mice @item -h Print a summary of command line options. @item -i @var{interval} Set @var{interval} to be used as an upper time limit for multiple clicks. If the interval between button-up and button-down events is less than @var{limit}, the press is considered a double or triple click. Time is in milliseconds. @item -k Kill a running gpm. This can be used by busmouse users to kill gpm before running X (unless they use @samp{-R} or the single-open limitation is removed from the kernel). @item -l @var{charset} Choose the @code{inword()} look up table. The @var{charset} argument is a list of characters. @samp{-} is used to specify a range and @samp{\ } is used to escape the next character or to provide octal codes. Only visible character can appear in @var{charset} because control characters can't appear in text-mode video memory, whence selection is cut. @item -m @var{filename} Choose the mouse file to open. Must be before -t and -o. @item -M Enable multiple mode. The daemon will read two different mouse devices. Any subsequent option will refer to the second device, while any preceding option will be used for the first device. This option automatically forces the @emph{repeater} (@samp{-R}) option on. @item -o @var{list-of-extra-options} The option works similary to the ``-o'' option of mount; it is used to specify a list of ``extra options'' that are specific to each mouse type. The list is comma-separated. The options @samp{dtr}, @samp{rts} or @samp{both} are used by the serial initialization to toggle the modem lines like, compatibly with earlier @i{gpm} versions; note however that using @t{-o dtr} associated with non-plain-serial mouse types may now generate an error. @xref{Mouse Types}. And by the way, use -o after -m and after -t. @item -p Forces the pointer to be visible while selecting. This is the behaviour of @file{selection-1.7}, but it is sometimes confusing. The default is not to show the pointer, which can be confusing as well. @item -r @var{number} Set the responsiveness. A higher responsiveness is used for a faster cursor motion. @item -R[@var{name}] Causes @code{gpm} to act as a repeater: any mouse data received while in graphic mode will be produced on the fifo @file{/dev/gpmdata} in protocol @var{name}, given as an optional argument (no space in between !). In principle, you can use the same names as for the @samp{-t} option, although repeating into some protocols may not be implemented for a while. @xref{Mouse Types}. In addition, you can specify @samp{raw} as the @var{name}, to repeat the mouse data byte by byte, without any protocol translation. If @var{name} is omitted, it defaults to @samp{msc}. Using @i{gpm} in repeater mode, you can configure the X server to use its fifo as a mouse device. This option is useful for bus-mouse owners to override the single-open limitation. It is also an easy way to manage those stupid dual-mode mice which force you to keep the middle button down while changing video mode. The option is forced on by the @samp{-M} option. @item -s @var{number} Set the sample rate for the mouse device. @item -S @var{commands} Enable special-command processing, and optionally specify custom commands as a colon-separated list. See above for a detailed description of special commands. @item -t @var{name} Set the mouse type. Use @samp{-t help} to get a list of allowable types. Since version 1.18.1, the list also shows which protocols are available as repeaters (see @t{-R} above), by marking them with an asterisk (``@t{*}''). @xref{Mouse Types}. Use -t after you selected the mouse device with -m. @item -v Print version information and exit. @item -2 Force two buttons. This means that the middle button, if any, will be taken as it was the right one. @item -3 Force three buttons. By default the mouse is considered to be a 2-buttons one, until the middle button is pressed. If three buttons are there, the right one is used to extend the selection, and the middle one is used to paste it. Beware: if you use the @samp{-3} option with a 2-buttons mouse, you won't be able to paste the selection. @end table @ignore .SH OPERATION To select text press the left mouse button and drag the mouse. To paste text in the same or another console, press the middle button. The right button is used to extend the selection, like in `xterm'. Two-button mice use the right button to paste text. Double and triple clicks select whole word and whole lines. Use of the `-p' option is recommended for best visual feedback. If a trailing space after the contents of a line is highlighted, and if there is no other text on the remainder of the line, the rest of the line will be selected automatically. If a number of lines are selected, highlighted trailing spaces on each line will be removed from the selection buffer. Any output on the virtual console holding the selection will clear the highlighted selection from the screen, to maintain integrity of the display, although the contents of the paste buffer will be unaffected. The selection mechanism is disabled if the controlling virtual console is placed in graphics mode, for example when running X11, and is re-enabled when text mode is resumed. (But see BUGS section below.) @end ignore %MSKIP @menu * Bugs and Problems:: @end menu @node Bugs and Problems, Mouse Types, Command Line, Server Invocation @section Bugs and Problems %M .SH BUGS The @code{gpm} server may have problems interacting with X: if your mouse is a single-open device (i.e. a bus mouse), you should kill @code{gpm} before starting X, or use the @samp{-R} option (see above). To kill @code{gpm} just invoke @code{gpm -k}. This problem doesn't apply to serial mice. Two instances of gpm can't run on the same system. If you have two mice use the @samp{-M} option (see above). While the current console is in graphic mode, @code{gpm} sleeps until text mode is back (unless @samp{-R} is used). Thus, it won't reply to clients. Anyways, it is unlikely that mouse-eager clients will spur out in hidden consoles. The clients shipped out with gpm are not updated, thus there are potential security risks when using them. @ignore .SH AUTHORS .nf Andrew Haylett (the original selection code) Ian Zimmerman (old maintainer) Alessandro Rubini (old maintainer (still helps a lot)) Nico Schottelius (maintainer) Many many contributors, to both selection and gpm. .fi .SH MAINTAINERS The current maintainer is Nico Schottelius. But without the help of Alessandro Rubini and the mailing list it would be impossible for me to maintain gpm. The development mailing list can be reached under gpm@lists.linux.it. More information on the list is in the README file part of the source distribution of gpm. .SH FILES .nf /var/run/gpm.pid The PID of the running gpm /dev/gpmctl A control socket for clients /dev/gpmdata The fifo written to by a \fBrepeater\fP (`-R') daemon. .fi .SH SEE ALSO .nf \fB mev(1)\fP A sample client for the gpm daemon. \fB gpm-root(1)\fP An handler for Control-Mouse events. .fi The info file about `gpm', which gives more complete information and explains how to write a gpm client. @end ignore %MANPAGE END %========================================================================== @node Mouse Types, , Bugs and Problems, Server Invocation @section Mouse Types %MANPAGE gpm-types.7 %M .TH GPM-TYPES 7 "July 2000" %M .UC 4 %M .SH NAME %M gpm-types \- pointer types (mice, tablets, etc.) managed by gpm. %M .br %M The information below is extracted from the texinfo file, which is the %M preferred source of information. %M .SH DESCRIPTION %MSKIP This section of the gpm documentation manual %M This manpage describes the various pointer types currently available in @i{gpm}. If you look at the source code, you'll find that pointer-specific code is confined to @file{mice.c} (while it used to only include mouse decoders, @i{gpm} now supports tablets and touchscreens as well). The mouse type is specified on command line with the @samp{-t} option. The option takes an argument, which represents the name of a mouse type. Each type can be associated to different names. For old mouse types, one name is the old selection-compatible name, and another is the XFree name. After version 1.18.1 of @i{gpm}, the number of synonyms was made arbitrary and the actual name being used is made available to the function responsible for mouse initialization. Therefore it is possible for a mouse decoder to behave slightly differently according to the name being used for the device (if this feature was already present, we wouldn't have for example @t{ms+} and @t{ms+lr} as different mouse types). The initialization procedure of each mouse type can also receive extra option, by means of the @t{-o} command line option. Since interpretation of the option string is decoder-specific, the allowed options are described in association to each mouse type. When no description of option strings is provided, that means the option string is unused for that mouse type and specifying one generates an error. When the document refer to ``standard serial options'' it means that one of @t{-o dtr}, @t{-o rts}, @t{-o both} can be specified to toggle the control lines of the serial port. The following mouse type are corrently recognized: @table @code @item bare Microsoft The Microsoft protocol, without any extension. It only reports two buttons. If your device has three, you should either try running the @t{mman} decoder or @t{msc}. In the latter case, you need to tell the mouse to talk @t{msc} protocol by toggling the DTR and RTS lines (with one of @t{-o drt}, @t{-o rts} or @t{-o both}) or invoking @code{gpm -t msc} while keeping the middle button pressed. Very annoying, indeed. This mouse decoder accepts standard serial options, although they should not be needed. @item ms This is the original Microsoft protocol, with a middle-button extension. Some old two-button devices send some spurious packets which can be misunderstood as middle-button events. If this is your case, use the @samp{bare} mouse type. Some new two-button devices are ``plug and play'', and they don't play fair at all; in this case try @t{-t pnp}. Many (most) three-button devices that use the microsoft protocol fail to report some middle-button events during mouse motion. Since the protocol does not distinguish between the middle button going up and the middle button going down it would be liable to get out of step, so this decoder declares the middle button to be up whenever the mouse moves. This prevents dragging with the middle button, so you should probably use @samp{-t ms+lr} instead of this decoder, especially if you want to use X. This mouse decoder accepts standard serial options, although they should not be needed. @item ms+ This is the same as @samp{-t ms} except that the middle button is not reset during mouse motion. So you can drag with the middle button. However, if your mouse exhibits the usual buggy behaviour the decoder is likely to get out of step with reality, thinking the middle button is up when it's down and vice versa. You should probably use @samp{-t ms+lr} instead of this decoder. This mouse decoder accepts standard serial options, although they should not be needed. @item ms+lr This is the same as @samp{-t ms+} except that there is an additional facility to reset the state of the middle button by pressing the other two buttons together. Do this when the decoder gets into a confused state where it thinks the middle button is up when it's down and vice versa. (If you get sick of having to do this, please don't blame gpm; blame your buggy mouse! Note that most three-button mice that do the microsoft protocol can be made to do the MouseSystems protocol instead. The ``3 Button Serial Mouse mini-HOWTO'' has information about this.) This mouse decoder accepts standard serial options, although they should not be needed. @item msc MouseSystems This is the standard protocol for three-button serial devices. Some of such devices only enter MouseSystem mode if the RTS, DTR or both lines are pushed low. Thus, you may try @t{-t msc} associated with @t{-o rts}, @t{-o dtr} or @t{-o both}. @item mman Mouseman The protocol used by the new Logitech devices with three buttons. It is backward compatible with the Microsoft protocol, so if your mouse has three buttons and works with @t{-t ms} or similar decoders you may try @t{-t mman} instead to use the middle button. This mouse decoder accepts standard serial options, although they should not be needed. @item sun The protocol used on Sparc computers and a few others. This mouse decoder accepts standard serial options, although they should not be needed. @item mm MMSeries Title says it all. This mouse decoder accepts standard serial options, although they should not be needed. @item logi Logitech This is the protocol used by old serial Logitech mice. @item bm BusMouse Some bus devices use this protocol, including those produced by Logitech. @item ps2 PS/2 The protocol used by most busmice. @item ncr This `type' is able to decode the pointing pen found on some laptops (the NCR 3125 pen) @item wacom The protocol used by the Wacom tablet. Since version 1.18.1 we have a new Wacom decoder, as the old one was not working with new tablets. This decoder was tested with Ultrapad, PenPartner, and Graphire tablets. Options: @t{-o relative} (default) for relative mode, @t{-o absolute} for absolute mode. @item genitizer The \"Genitizer\" tablet, in relative mode. This mouse decoder accepts standard serial options, although they should not be needed. @item logim Used to turn Logitech mice into Mouse-Systems-Compatible. Obviously, it only works with some of the Logitech mice. @item pnp This decoder works with the new mice produces by our friend Bill, and maybe with the old ones as well. The Pnp protocol is hardwired at 1200 baud and is upset by normal initialization, so this is a @t{-t bare} decoder with no initialization at all. This mouse decoder accepts standard serial options, although they should not be needed. @item ms3 A decoder for the new serial IntelliMouse devices, the ones with three buttons and a protocol incompatible with older ones. The wheel is currently unused. @item imps2 ``IntelliMouse'' on the ps/2 port. This type can also be used for a generic 2-button ps/2 mouse too, since it will auto-detect the type. @item netmouse Decodes the ``Genius NetMouse'' type of devices on the ps/2 port. For serial ``Netmouse'' devices, use the ``ms3'' decoder. @item cal A decoder of the ``Calcomp UltraSlate device. @item calr Same as above, but in relative mode. @item twid Support for the twiddler keyboard. As of gpm-1.14 this decoder includes a char generator for the text console, but doesn't yet support X keycodes. If used with @samp{-R}, @code{gpm} will anyway repeat mouse events to the X server. More information about twiddler support can be found in @file{README.twiddler}, in the gpm distribution. @item syn synaptics A decoder for the Synaptics TouchPad connected to the serial port. This mouse decoder accepts standard serial options, although they should not be needed. @item synps2 synaptics_ps2 Same as above, but for the devices attached to the ps2 port. @item brw A decoder for the Fellowes Browser, a device with 4 buttons and a wheel. This mouse decoder accepts standard serial options, although they should not be needed. @item js Joystick This mouse type uses the joystick device to generate mouse events. It is only available if the header @file{linux/joystick.h} is found at compile time. The header (and the device as well) has been introduced only during 2.1 development, and is not present in version 2.0 of the kernel. @item summa This is a decode for the Symmagraphics of Genius tablet, run in absolute mode. A repeater is associated to this decoder, so it can @t{-R summa} can be used to generate X events even for other absolute-pointing devices, like touchscreens. To use the repeated data from X, you need a modified @t{xf86Summa.o} module. @item mtouch A decoder for the MicroTouch touch screen. Please refer to the file @file{README.microtouch} in the source tree of gpm for further information. In the near future, anyways, I plan to fold back to this documentation the content of that file. @item gunze A decoder for the gunze touch screen. Please refer to the file @file{README.gunze} in the source tree of gpm for further information. In the near future, anyways, I plan to fold back to this documentation the content of that file. The decoder accepts the following options: @t{smooth=}, @t{debounce=}. An higher smoothness results in slower motion as well; a smaller smoothness gives faster motion but, obviously, less smooth. The default smoothness is 9. The debounce time is express in milliseconds and is the minimum duration of an up-down event to be taken as a tap. Smaller bounces are ignored. @item acecad The Acecad tablet in absolute mode. @item wp wizardpad Genius WizardPad tablet @end table @ignore .SH FILES .nf src/mice.c The source file for pointer decoders .fi .SH SEE ALSO .nf \fB gpm(8) \fP The General Purpose Mouse server .fi The info file about `gpm', which gives more complete information and explains how to write a gpm client. @end ignore %MANPAGE END %########################################################################## @node Gpm Internals, The ClientLib, Server Invocation, Top @chapter Gpm Internals @cindex Internals The server is organized as a main loop built around a @code{select()} system call. It responds both to mouse events and to input from the clients, which are connected to the server through a unix domain socket. The connection is used to tell the server what a client is interested in, and to get mouse events. When no clients are connected to the active console, the server runs the selection mechanism (cut and paste of text). The selection mechanism is a simple and well-designed application, whose behaviour can be cloned by clients, by telling the server to inherit the default response for certain mouse events (motion being the most interesting). @menu * Events:: * Margins:: * Event Types:: * Connection Details:: * Default Handlers:: @end menu %========================================================================== @node Events, Margins, Gpm Internals, Gpm Internals @section Events @cindex Events Whenever the mouse generates an event, the event is dispatched to the active client for the current console, or to the default handler, if present. Otherwise selection is run. A default handler is a client process which gets mouse events form all the virtual consoles. @xref{Default Handlers}. When a client is involved, it is handled a @code{Gpm_Event} structure, built by the server. The fields for @code{Gpm_Event} are the following: @tindex Gpm_Event @table @code @item unsigned char buttons; An or-mask of the values @code{GPM_B_LEFT}, @code{GPM_B_MIDDLE} and @code{GPM_B_RIGHT}. It corresponds to the state of the mouse buttons when the event is reported. The current implementation of gpm allows at most three buttons. @item unsigned char modifiers; The value of the kernel variable @code{shift_state}, as of @file{keyboard.c}, when the event is reported. It is a bitmask value, and corresponds to the least significant byte of the value used by the @code{loadkeys} program. Use of symbolic names in source code is available after inclusion of @file{linux/keyboard.h}, as exemplified in @file{mev.c}. @item unsigned short vc; The number of the active virtual console when the event is reported. The client is not expected to use this value, which corresponds to the controlling terminal of the client process, unless it gets events form multiple consoles. @xref{Default Handlers}. @item short x, y; The position of the mouse pointer where the event is reported. It is 1-based by default, to be compatible with @code{selection} and @code{libcurses}. This behavior can be overriden, though, by setting the library variable @code{gpm_zerobased}. @xref{Variables}. @item short dx, dy; The change in position since the last reported event. @item enum Gpm_Etype type; A bit-mask, representing the type of reported event, as described later. @xref{Event Types}. @item int clicks; A counter, which is valid at button-down, drag or button-up. It can be 0, 1 or 2 to mean single, double or triple click. @item enum Gpm_Margin margin; A bit-mask, telling if the pointer has gone out of the visible screen. The indivudual bits are named @code{GPM_TOP}, @code{GPM_BOT}, @code{GPM_LFT}, @code{GPM_RGT}. Only one of them is active at a time, to allow using @code{switch} on the value. Vertical outrun takes precedence on horizontal outrun. @xref{Margins}. @end table %========================================================================== @node Margins, Event Types, Events, Gpm Internals @section How margins are managed Motion and button-press events are constrained to remain within the visible screen. This means that the @code{x} will be within 1 and 80 and @code{y} will be within 1 and 25 when the console is 80x25 cells. However, a client can keep track of movements outside the screen, by using the @code{dx} and @code{dy} fields, which aren't subject to clipping. The server helps applications in detecting margin conditions by filling the @code{margin} field. Whenever the pointer tries to cross screen boundaries, it is forced to remain on the border, but a flag is set in @code{margin}. A different policy is in force for drag and button-release events. In this case the pointer is allowed to go outside the physical screen by exactly one position. This allows, for example, selecting to end of line by dragging down-left. The peculiar situation is nonetheless signaled through the @code{margin} flags. The client should be careful to fit the values within the screen if needed. @xref{Utility Functions}. %========================================================================== @node Event Types, Connection Details, Margins, Gpm Internals @section Event Types The @code{type} field in @code{Gpm_Event} is made up of bit-wide flags. The existing bit masks belong to two groups: bare events and cooked events. The bit-mask @code{GPM_BARE_EVENTS} is provided to extract bare events, by and-ing (@samp{&}) it with the @code{type} field. For any event, exactly one bit will be set in the resulting bitmask. Bare events are the following: @table @code @item GPM_MOVE A motion event, with all buttons up. @item GPM_DRAG A motion event, but one or more buttons are kept pressed. @item GPM_DOWN A button press event. The @code{buttons} field will report which buttons are pressed after the event. @item GPM_UP A button release event. The @code{buttons} field will report which buttons are being released. Note that this is different from the previous case. @item GPM_ENTER This means "enter in the current Region of Interest", and such event can only happen if the high-level library is used. When the type is @code{GPM_ENTER}, all the other fields are undefined. @xref{High Level Lib}. @item GPM_LEAVE This is only delivered by the high level library, too. Events of type @code{GPM_LEAVE} have all other fields undefined. @end table Cooked events are the following: @table @code @item GPM_SINGLE This bit may be set at button-press, drag and button release events, and can be used to identify a single press. The time interval used to choose a double click from two single clicks is set by a parameter in the daemon (configurable at daemon invocation). @item GPM_DOUBLE Used to identify a double click (press, drag, release) @item GPM_TRIPLE Used to identify a triple click (press, drag, release) @item GPM_MFLAG The ``motion flag'' is true if some dragging happened between button-press and button-release. It can be used by those applications which respond to events at button release. It is available at drag and release. @end table %========================================================================== @node Connection Details, Default Handlers, Event Types, Gpm Internals @section Connection Details Each virtual console has a stack of clients attached to it. They talk to gpm by writing to a control socket and get mouse events by reading it. All the clients in the stack can receive events. Gpm-1.10 and earlier only sent events to the top client, but sometimes users play with multiple programs using suspend-resume (thanks Ian). In addition to the per-console stacks, another stack is there to store default-handling clients. @xref{Default Handlers}. Each client registers with the server and tells which events it is interested in. Events not managed by the client can be handled by the selection mechanism, which is compiled in the server itself. This approach simplifies writing clients which respond only to button press/release events, because highlighting the mouse pointer can be performed by the server. A default handler in turn can respond only to mouse events associated with modifier keys, so that selection is used for any mouse-only event. Clients are required to fill a @code{Gpm_Connect} structure and pass it to the server. The structure is made up by four @code{unsigned int} fields. @xref{Open and Close}. @tindex Gpm_Connect @table @code @item eventMask A bitmask of the events the client wants to receive. Both bare and cooked events are allowed to appear in the mask. @item defaultMask A mask to tell which events allow a default treatment (the selection one). These are mouse events, independent of the modifier keys. @item minMod The minimum amount of modifiers required by the client. This field is used for default-handlers which manage control-mouse events without interfering with mouse-only ones. @xref{Default Handlers}. @item maxMod The maximum amount of modifiers the client is willing to receive. Events featuring a modifier key not included in @code{maxMod} won't be passed to the client. @end table @noindent Two more fields are there to tell about the connection itself, and you're not asked to fill them, because @code{Gpm_Open} will do it for you. @table @code @item int pid The process id of the connecting application. @item int vc Which virtual console to gain control of. @end table Keyboard modifiers are used to multiplex clients on the same virtual console. You (as a programmer) don't need to care about the internal workings. They are detailed in @ref{Default Handlers}, but you only need to choose the right values for your application. Examples: @table @code @item minMod=0; maxMod=0; specifies a client which senses mouse-only events, but neither shift-mouse nor alt-mouse nor control-mouse. @item minMod=0; maxMod=~0; is a client which gets any mouse event. @item minMod=1< .br Ian Zimmerman .SH FILES .nf /dev/gpmctl The socket used to connect to gpm. .fi .SH SEE ALSO .nf \fB gpm(8) \fP The mouse server \fB gpm-root(1) \fP An handler for Control-Mouse events. .fi The info file about `gpm', which gives more complete information and explains how to write a gpm client. @end ignore %MANPAGE END %========================================================================== @node sample/rmev, Emacs Support, mev, Demo Clients @section @code{sample/rmev} @code{rmev} is a reduced version of @code{mev}, but it is designed to be as portable as possible. It uses a subset of the capabilities of @file{libgpm.a}, but works smoothly on both xterm and the Linux console. It is distributed with @code{gpm} to show how a curses based application can support the mouse with a small effort. Most of the xterm decoding is by Janne Kukonlehto. @xref{Xterm}. %========================================================================== @node Emacs Support, gpm-root, sample/rmev, Demo Clients @section Emacs Support Emacs support is quite complete as of 0.14. The enclosed file @file{t-mouse.el}, also available in byte-compiled form, is used to pass mouse events to emacs. @file{t-mouse.elc} is installed in the correct @t{site-lisp} directory for you emacs installation (as detected by the configure phase). Events with modifiers other than Meta, Control, and Shift are not managed by the library. Managed events are passed to the lisp program, which converts them to be similar to X mouse events inside emacs. Actions are then invoked through a local keymap. In my own environment I can use mouse-only and meta mouse within emacs, shift-mouse to run selection and control-mouse to run @code{gpm-root}. @xref{gpm-root}. I suggest to put the following form in your own @file{.emacs} file, to avoid loading @code{t-mouse} when you aren't working on the Linux console: @lisp (if (and (string-match ".*-linux" system-configuration) (or (string-match "linux" (getenv "TERM")) (string-match "con.*" (getenv "TERM")))) (load-library "t-mouse")) @end lisp Mouse events are appended to the list variable @code{unread-command-events} where the Emacs main event loop will find them. They can be made to trigger any command (or interactive function, in Emacs Lisp terminology) at all. Actually Emacs already comes with reasonable bindings for most mouse events, so usually you won't have to do anything beyond installing @code{t-mouse}. If you want to modify what Emacs does in response to mouse events, please see @ref{Keymaps,,,elisp}. The scrollbar sits on the last column of the screen, though it is not visible. When you click on the last column, a scroll-bar action is taken. If this annoys you, again it can be turned off by changing the appropriate Emacs keymap. If you kill the @code{gpm} server, Emacs won't respond to mouse events any more. If the server is then restarted, you can invoke `@kbd{M-x t-mouse-run}' to restart mouse responsiveness in the editor. %========================================================================== @node gpm-root, hltest, Emacs Support, Demo Clients @section The ``gpm-root'' program %MANPAGE gpm-root.1 %M .TH GPM-ROOT 1 "February 1995" %M .UC 4 %M .SH NAME %M gpm-root \- a default handler for gpm, used to draw menus on %M the root window %M %M .SH SYNOPSIS %M .B gpm-root %M [ %M .I options %M ] %M .br %M .SH DESCRIPTION The program @code{gpm-root} is designed to handle Control-Mouse events to draw menus on the background of the current tty. The actual menus are described by a configuration file in the user's home directory. Please note that @code{gpm-root} needs to run with Linux 1.1.73 or newer, because previous kernels lack some screen handling capabilities required by the program. The program uses the files @file{/dev/vcs*} to draw to the console screen. These are available only from kernel 1.1.81 onward. If you miss those device nodes, you should create them using @code{create_vcs} in the distribution directory. The tool won't run with kernels older than 1.1.81, because they lacked a full screen dump/restore capability. Available command line options are the following: @table @code @item -m @var{number} Choose the modifier to use (by default: @samp{control}). The modifier can be provided either as a number or as a symbolic string. Allowed strings are @samp{shift}, @samp{anyAlt}, @samp{leftAlt}, @samp{rightAlt}, @samp{control}. @item -u Deny using user-specific configuration files. With this option on, only @file{/etc/gpm-root.conf} will be used as a source of configuration information. This option is intended for those system administrators who fear security could be broken by this daemon. Things should be sufficiently secure, but if you find a hole please tell me about it. @item -D Do not automatically enter background operation when started, and log messages to the standard error stream, not the syslog mechanism. This is useful for debugging; in previous releases it was done with a compile-time option. @item -V @var{verbosity increment} Raise the maximum level of messages that will be logged. Thus a positive argument has the effect of making the program more verbose. One can also give a negative argument to hush the program; however, note that due to @b{getopt(3)} rules a negative argument must follow the option with no space betwixt (that is, @samp{-V-1} but not @samp{-V -1}). @xref{Program Arguments,,,libc}. The argument is optional and its default value is 1. @end table Each time a menu is drawn, the configuration file is reparsed if it has changed. This allows modification of personal setup without reinvoking the daemon. %M The actual configuration file is better introduced by looking at your %M @file{/etc/gpm-root.conf}. %M %MSKIP The actual configuration file is better introduced by an example: @lisp # sample configuration file for gpm-root # edit it to suit your taste button 2 @{ name "system status" foreground red background black border yellow head bright yellow "" f.nop "load: " f.load "free:" f.free "---------" f.nop "disk usage" f.bgcmd "du | sort -rn > /tmp/du" @} button 3 @{ name "jump" foreground black background red border bright yellow head bright yellow "tty1" f.jptty "1" "tty2" f.jptty "2" "tty3" f.jptty "3" "tty4" f.jptty "4" "tty5" f.jptty "5" "tty6" f.jptty "6" "" f.nop "more of them..." @{ "tty 17" f.jptty "17" @} @} @end lisp %M .fi The syntax for the file won't be described here, being it quite apparent from the example above. Blanks and newlines are unused in parsing the file, and the layout of the file is free. Comments are allowed in the file: any hash mark (@samp{#}) found at the beginning of the line or after white space makes the parser discard anything up to the next line. To insert quotes (@samp{"}) in strings precede them with a backslash. Note that recursive menus are allowed, to any level of recursion. Keywords belong to three groups: the button keyword, the cfg keywords and the action keywords. They are all described in the table below: @table @code @item button @var{number} @var{menu} The @code{button} keyword is used to introduce a menu. It is followed by the number of the relevant button (1=left, 2=middle, 3=right), an open brace, a menu and a closed brace. A menu is made up of cfg statements, followed by action statements. Cfg statements can come in any order, while the order of action statements tells the actual order in which actions will appear on the screen, top to bottom. @end table The following statements belong to the cfg set. @table @code @item name @var{string} If the @code{name} keyword is present, the specified @var{string} will be used as the name for the current menu. @item background @var{color} This statements is used to specify the background color to be used in the current menu. The @var{color} can be specified with one of the eight canonical strings @samp{black}, @samp{red}, @samp{cyan} etc. The background defaults to black. @item foreground @var{color} This statements is used to specify the foreground color for menu items. Its value defaults to @samp{white}. An optional @samp{bright} keyword can appear before the actual color. @item border @var{color} @code{border} is used to specify the border color for the menu. Its value defaults to @samp{white}. An optional @samp{bright} keyword can appear before the actual color. @item head @var{color} @code{head} is used to specify the foreground color for the title of the menu. Its value defaults to @samp{white}. An optional @samp{bright} keyword can appear before the actual color. @end table The following statements belong to the action set. @table @code @item @var{string} f.fgcmd @var{cmdstring} When the mouse button is released above the corresponding menu item, the @var{cmdstring} is pasted in the keyboard queue of the current console. This is not yet implemented. @item @var{string} f.bgcmd @var{cmdstring} When the mouse button is released above the corresponding menu item, a shell (@file{/bin/sh}) is forked to execute the specified command, with @code{stdin} connected to @file{/dev/null}, and @code{stdout}, @code{stderr} connected to the active console. @item @var{string} f.jptty @var{ttynumber} When the mouse button is released above the corresponding menu item, the console is switched to the one specified. The @var{ttynumber} must be specified as a string. Any tty can be reached this way, even those which are not accessible via the keyboard. @item @var{string} f.mktty @var{ttynumber} When the mouse button is released above the corresponding menu item, an unused console is selected, and @file{/sbin/mingetty} is executed in it. The current console is switched to the newly opened console. I use this command to save kernel memory by opening a single console through @file{/etc/inittab} and requesting the others only when i need to login. @item @var{string} @var{Whole-menu} A menu can directly follow the label string. When the mouse pointer leaves the menu frame at the level of @var{string}, a second menu is posted on screen. @item @var{string} f.lock When the mouse button is released above the corresponding menu item, the keyboard and the screen are locked, and only the locking user or the superuser can unlock them. This is not yet implemented. @item @var{string} f.load The current loadavg when the menu is posted is concatenated to @var{string} to build the actual message displayed on screen. Nothing happens at button release. @item @var{string} f.free The free memory and swap when the menu is posted is concatenated to @var{string} to build the actual message displayed on screen. Nothing happens at button release. @item @var{string} f.time The current time is formatted with @b{strftime(3)}, according to @var{string}. The resulting string is the actual message displayed on screen. Nothing happens at button release. @item @var{string} f.pipe @var{cmdline} When the mouse pointer leaves the menu frame at the level of @var{string}, a message box is posted on screen showing the last ten lines of the output of @var{cmdline}. @var{cmdline} is executed by @file{/bin/sh}. This is not yet implemented. @item @var{string} f.nop This does nothing, it only displays @var{string} on the menu. @end table The @code{HOME}, @code{LOGNAME} and @code{USER} environment variables are setup to the values for the invoking user before spawning an external process (@code{f.bgcmd}, @code{f.pipe}). The current directory is always @file{/}. %M .SH BUGS Known bugs have been fixed. In particular, if you invoke @code{gpm-root} right after @code{gpm}, it will delay a few seconds before trying to connect to the daemon. @ignore .SH AUTHOR Alessandro Rubini .SH FILES .nf /dev/gpmctl The socket used to connect to gpm. /etc/gpm-root.conf The default configuration file. $(HOME)/.gpm-root The user configuration file. /dev/vcs* Virtual Console Screens .fi .SH SEE ALSO .nf \fB gpm(8) \fP .fi The info file about `gpm', which gives more complete information and explains how to write a gpm client. @end ignore %MANPAGE END %========================================================================== @node hltest, mouse-test, gpm-root, Demo Clients @section @code{hltest} High-level test is a simple sample application using the high-level library. It implements something like a window manager for text windows, though it is small and unuseful. The application is meant to be read by programmers trying to use the high-level library. It is equipped with event reporting to help in understanding the internal workings. %========================================================================== @node mouse-test, , hltest, Demo Clients @section @code{mouse-test} %MANPAGE mouse-test.1 %M .TH mouse-test 1 "March 26, 1998" "" %M .SH NAME %M mouse-test \- a tool for determining mouse type and device it's attached to. %M .SH SYNTAX %M \fBmouse-test\fR [ \fIdevice\fR ... ] %M .SH DESCRIPTION This experimental and incomplete application tries to help in detecting which protocol does your mouse speak. It is able to detect MouseMan devices, and to choose between @samp{-t ms} (three-buttons aware) and @samp{-t bare} old two-buttons-only serial mice. %M .SH BUGS I know the application is buggy, but I only own one mouse device. If you are interested in this application, just call me and awake me from my laziness. @ignore .SS OPTIONS .IP \fIdevice\fP [ \fIdevice\fP ... ] .PP Check this \fIdevice\fP for a mouse. If no devices are listed, mouse-test will try all possible devices. .SH AUTHOR Alessandro Rubini .SH FILES .nf /dev/* The devices used to search for a mouse .fi .SH SEE ALSO .nf gpm(8) .fi @end ignore %MANPAGE END %########################################################################## @node Type Index, Function Index, Demo Clients, Top @unnumbered Type Index @printindex tp @node Function Index, Variable Index, Type Index, Top @unnumbered API Index @printindex fn @node Variable Index, , Function Index, Top @unnumbered Variable Index @printindex vr %@iftex %@unnumbered Table of Contents %@contents %@end iftex @bye /* * This is because Linus uses 4-wide tabstops, * forcing me to use the same default to manage kernel sources */ /* Local Variables: */ /* tab-width:8 */ /* End: */ gpm-1.20.4/doc/gpm.info010060000017500001750000002272371101761662200134400ustar00niconico00This is /home/user/nico/projekte/gpm/gpm/doc/gpm.info, produced by makeinfo version 4.11 from /home/user/nico/projekte/gpm/gpm/doc/gpm.texinfo. INFO-DIR-SECTION Miscellaneous START-INFO-DIR-ENTRY * Gpm: (gpm). Text-mode (non-X) mouse library and server daemon. END-INFO-DIR-ENTRY This file is a user's and programmer's manual for gpm 1.20.4. Copyright (C) 1994,1995,1998 Alessandro Rubini Copyright (C) 2001-2008 Nico Schottelius Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation. This file documents the 1.20.4 release of the "General Purpose Mouse" (gpm) server for the Linux text console (29th of May 2008).  File: gpm.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) gpm *** * Menu: * Overview:: * Server Invocation:: * Gpm Internals:: * The ClientLib:: * Demo Clients:: * Type Index:: * Function Index:: * Variable Index::  File: gpm.info, Node: Overview, Next: Server Invocation, Prev: Top, Up: Top 1 Overview ********** The "gpm" package is a mouse server for the Linux console. It is meant to provide cooked mouse events to text-only applications, such as editors and simple menu-based apps. The daemon is also able to repeat packets in "msc" format to a graphic application. This last feature is meant to override the single-open problem of busmice. The roots of `gpm' come from the `selection-1.5' package, by Andrew Haylett. The first application to support the mouse has been The Midnight Commander, by Miguel de Icaza. `mc-0.11' and later releases offer mouse support if you have the mouse server running on your system. The file `t-mouse.el' provides support for using the mouse from within Emacs. *Note Emacs Support::. As of release 0.96, a default-handler is released with gpm, and can be used to handle Control-Mouse events to draw menus on the screen. The `gpm-root' program, however, needs kernel 1.1.73 or newer. *Note gpm-root::. Release 1.00 has been an incompatible one (is is incompatible with releases older than 0.97), but is compatible with the kernel-level mouse driver (available as `kmouse-?.??.tar.gz' from the mirrors of `ftp://tsx-11.mit.edu'. With 1.0 the high level library is available, together with a demonstration/test program. A small utility to help in detecting your mouse-type is also included. As of release 1.20.0 the default device is removed. Now -m is a must. Release 1.20.1 introduces the must for -t and a specific way to use -m,-t,-o: Now you've got to use -m first, then -t and at last -o. This seems to be more complex, but makes using of multiply mice possible with clean code. * Menu: * Building the Release::  File: gpm.info, Node: Building the Release, Prev: Overview, Up: Overview 1.1 Compiling and Installing ============================ Just say `./configure && make && make install' to your shell. You'll need gpm installed to compile the latest release of The Midnight Commander with mouse support enabled. Binaries are not released with the package because it's safer for you to compile the package by yourself.  File: gpm.info, Node: Server Invocation, Next: Gpm Internals, Prev: Overview, Up: Top 2 Server Invocation ******************* The `gpm' executable is meant to act like a daemon (thus, `gpmd' would be a better name for it). This section is meant to describe the command-line options for `gpm', while its internals are outlined in the next section. *Note Gpm Internals::. Due to restrictions in the `ioctl(TIOCLINUX)' system call, `gpm' must be run by the superuser. The restrictions have been added in the last 1.1 kernels to fix a security hole related to selection and screen dumping. The server can be configured to match the user's taste, and any application using the mouse will inherit the server's attitude. From release 1.02 up to 1.19.2 is was possible for any user logged on the system console to change the mouse _feeling_ using the -q option. This is no longer possible for security reasons. As of 0.97 the server program puts itself in the background. To kill `gpm' you can just reinvoke it with the `-k' cmdline switch, although `killall gpm' can be a better choice. * Menu: * Special Commands:: * Command Line:: * Bugs and Problems:: * Mouse Types::  File: gpm.info, Node: Special Commands, Next: Command Line, Prev: Server Invocation, Up: Server Invocation 2.1 Special Commands ==================== Version 1.10 adds the capability to execute _special_ commands on certain circumstances. Special commands default to rebooting and halting the system, but the user can specify his/her personal choice. The capability to invoke commands using the mouse is a handy one for programmers, because it allows to issue a clean shutdown when the keyboard is locked and no network is available to restore the system to a sane state. Special commands are toggled by triple-clicking the left and right button - an unlikely event during normal mouse usage. The easiest way to triple-click is pressing one of the buttons and triple-click the other one. When special processing is toggled, a message appears on the console (and the speaker beeps twice, if you have a speaker); if the user releases all the buttons and presses one of them again within three seconds, then the special command corresponding to the button is executed. The default special commands are: LEFT BUTTON Reboot the system by signalling the init process MIDDLE BUTTON (IF ANY) Execute `/sbin/shutdown -h now' RIGHT BUTTON Execute `/sbin/shutdown -r now' The `-S' command line switch enables special command processing and allows to change the three special commands. To accept the default commands use `-S ""' (i.e., specify an empty argument). To specify your own commands, use a colon-separated list to specify commands associated to the left, middle and right button. If any of the commands is empty, it is interpreted as `send a signal to the init process'. This particular operation is supported, in addition to executing external commands, because sometimes bad bugs put the system to the impossibility to fork; in these rare case the programmer should be able to shutdown the system anyways, and killing init from a running process is the only way to do it. As an example, `-S ":telinit 1:/sbin/halt"', associates killing init to the left button, going single user to the middle one, and halting the system to the right button. System administrators should obviously be careful about special commands, as gpm runs with superuser permissions. Special commands are best suited for computers whose mouse can be physically accessed only by trusted people.  File: gpm.info, Node: Command Line, Next: Bugs and Problems, Prev: Special Commands, Up: Server Invocation 2.2 Command Line Options ======================== Available command line options are the following: `-a ACCEL' Set the acceleration value used when a single motion event is longer than DELTA (see `-d'). `-A[LIMIT]' Start up with selection pasting disabled. This is intended as a security measure; a plausible attack on a system seems to be to stuff a nasty shell command into the selection buffer (`rm -rf /') including the terminating line break, then all the victim has to do is click the middle mouse button .. As of version 1.17.2, this has developed into a more general aging mechanism; the gpm daemon can disable (_age_) selection pasting automatically after a period of inactivity. To enable this mode just give the optional LIMIT parameter (no space in between !) which is interpreted as the time in seconds for which a selection is considered valid and pastable. As of version 1.15.7, a trivial program called `disable-paste' is provided. The following makes a good addition to `/etc/profile' if you allow multiple users to work on your console. `case $( /usr/bin/tty ) in /dev/tty[0-9]*) /usr/bin/disable-paste ;; esac' `-b BAUD' Set the baud rate. `-B SEQUENCE' Set the button sequence. `123' is the normal sequence, `321' can be used by left-handed people, and `132' can be useful with two-button mice (especially within Emacs). All the button permutations are allowable. `-d DELTA' Set the delta value. When a single motion event is longer than DELTA, ACCEL is used as a multiplying factor. (Must be 2 or above) `-D' Do not automatically enter background operation when started, and log messages to the standard error stream, not the syslog mechanism. This is useful for debugging; in previous releases it was done with a compile-time option. `-g NUMBER' With glidepoint devices, emulate the specified button with tapping. NUMBER must be `1', `2', or `3', and refers to the button number _before_ the `-B' button remapping is performed. This option applies to the mman and ps2 decoding. No button is emulated by default because the ps2 tapping is incompatible with some normal ps2 mice `-h' Print a summary of command line options. `-i INTERVAL' Set INTERVAL to be used as an upper time limit for multiple clicks. If the interval between button-up and button-down events is less than LIMIT, the press is considered a double or triple click. Time is in milliseconds. `-k' Kill a running gpm. This can be used by busmouse users to kill gpm before running X (unless they use `-R' or the single-open limitation is removed from the kernel). `-l CHARSET' Choose the `inword()' look up table. The CHARSET argument is a list of characters. `-' is used to specify a range and `\ ' is used to escape the next character or to provide octal codes. Only visible character can appear in CHARSET because control characters can't appear in text-mode video memory, whence selection is cut. `-m FILENAME' Choose the mouse file to open. Must be before -t and -o. `-M' Enable multiple mode. The daemon will read two different mouse devices. Any subsequent option will refer to the second device, while any preceding option will be used for the first device. This option automatically forces the _repeater_ (`-R') option on. `-o LIST-OF-EXTRA-OPTIONS' The option works similary to the "-o" option of mount; it is used to specify a list of "extra options" that are specific to each mouse type. The list is comma-separated. The options `dtr', `rts' or `both' are used by the serial initialization to toggle the modem lines like, compatibly with earlier gpm versions; note however that using -o dtr associated with non-plain-serial mouse types may now generate an error. *Note Mouse Types::. And by the way, use -o after -m and after -t. `-p' Forces the pointer to be visible while selecting. This is the behaviour of `selection-1.7', but it is sometimes confusing. The default is not to show the pointer, which can be confusing as well. `-r NUMBER' Set the responsiveness. A higher responsiveness is used for a faster cursor motion. `-R[NAME]' Causes `gpm' to act as a repeater: any mouse data received while in graphic mode will be produced on the fifo `/dev/gpmdata' in protocol NAME, given as an optional argument (no space in between !). In principle, you can use the same names as for the `-t' option, although repeating into some protocols may not be implemented for a while. *Note Mouse Types::. In addition, you can specify `raw' as the NAME, to repeat the mouse data byte by byte, without any protocol translation. If NAME is omitted, it defaults to `msc'. Using gpm in repeater mode, you can configure the X server to use its fifo as a mouse device. This option is useful for bus-mouse owners to override the single-open limitation. It is also an easy way to manage those stupid dual-mode mice which force you to keep the middle button down while changing video mode. The option is forced on by the `-M' option. `-s NUMBER' Set the sample rate for the mouse device. `-S COMMANDS' Enable special-command processing, and optionally specify custom commands as a colon-separated list. See above for a detailed description of special commands. `-t NAME' Set the mouse type. Use `-t help' to get a list of allowable types. Since version 1.18.1, the list also shows which protocols are available as repeaters (see -R above), by marking them with an asterisk ("*"). *Note Mouse Types::. Use -t after you selected the mouse device with -m. `-v' Print version information and exit. `-2' Force two buttons. This means that the middle button, if any, will be taken as it was the right one. `-3' Force three buttons. By default the mouse is considered to be a 2-buttons one, until the middle button is pressed. If three buttons are there, the right one is used to extend the selection, and the middle one is used to paste it. Beware: if you use the `-3' option with a 2-buttons mouse, you won't be able to paste the selection. * Menu: * Bugs and Problems::  File: gpm.info, Node: Bugs and Problems, Next: Mouse Types, Prev: Command Line, Up: Server Invocation 2.3 Bugs and Problems ===================== The `gpm' server may have problems interacting with X: if your mouse is a single-open device (i.e. a bus mouse), you should kill `gpm' before starting X, or use the `-R' option (see above). To kill `gpm' just invoke `gpm -k'. This problem doesn't apply to serial mice. Two instances of gpm can't run on the same system. If you have two mice use the `-M' option (see above). While the current console is in graphic mode, `gpm' sleeps until text mode is back (unless `-R' is used). Thus, it won't reply to clients. Anyways, it is unlikely that mouse-eager clients will spur out in hidden consoles. The clients shipped out with gpm are not updated, thus there are potential security risks when using them.  File: gpm.info, Node: Mouse Types, Prev: Bugs and Problems, Up: Server Invocation 2.4 Mouse Types =============== This section of the gpm documentation manual describes the various pointer types currently available in gpm. If you look at the source code, you'll find that pointer-specific code is confined to `mice.c' (while it used to only include mouse decoders, gpm now supports tablets and touchscreens as well). The mouse type is specified on command line with the `-t' option. The option takes an argument, which represents the name of a mouse type. Each type can be associated to different names. For old mouse types, one name is the old selection-compatible name, and another is the XFree name. After version 1.18.1 of gpm, the number of synonyms was made arbitrary and the actual name being used is made available to the function responsible for mouse initialization. Therefore it is possible for a mouse decoder to behave slightly differently according to the name being used for the device (if this feature was already present, we wouldn't have for example ms+ and ms+lr as different mouse types). The initialization procedure of each mouse type can also receive extra option, by means of the -o command line option. Since interpretation of the option string is decoder-specific, the allowed options are described in association to each mouse type. When no description of option strings is provided, that means the option string is unused for that mouse type and specifying one generates an error. When the document refer to "standard serial options" it means that one of -o dtr, -o rts, -o both can be specified to toggle the control lines of the serial port. The following mouse type are corrently recognized: `bare Microsoft' The Microsoft protocol, without any extension. It only reports two buttons. If your device has three, you should either try running the mman decoder or msc. In the latter case, you need to tell the mouse to talk msc protocol by toggling the DTR and RTS lines (with one of -o drt, -o rts or -o both) or invoking `gpm -t msc' while keeping the middle button pressed. Very annoying, indeed. This mouse decoder accepts standard serial options, although they should not be needed. `ms' This is the original Microsoft protocol, with a middle-button extension. Some old two-button devices send some spurious packets which can be misunderstood as middle-button events. If this is your case, use the `bare' mouse type. Some new two-button devices are "plug and play", and they don't play fair at all; in this case try -t pnp. Many (most) three-button devices that use the microsoft protocol fail to report some middle-button events during mouse motion. Since the protocol does not distinguish between the middle button going up and the middle button going down it would be liable to get out of step, so this decoder declares the middle button to be up whenever the mouse moves. This prevents dragging with the middle button, so you should probably use `-t ms+lr' instead of this decoder, especially if you want to use X. This mouse decoder accepts standard serial options, although they should not be needed. `ms+' This is the same as `-t ms' except that the middle button is not reset during mouse motion. So you can drag with the middle button. However, if your mouse exhibits the usual buggy behaviour the decoder is likely to get out of step with reality, thinking the middle button is up when it's down and vice versa. You should probably use `-t ms+lr' instead of this decoder. This mouse decoder accepts standard serial options, although they should not be needed. `ms+lr' This is the same as `-t ms+' except that there is an additional facility to reset the state of the middle button by pressing the other two buttons together. Do this when the decoder gets into a confused state where it thinks the middle button is up when it's down and vice versa. (If you get sick of having to do this, please don't blame gpm; blame your buggy mouse! Note that most three-button mice that do the microsoft protocol can be made to do the MouseSystems protocol instead. The "3 Button Serial Mouse mini-HOWTO" has information about this.) This mouse decoder accepts standard serial options, although they should not be needed. `msc MouseSystems' This is the standard protocol for three-button serial devices. Some of such devices only enter MouseSystem mode if the RTS, DTR or both lines are pushed low. Thus, you may try -t msc associated with -o rts, -o dtr or -o both. `mman Mouseman' The protocol used by the new Logitech devices with three buttons. It is backward compatible with the Microsoft protocol, so if your mouse has three buttons and works with -t ms or similar decoders you may try -t mman instead to use the middle button. This mouse decoder accepts standard serial options, although they should not be needed. `sun' The protocol used on Sparc computers and a few others. This mouse decoder accepts standard serial options, although they should not be needed. `mm MMSeries' Title says it all. This mouse decoder accepts standard serial options, although they should not be needed. `logi Logitech' This is the protocol used by old serial Logitech mice. `bm BusMouse' Some bus devices use this protocol, including those produced by Logitech. `ps2 PS/2' The protocol used by most busmice. `ncr' This `type' is able to decode the pointing pen found on some laptops (the NCR 3125 pen) `wacom' The protocol used by the Wacom tablet. Since version 1.18.1 we have a new Wacom decoder, as the old one was not working with new tablets. This decoder was tested with Ultrapad, PenPartner, and Graphire tablets. Options: -o relative (default) for relative mode, -o absolute for absolute mode. `genitizer' The \"Genitizer\" tablet, in relative mode. This mouse decoder accepts standard serial options, although they should not be needed. `logim' Used to turn Logitech mice into Mouse-Systems-Compatible. Obviously, it only works with some of the Logitech mice. `pnp' This decoder works with the new mice produces by our friend Bill, and maybe with the old ones as well. The Pnp protocol is hardwired at 1200 baud and is upset by normal initialization, so this is a -t bare decoder with no initialization at all. This mouse decoder accepts standard serial options, although they should not be needed. `ms3' A decoder for the new serial IntelliMouse devices, the ones with three buttons and a protocol incompatible with older ones. The wheel is currently unused. `imps2' "IntelliMouse" on the ps/2 port. This type can also be used for a generic 2-button ps/2 mouse too, since it will auto-detect the type. `netmouse' Decodes the "Genius NetMouse" type of devices on the ps/2 port. For serial "Netmouse" devices, use the "ms3" decoder. `cal' A decoder of the "Calcomp UltraSlate device. `calr' Same as above, but in relative mode. `twid' Support for the twiddler keyboard. As of gpm-1.14 this decoder includes a char generator for the text console, but doesn't yet support X keycodes. If used with `-R', `gpm' will anyway repeat mouse events to the X server. More information about twiddler support can be found in `README.twiddler', in the gpm distribution. `syn synaptics' A decoder for the Synaptics TouchPad connected to the serial port. This mouse decoder accepts standard serial options, although they should not be needed. `synps2 synaptics_ps2' Same as above, but for the devices attached to the ps2 port. `brw' A decoder for the Fellowes Browser, a device with 4 buttons and a wheel. This mouse decoder accepts standard serial options, although they should not be needed. `js Joystick' This mouse type uses the joystick device to generate mouse events. It is only available if the header `linux/joystick.h' is found at compile time. The header (and the device as well) has been introduced only during 2.1 development, and is not present in version 2.0 of the kernel. `summa' This is a decode for the Symmagraphics of Genius tablet, run in absolute mode. A repeater is associated to this decoder, so it can -R summa can be used to generate X events even for other absolute-pointing devices, like touchscreens. To use the repeated data from X, you need a modified xf86Summa.o module. `mtouch' A decoder for the MicroTouch touch screen. Please refer to the file `README.microtouch' in the source tree of gpm for further information. In the near future, anyways, I plan to fold back to this documentation the content of that file. `gunze' A decoder for the gunze touch screen. Please refer to the file `README.gunze' in the source tree of gpm for further information. In the near future, anyways, I plan to fold back to this documentation the content of that file. The decoder accepts the following options: smooth=, debounce=. An higher smoothness results in slower motion as well; a smaller smoothness gives faster motion but, obviously, less smooth. The default smoothness is 9. The debounce time is express in milliseconds and is the minimum duration of an up-down event to be taken as a tap. Smaller bounces are ignored. `acecad' The Acecad tablet in absolute mode. `wp wizardpad' Genius WizardPad tablet  File: gpm.info, Node: Gpm Internals, Next: The ClientLib, Prev: Server Invocation, Up: Top 3 Gpm Internals *************** The server is organized as a main loop built around a `select()' system call. It responds both to mouse events and to input from the clients, which are connected to the server through a unix domain socket. The connection is used to tell the server what a client is interested in, and to get mouse events. When no clients are connected to the active console, the server runs the selection mechanism (cut and paste of text). The selection mechanism is a simple and well-designed application, whose behaviour can be cloned by clients, by telling the server to inherit the default response for certain mouse events (motion being the most interesting). * Menu: * Events:: * Margins:: * Event Types:: * Connection Details:: * Default Handlers::  File: gpm.info, Node: Events, Next: Margins, Prev: Gpm Internals, Up: Gpm Internals 3.1 Events ========== Whenever the mouse generates an event, the event is dispatched to the active client for the current console, or to the default handler, if present. Otherwise selection is run. A default handler is a client process which gets mouse events form all the virtual consoles. *Note Default Handlers::. When a client is involved, it is handled a `Gpm_Event' structure, built by the server. The fields for `Gpm_Event' are the following: `unsigned char buttons;' An or-mask of the values `GPM_B_LEFT', `GPM_B_MIDDLE' and `GPM_B_RIGHT'. It corresponds to the state of the mouse buttons when the event is reported. The current implementation of gpm allows at most three buttons. `unsigned char modifiers;' The value of the kernel variable `shift_state', as of `keyboard.c', when the event is reported. It is a bitmask value, and corresponds to the least significant byte of the value used by the `loadkeys' program. Use of symbolic names in source code is available after inclusion of `linux/keyboard.h', as exemplified in `mev.c'. `unsigned short vc;' The number of the active virtual console when the event is reported. The client is not expected to use this value, which corresponds to the controlling terminal of the client process, unless it gets events form multiple consoles. *Note Default Handlers::. `short x, y;' The position of the mouse pointer where the event is reported. It is 1-based by default, to be compatible with `selection' and `libcurses'. This behavior can be overriden, though, by setting the library variable `gpm_zerobased'. *Note Variables::. `short dx, dy;' The change in position since the last reported event. `enum Gpm_Etype type;' A bit-mask, representing the type of reported event, as described later. *Note Event Types::. `int clicks;' A counter, which is valid at button-down, drag or button-up. It can be 0, 1 or 2 to mean single, double or triple click. `enum Gpm_Margin margin;' A bit-mask, telling if the pointer has gone out of the visible screen. The indivudual bits are named `GPM_TOP', `GPM_BOT', `GPM_LFT', `GPM_RGT'. Only one of them is active at a time, to allow using `switch' on the value. Vertical outrun takes precedence on horizontal outrun. *Note Margins::.  File: gpm.info, Node: Margins, Next: Event Types, Prev: Events, Up: Gpm Internals 3.2 How margins are managed =========================== Motion and button-press events are constrained to remain within the visible screen. This means that the `x' will be within 1 and 80 and `y' will be within 1 and 25 when the console is 80x25 cells. However, a client can keep track of movements outside the screen, by using the `dx' and `dy' fields, which aren't subject to clipping. The server helps applications in detecting margin conditions by filling the `margin' field. Whenever the pointer tries to cross screen boundaries, it is forced to remain on the border, but a flag is set in `margin'. A different policy is in force for drag and button-release events. In this case the pointer is allowed to go outside the physical screen by exactly one position. This allows, for example, selecting to end of line by dragging down-left. The peculiar situation is nonetheless signaled through the `margin' flags. The client should be careful to fit the values within the screen if needed. *Note Utility Functions::.  File: gpm.info, Node: Event Types, Next: Connection Details, Prev: Margins, Up: Gpm Internals 3.3 Event Types =============== The `type' field in `Gpm_Event' is made up of bit-wide flags. The existing bit masks belong to two groups: bare events and cooked events. The bit-mask `GPM_BARE_EVENTS' is provided to extract bare events, by and-ing (`&') it with the `type' field. For any event, exactly one bit will be set in the resulting bitmask. Bare events are the following: `GPM_MOVE' A motion event, with all buttons up. `GPM_DRAG' A motion event, but one or more buttons are kept pressed. `GPM_DOWN' A button press event. The `buttons' field will report which buttons are pressed after the event. `GPM_UP' A button release event. The `buttons' field will report which buttons are being released. Note that this is different from the previous case. `GPM_ENTER' This means "enter in the current Region of Interest", and such event can only happen if the high-level library is used. When the type is `GPM_ENTER', all the other fields are undefined. *Note High Level Lib::. `GPM_LEAVE' This is only delivered by the high level library, too. Events of type `GPM_LEAVE' have all other fields undefined. Cooked events are the following: `GPM_SINGLE' This bit may be set at button-press, drag and button release events, and can be used to identify a single press. The time interval used to choose a double click from two single clicks is set by a parameter in the daemon (configurable at daemon invocation). `GPM_DOUBLE' Used to identify a double click (press, drag, release) `GPM_TRIPLE' Used to identify a triple click (press, drag, release) `GPM_MFLAG' The "motion flag" is true if some dragging happened between button-press and button-release. It can be used by those applications which respond to events at button release. It is available at drag and release.  File: gpm.info, Node: Connection Details, Next: Default Handlers, Prev: Event Types, Up: Gpm Internals 3.4 Connection Details ====================== Each virtual console has a stack of clients attached to it. They talk to gpm by writing to a control socket and get mouse events by reading it. All the clients in the stack can receive events. Gpm-1.10 and earlier only sent events to the top client, but sometimes users play with multiple programs using suspend-resume (thanks Ian). In addition to the per-console stacks, another stack is there to store default-handling clients. *Note Default Handlers::. Each client registers with the server and tells which events it is interested in. Events not managed by the client can be handled by the selection mechanism, which is compiled in the server itself. This approach simplifies writing clients which respond only to button press/release events, because highlighting the mouse pointer can be performed by the server. A default handler in turn can respond only to mouse events associated with modifier keys, so that selection is used for any mouse-only event. Clients are required to fill a `Gpm_Connect' structure and pass it to the server. The structure is made up by four `unsigned int' fields. *Note Open and Close::. `eventMask' A bitmask of the events the client wants to receive. Both bare and cooked events are allowed to appear in the mask. `defaultMask' A mask to tell which events allow a default treatment (the selection one). These are mouse events, independent of the modifier keys. `minMod' The minimum amount of modifiers required by the client. This field is used for default-handlers which manage control-mouse events without interfering with mouse-only ones. *Note Default Handlers::. `maxMod' The maximum amount of modifiers the client is willing to receive. Events featuring a modifier key not included in `maxMod' won't be passed to the client. Two more fields are there to tell about the connection itself, and you're not asked to fill them, because `Gpm_Open' will do it for you. `int pid' The process id of the connecting application. `int vc' Which virtual console to gain control of. Keyboard modifiers are used to multiplex clients on the same virtual console. You (as a programmer) don't need to care about the internal workings. They are detailed in *note Default Handlers::, but you only need to choose the right values for your application. Examples: `minMod=0; maxMod=0;' specifies a client which senses mouse-only events, but neither shift-mouse nor alt-mouse nor control-mouse. `minMod=0; maxMod=~0;' is a client which gets any mouse event. `minMod=1< /tmp/du" } button 3 { name "jump" foreground black background red border bright yellow head bright yellow "tty1" f.jptty "1" "tty2" f.jptty "2" "tty3" f.jptty "3" "tty4" f.jptty "4" "tty5" f.jptty "5" "tty6" f.jptty "6" "" f.nop "more of them..." { "tty 17" f.jptty "17" } } The syntax for the file won't be described here, being it quite apparent from the example above. Blanks and newlines are unused in parsing the file, and the layout of the file is free. Comments are allowed in the file: any hash mark (`#') found at the beginning of the line or after white space makes the parser discard anything up to the next line. To insert quotes (`"') in strings precede them with a backslash. Note that recursive menus are allowed, to any level of recursion. Keywords belong to three groups: the button keyword, the cfg keywords and the action keywords. They are all described in the table below: `button NUMBER MENU' The `button' keyword is used to introduce a menu. It is followed by the number of the relevant button (1=left, 2=middle, 3=right), an open brace, a menu and a closed brace. A menu is made up of cfg statements, followed by action statements. Cfg statements can come in any order, while the order of action statements tells the actual order in which actions will appear on the screen, top to bottom. The following statements belong to the cfg set. `name STRING' If the `name' keyword is present, the specified STRING will be used as the name for the current menu. `background COLOR' This statements is used to specify the background color to be used in the current menu. The COLOR can be specified with one of the eight canonical strings `black', `red', `cyan' etc. The background defaults to black. `foreground COLOR' This statements is used to specify the foreground color for menu items. Its value defaults to `white'. An optional `bright' keyword can appear before the actual color. `border COLOR' `border' is used to specify the border color for the menu. Its value defaults to `white'. An optional `bright' keyword can appear before the actual color. `head COLOR' `head' is used to specify the foreground color for the title of the menu. Its value defaults to `white'. An optional `bright' keyword can appear before the actual color. The following statements belong to the action set. `STRING f.fgcmd CMDSTRING' When the mouse button is released above the corresponding menu item, the CMDSTRING is pasted in the keyboard queue of the current console. This is not yet implemented. `STRING f.bgcmd CMDSTRING' When the mouse button is released above the corresponding menu item, a shell (`/bin/sh') is forked to execute the specified command, with `stdin' connected to `/dev/null', and `stdout', `stderr' connected to the active console. `STRING f.jptty TTYNUMBER' When the mouse button is released above the corresponding menu item, the console is switched to the one specified. The TTYNUMBER must be specified as a string. Any tty can be reached this way, even those which are not accessible via the keyboard. `STRING f.mktty TTYNUMBER' When the mouse button is released above the corresponding menu item, an unused console is selected, and `/sbin/mingetty' is executed in it. The current console is switched to the newly opened console. I use this command to save kernel memory by opening a single console through `/etc/inittab' and requesting the others only when i need to login. `STRING WHOLE-MENU' A menu can directly follow the label string. When the mouse pointer leaves the menu frame at the level of STRING, a second menu is posted on screen. `STRING f.lock' When the mouse button is released above the corresponding menu item, the keyboard and the screen are locked, and only the locking user or the superuser can unlock them. This is not yet implemented. `STRING f.load' The current loadavg when the menu is posted is concatenated to STRING to build the actual message displayed on screen. Nothing happens at button release. `STRING f.free' The free memory and swap when the menu is posted is concatenated to STRING to build the actual message displayed on screen. Nothing happens at button release. `STRING f.time' The current time is formatted with strftime(3), according to STRING. The resulting string is the actual message displayed on screen. Nothing happens at button release. `STRING f.pipe CMDLINE' When the mouse pointer leaves the menu frame at the level of STRING, a message box is posted on screen showing the last ten lines of the output of CMDLINE. CMDLINE is executed by `/bin/sh'. This is not yet implemented. `STRING f.nop' This does nothing, it only displays STRING on the menu. The `HOME', `LOGNAME' and `USER' environment variables are setup to the values for the invoking user before spawning an external process (`f.bgcmd', `f.pipe'). The current directory is always `/'. Known bugs have been fixed. In particular, if you invoke `gpm-root' right after `gpm', it will delay a few seconds before trying to connect to the daemon.  File: gpm.info, Node: hltest, Next: mouse-test, Prev: gpm-root, Up: Demo Clients 5.5 `hltest' ============ High-level test is a simple sample application using the high-level library. It implements something like a window manager for text windows, though it is small and unuseful. The application is meant to be read by programmers trying to use the high-level library. It is equipped with event reporting to help in understanding the internal workings.  File: gpm.info, Node: mouse-test, Prev: hltest, Up: Demo Clients 5.6 `mouse-test' ================ This experimental and incomplete application tries to help in detecting which protocol does your mouse speak. It is able to detect MouseMan devices, and to choose between `-t ms' (three-buttons aware) and `-t bare' old two-buttons-only serial mice. I know the application is buggy, but I only own one mouse device. If you are interested in this application, just call me and awake me from my laziness.  File: gpm.info, Node: Type Index, Next: Function Index, Prev: Demo Clients, Up: Top Type Index ********** [index] * Menu: * Gpm_Connect: Connection Details. (line 26) * Gpm_Event: Events. (line 13) * Gpm_Handler: Handling Functions. (line 11) * Gpm_roi: Concepts. (line 12)  File: gpm.info, Node: Function Index, Next: Variable Index, Prev: Type Index, Up: Top API Index ********* [index] * Menu: * Gpm_CharsQueued: Getting Events. (line 17) * Gpm_Close: Open and Close. (line 34) * GPM_DRAWPOINTER: Utility Functions. (line 14) * Gpm_DrawPointer: Utility Functions. (line 13) * Gpm_FitEvent: Utility Functions. (line 25) * Gpm_FitValues: Utility Functions. (line 24) * Gpm_FitValuesM: Utility Functions. (line 23) * Gpm_Getc: Getting Events. (line 31) * Gpm_Getch: Getting Events. (line 42) * Gpm_Getchar: Getting Events. (line 32) * Gpm_GetEvent: Getting Events. (line 7) * Gpm_GetLibVersion: Extra Functions. (line 7) * Gpm_GetServerVersion: Extra Functions. (line 16) * Gpm_GetSnapshot: Extra Functions. (line 29) * Gpm_HandleRoi: hl-Functions. (line 40) * Gpm_LowerRoi: hl-Functions. (line 34) * Gpm_Open: Open and Close. (line 7) * Gpm_PopRoi: hl-Functions. (line 25) * Gpm_PushRoi: hl-Functions. (line 8) * Gpm_RaiseRoi: hl-Functions. (line 29) * Gpm_Repeat: Utility Functions. (line 7) * Gpm_UseRoi: hl-Functions. (line 20) * Gpm_Wgetch: Getting Events. (line 41)  File: gpm.info, Node: Variable Index, Prev: Function Index, Up: Top Variable Index ************** [index] * Menu: * gpm_current_roi: hl-Variables. (line 11) * gpm_data: Variables. (line 44) * gpm_fd: Variables. (line 16) * gpm_flag: Variables. (line 9) * gpm_handler: Variables. (line 44) * gpm_hflag: Variables. (line 40) * gpm_morekeys: Variables. (line 48) * gpm_mx: Variables. (line 30) * gpm_my: Variables. (line 30) * gpm_roi: hl-Variables. (line 7) * gpm_roi_data: hl-Variables. (line 20) * gpm_roi_handler: hl-Variables. (line 17) * gpm_tried: Variables. (line 12) * gpm_visiblepointer: Variables. (line 26) * gpm_zerobased: Variables. (line 20)  Tag Table: Node: Top1250 Node: Overview1483 Node: Building the Release3258 Node: Server Invocation3679 Node: Special Commands4867 Node: Command Line7280 Node: Bugs and Problems13886 Node: Mouse Types14757 Node: Gpm Internals24599 Node: Events25477 Node: Margins27957 Node: Event Types29075 Node: Connection Details31086 Node: Default Handlers35086 Node: The ClientLib36659 Node: Handling Functions37340 Node: Low Level Library40205 Node: Variables40698 Node: Open and Close42796 Node: Getting Events44769 Node: Utility Functions47008 Node: Extra Functions48591 Node: High Level Lib51013 Node: Concepts51961 Node: hl-Variables53357 Node: hl-Functions54028 Node: Xterm56557 Node: Demo Clients57675 Node: mev57905 Node: sample/rmev61117 Node: Emacs Support61620 Node: gpm-root63722 Node: hltest72077 Node: mouse-test72544 Node: Type Index73057 Node: Function Index73485 Node: Variable Index75300  End Tag Table gpm-1.20.4/doc/infofilter010070000017500001750000000003261076632743400140630ustar00niconico00#! /usr/bin/sed -f # allow "%" as a comment char s/^%/@c / s/[^\\]%.*$// s/\\%/%/ #preserve blanks in @lisp blocks /@lisp/,/@end lisp/ p /@lisp/,/@end lisp/ d # remove leading blanks s/^[ ]*// #s/\\t/@code/g gpm-1.20.4/doc/manpager010070000017500001750000000043341076632743400135170ustar00niconico00#! /usr/bin/awk -f # Copyright (c) 1998-2001 Alessandro Rubini BEGIN {IN=0} /^%MANPAGE END/ {IN=0; next} /^%MANPAGE/ {IN=1; USELP=NEEDLP=INTABLE=0; NAME=$2; next} IN==0 {next} /^%MSKIP/ {SKIP=1;next} /^%M/ {SKIP=0} /^@menu/ {SKIP=1;next} /^@end menu/ {SKIP=0;next} SKIP==1 {next} /^%M$/ {next} /^@ignore/ {next} /^@end ign/ {next} #now perform all the substitutions needed { gsub("^%M ?",""); } # Use gensub for converting tags: itz Sep 30 1998 # # However, the gensub function is gawk-specific, and we want things # to work with original-awk too (for portability). # Therefore, use a normal gsub, even though it's a subobptimal solution # as it may step in extra braces. The good solution will be piping to sed, # or match, extract subesxpression, replace, reinsert -- bleah... # (ARub, Oct 10 2000) /@b\{/ { #$0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); gsub("@b\{","\\fB"); gsub("\}","\\fP"); } /@var\{/ { #$0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); gsub("@var\{","\\fB"); gsub("\}","\\fP"); } /@(samp|code|file)\{/ { #$0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); gsub("@(samp|code|file)\{",""); gsub("\}",""); } /@xref\{.*\}\./ { gsub(/@xref\{.*\}\./,""); } /@ref\{.*\}/ { gsub("@ref\{",""); gsub("\}",""); } /@\*/ { gsub(/@\* */,"\n.br\n"); } /@[a-z]+\{/ { gsub("@[a-z]+\\{",""); gsub("}",""); } /^@table/ { TABLE=1; } /^@itemize/ { TABLE=1; next} /^@item/ { gsub("^@item *",""); printf ".TP\n%s\n",$0 > NAME; NEEDLP=0; next; } /^@end table/ {TABLE=0} /^@end itemize/ {TABLE=0} # discard other texinfo commands /^@/ {next} # manage comments and '%' /^%/ {next} { gsub("[^\\\\]%.*$",""); gsub("\\%","%"); } # remove leading blanks /^[ \t]/ {gsub("^[ \t]","");} # put a .LP at blank lines /^.nf/ {USELP=0} /^.fi/ {USELP=1} /^$/ {if (USELP) {NEEDLP++; next;} } /./ { if (NEEDLP) { printf "\n.LP\n" > NAME; NEEDLP=0; } } /^.TH/ {USELP=1} # Escape single slashes (e.g. in documentation for `-l' command line option) {gsub("\\\\ ", "\\\\ ");} {gsub("~", "~~");} {print > NAME} gpm-1.20.4/doc/mktxt010070000017500001750000000011601076632743400130660ustar00niconico00#! /usr/bin/awk -f # This shouldn't contain any gawk specific features anymore # Program to create ascii from info; # Missing: table of contents # skip BEGIN {NODELINE=0; NODE=0; KEEP=1; printf "\n\n"} /^\037$/ { NODELINE=1; NODE=NODE+1; KEEP=1; next} NODE==1 { next } NODELINE==1 { NODELINE=2; sub("^.*Node: ","*Node: "); sub(",.*$",""); printf "\n\n\n%s",$0; #print next; } NODELINE { NODELINE=NODELINE+1 } NODELINE==4 { printf "\t\t\t\t"; } NODELINE==5 { printf "\t\t\t\t"; NODELINE=0} /^\*\ Menu:$/ { KEEP=0 } KEEP==0 { next } { print } gpm-1.20.4/doc/old004070000017500001750000000000001101736502000124545ustar00niconico00gpm-1.20.4/doc/old/Changelog010060000017500001750000002145241077613517400143740ustar00niconico002002-12-24 Nico Schottelius * removed src/prog/Makefile*: it's easier with one Makefile * some cleanups to Makefile.in,src/Makefile.in ==> gpm-1.20.1 release 2002-12-02 Nico Schottelius * added src/prog, src/lib so I don't confuse library / program and normal source files... * modified src/Makefile.in to fit latest the new directory structure * added src/prog/Makefile.in, src/lib/Makefile.in 2002-11-30 Nico Schottelius * today leaving the hospital -> gpm-1.20.1rc2 will be released, minor fixes/patches will be accepted until 15th of Decembre...after that stable 1.20.1 should be out. 2002-11-26 Nico Schottelius * gpn.c: moved some opt_ to option. structure * gpn.c: cleanup up cmdline * startup_n_daemon.c renamed to startup.c as the demon part is old_main * server_tools.c: added prototype of init_mice * server_tools.c: added prototype of reset_mice * -u paramter for autodetection implemented, autodetect() is still missing * removed headers/gpmInt.h from gpm-root.y * updated -h informations * added -DSYSCONFDIR patch from Ben Pfaff -> synaptics should work again 2002-11-23 Nico Schottelius * some minimal changes to the Makefile.in, make dist works perfectly now! * typo in MANIFEST * removed gpmCfg.h from source tree. Merged with gpmInt.h => configuring a program via header files is not necessary. => either we tune things with ./configure or parameters * removed gpm-proto.h as it is not used. * added GPM_RELESE_DATE * replacing date in doc/doc.gpm.in with @release_date@ 2002-11-22 Nico Schottelius * heavy work on -M,-o,-m,-t -> gpn.c,server_tools.c,...more description follows * added add_mouse in server_tools.c * added primary support for more than two mice * changes to gpn.c to let add_mouse work * updated doc/doc.gpm.in 2002-11-08 Nico Schottelius * added main.c, which will replace earlier main() function * correct the running gpm check, now we start with a stale pidfile, too. * added new struct options option * next release will have the name 'gpm Autumn', cvs has this name right now 2002-07-17 Dmitry V. Levin * bugfix: restored fields order in struct Gpm_Event to avoid ABI change. 2002-06-30 Nico Schottelius * removed some files, updated cvs. 2002-05-31 Nico Schottelius * applied patch from Kerry Scott McLeod , which fixes some gpm_open() problems (gpm06122002-cvs-tty.patch) 2002-05-31 Nico Schottelius * included latest updates to the synaptics driver from peter berg larsen (patches/done/applied/diff_synaptics_c_7.gz) 2002-05-27 Nico Schottelius * together with Alessandro's help there is now cvs access to gpm * added Sven Dickert's patch - ms3 wheel / repeater - imps2 wheel (partly changed to match current code) * updated README * updated src/report.c: removed now unecessary \ns * updated TODO * moved ChangeLog to Changelog 2002-05-11 Nico Schottelius * updated the FAQ * fixed problem with long filenames through linking (src/Makefile.in) * added VSXXX-AA ("hockey puck") mice support: patch from "Maciej W. Rozycki" * fixed minor problems with libgpm.so (shlib-patch, Maciej W. Rozycki) 2002-04-26 Nico Schottelius * most of the exams are written, so time is back for gpm: applied 3/4 of Peter Berg Larsen's [pebl@math.ku.dk] synaptics patch * added doc/HACK_GPM, added a note in README 2002-03-11 Nico Schottelius * replaced 2spaces/tabs with three spaces in synaptics.c * removed DEBUG_SYNAPTICS in synaptic.c 2002-03-10 Nico Schottelius * added doc/support for vendor information about mouse support. first document is from logitech 2002-03-03 Nico Schottelius * added M_imps2 patch, which looks now for unsigned data instead of signed (Paul ...) * applied ms3 repeater patch from Andrew 2002-02-28 Nico Schottelius * removed warnings about labels (missing semicolon at the end of switch() statement) * added stdlib.h for exit() to report-lib.c 2002-02-24 Nico Schottelius * changed DEF_CLUSTER from 10 to 0 in headers/gpmCfg.h. This makes the mouse faster on modern machines, slower on 386. (Proposal by Andrew Pimlott and Alessandro Rubini) * add DEF_CLUSTER into doc/FAQ if the mouse is too slow. 2002-02-23 Nico Schottelius * bugfix: problems in processConn/devfs code. snprintf() didn't work the way I expected, so sprintf() and strncpy are used. * bugfix: gpm-root won't compile outside the srcdir (Makefile problem) ==> released gpm-1.20.0 2002-02-22 Nico Schottelius * bugfix: sedsid() in gpn.c should only be executed, if running as daemon ==> gpm -D works now fine again. * bugfix: if condition in gpm.c, gpm_exited() must leave ==> removing gpm.pid works again. * bugfix: hltest.c: could possibly run with devfs and without it... * modifications to Makefile.in 2002-02-20 Nico Schottelius * removed gpm_oops and replaced it with gpm_report(GPM_PR_OOPS) although the report function should normally not exit....but this way we can decide better, if we should take _exit() or exit(). A simple 'for file in *.c gpm-root.y ; do cat $file | sed 's/gpm_oops(FL/gpm_report(GPM_PR_OOPS/g' > $file.new; mv $file.new $file; done' did all the work. * added GPM_PR_OOPS to headers/message.h * updated check_kill(): we don't need opt_kill, if -k is specified we kill, so we can call check_kill() directly. * removed unecessary global variable opt_kill * updated check_uniqueness: removed unecessary code. made everything more simple. * moved devfs parts to gpmInt.h (where it belongs to...) * removed debugging in gpmInt.h 2002-02-10 Nico Schottelius * replaced two with three spaces in mouse-test.c (possibly cindent would have helped, too. But I didn't use it until today) 2002-02-10 Nico Schottelius * renamed the oops() function to gpm_oops() so we don't pollute user space! 2002-02-10 Nico Schottelius * added patches from Andreas Mohr: fixed many typos, added descriptions, removed warnings (that were patches I really like, although they were diffed against gpm-1.19.6.) This first patch also included I_ps2, R_ps2 2002-02-06 Nico Schottelius * added report-lib.c: this is used in libgpm. * added tools.c: used by clients (libgpm) and server. (Gpm_Open) * added event device patch * updated gpm-root.y * fixed minor bug in src/Makefile.in * 2->3 spaces in mev (via contrib/scripts/replace_2_with_3_spaces * released gpm-1.20.0-gamma to mailing list. 2002-02-04 Nico Schottelius * checked twiddler.c: indent is now okay and gpm_report,too. 2002-02-02 Nico Schottelius * checking new functions/debugging other problems in gpm.c,gpn.c, mice.c,liblow.c * replaced tabs in mice.c with 3 spaces. * removed more 'bad' report code (fprintf(stderr, .. ) is deprecated!) 2002-01-29 Nico Schottelius * removed default device completly. (gpm.c) * added x_high_y() and cnt_digits() * replaced all 2/4 spaces in gpn.c with 3 spaces. 2002-01-14 Nico Schottelius * applied patch from Blaise Gassend : - added an imps2 repeater - slight changes to imps2 and synps2 so that roller motions could be generated * applied gpm-1.19.6-rh-gpm-root.diff from Solar Designer * updated MANIFEST: patches are now included in the gpm source tarball. * update src/headers/message.h: added new messages * cleanup intetion level in gpm.c: now 3 spaces is the standard. this makes no problem with tabs! other files follow... * cleanup some old oops() calls, which are now oops(FL), as oops is not an macro anymore. (gpm.c) * cleanup some old gpm_debug_log calls. * added FIXME directives for people, who have time to fix some code. 2002-01-08 Nico Schottelius * applied awk patch from Jason Gurtz and Mark Hymers (markh@linuxfromscratch.org) 2002-01-07 Nico Schottelius * updated TODO file. * removed -V option (currently gpm_debug_level is not supported anymore) * added #defines for message strings to message.h * renamed check_devfs to get_console * added some initializations to Gpm_Open 2002-01-05 Nico Schottelius * finished report.c (gpm_report) which should replace all output functions now * removed devfs.c (last devfs code is now in gpn.c) * removed debuglog.c (all messaging is done through report now) * removed headers/wd.h, moved parts into headers/message.h * begin to remove debuglog code. (was not clear enough) * updated headers/gpmInt.h * applied following pataches: - gpm-1.19.3-owl-warnings.diff (removed strings.h include)[Solar Designer] 2001-12-02 Nico Schottelius * added sample initscript from Solar Designer to contrib/init 2001-11-06 Nico Schottelius * removed src/Makefile.dep, added easy dependencies * removed headers/general.h, defines.h, gpm-mess.h * cleaned up doc/Makefile.in * primary ROOT support (for installing in virtual tree) 2001-10-03 Nico Schottelius * moved doc/doc.gpm to doc/doc.gpm.in, version is replaced by configure 2001-10-02 Nico Schottelius * added src/Makefile.dep, which produces dep files for src/Makefile. * updated MANIFEST, README * removed devfs from mouse-test.c, it's not needed there. 2001-09-27 Nico Schottelius * added double include protection into new header files * gpm.c: removed unecessary variables. fixed possible problem with braces. thanks to gcc -Wall * devfs.c: fixed some static problems stuff * liblow.c/twidler.c: removed global variable consolename * mice.c: added missing string.h, added braces. removed variables. * src/Makefile.in: removed ELISP, those files are in contrib/ now 2001-09-23 Nico Schottelius ***** Release 1.19.5 * fixed libc5 and Linux 2.0 problems * new problem with the main Makefile 2001-09-13 Nico Schottelius * Makefile fixes (doc/) * minor devfs changes * added synaptics patch: now all 4 buttons of touchpads are supported. (Chun-Chung Chen supplied this patch) 2001-09-08 Nico Schottelius * new directory structure * new file structure * bug in liblow.c fixed: thanks to Jakub Bogusz 2001-09-04 Nico Schottelius * removed from source, so we can compile under Linux 2.0 * rewrote parts of the readme, updated it 2001-09-02 Nico Schottelius ***** Release 1.19.4 * introduced problems with libc5 and linux 2.0! 2001-08-21 Nico Schottelius * several files: applied some old patches (imps autodetect, mktemp secure problem, IntelliMouse Explorer), preparing next gpm release. 2001-04-23 Nico Schottelius * gpm.c: removed default taking of /dev/mouse (problem with devfs). Instead print help message, to use the -m 'dev' option 2001-04-22 Nico Schottelius * gpm.c, liblow.c, mouse-test.c: primary devfs support added. Now gpm will at least start, but some of the hardcoded ttys are still there. 2000-07-18 Alessandro Rubini * doc/doc.gpm (Command Line): removed "-q" documentation. 2000-07-16 Ian Zimmerman * gpmInt.h (GPM_REQ_NOPASTE): add this to replace GPM_REQ_CONFIG. * Makefile.in (GOBJ): no longer link gpm with liblow.o, it was only needed for disable-paste. * doc/doc.gpm (Command Line): remove part about needing setuid in disable-paste. * gpm.c (disable_paste): replace xfer_options with this function. (opt_quit): remove. (processRequest): replace xfer_options call with disable_paste(). (processRequest): replace GPM_REQ_CONFIG with GPM_REQ_NOPASTE. * gpn.c (cmdline): remove all code dependent on opt_quit. (cmdline): remove 'q' from getopt argument. (xfer_options): remove. 2000-07-14 Ian Zimmerman * Makefile.in (install): no longer install disable-paste with mode 4755. * gpn.c (xfer_options): make a normal connection (Gpm_Open(*,0)) rather than a "default" one (Gpm_Open(*,-1)); with identification, default connections must be made as root (at least when setuid root), and disable-paste no longer runs as root per the previous entry. * gpm.c (processConn): if SO_PEERCRED is defined (which it is at least with 2.2.* kernels), use the getsockopt(SO_PEERCRED) interface to identify the client, rather than checking the name bound to the peer. Security problem reported by Olaf Kirch (processConn): close the newly accept()ed socket in case of identification failure. (main): remove initial setuid(0) call; as reported by Olaf Kirch this is a general security problem because it makes a setuid process appear to be a genuine root process to libc internals. (main): add a geteuid()==0 check after option processing and before main loop. * liblow.c (Gpm_Open): if SO_PEERCRED is defined (which it is at least with 2.2.* kernels), do not bind the client side of the gpm socket. * t-mouse.el (t-mouse-tty): merge patch by Wolfgang Sourdeau to deal with yet another and different version of procps. 2000-04-19 Koblinger Egmont ***** Release 1.19.2 * gpm-root.y (f__fix): added initgroups() to definitely fix sec. hole 2000-03-31 Alessandro Rubini ***** Release 1.19.1 * contrib/Makefile.in: use @release@ as needed * contrib/: added new patches and reasons why I didn't apply them I'll put further patches in ftp://ftp.prosa.it/pub/gpm/patches 2000-03-30 Alessandro Rubini * gpn.c (find_mouse_by_name): fix by Chris Ruhel (failed for synonyms) * README.gunze: updated to refer to /dev/touchscreen * gunze-setup: added missing line (bugfix) and changed default device to /dev/touchscreen if available. * gpm-root.y (f_bgcmd): avoid calling setuid, do it last instead (still doesn't use initgroups(), I'll let this to others 2000-03-07 Alessandro Rubini ***** Release 1.19.0 * contrib/: new directory, with contributed and unapplied patches * README: gpm is officially unmaintained 2000-02-07 Alessandro Rubini * gpm.c (getMouseData): downgraded "Error in protocol" to LOG_DEBUG 2000-02-02 Stefan Runkel * mice.c (I_wacom, M_wacom): new Wacom IV protocol driver * doc/doc.gpm : Wacom Item updated 2000-02-01 Alessandro Rubini * gpm.c (processMouse): re-check console size on console change (get_console_size): preserve pointer position even if size changed 2000-01-27 Roberto Amucano * liblow.c (Gpm_CharsQueued): new function 2000-01-20 Alessandro Rubini * MANIFEST: new file, used in "make dist" as well * sample/rmev.c (main): reverted too. * sample/*.in: reverted to the older standalone implementation * configure.in: don't create sample/Makefile * doc/localstyle.tex: removed unused file * configure.in: changed versions (program and library) 2000-01-19 Alessandro Rubini * doc/doc.gpm (Bugs and Problems): removed the pre-1.0 bug. (Mouse Types): Moved chapter: from "internals" to "server invocation" (Mouse Types): added the man page gpm-types.7 * tools/b2x.c: new directory and new file, to help with new protocols * doc/doc.gpm (Mouse Types): added description of gunze 2000-01-17 Alessandro Rubini * several files: changed maintainership and attributions * *.[ch] */*.[ch]: fixed address of FSF (now in Boston) * README doc/doc.gpm: fixed references to /usr and /usr/local 2000-01-17 Ian Zimmermann * doc/Makefile.in: renived dependency on Makefile * Makefile.in: removed dependency on Makefile where not needed 2000-01-16 Alessandro Rubini * mice.c (M_mman): removed unneeded message about extra byte 2000-01-14 Alessandro Rubini * xf86Summa.*: the files have been added to CVS, for easy retrivial * mice.c (I_gunze, M_gunze): new touchscreen protocol supported * gunze-setup: new file (needs to be merged with microtouch) * README.gunze: new file (needs to be merged with microtouch) * gpn.c (find_mouse_by_name): bugfix: didn't find repeater name 2000-01-13 Alessandro Rubini * gpm.c (build_argv): bugfix, didn't parse multiple options. * mice.c (parse_argv): new function, used by mouse initialization 2000-01-10 Alessandro Rubini * gpm.c (get_data): avoid a message which is duplicated anyways * liblow.c (Gpm_GetEvent): avoid the message if no data is there 2000-01-05 Ian T Zimmerman * mev.c (main): continue if select is interrupted 2000-01-04 Alessandro Rubini * mouse-test.c: various changes to fit the new mice.c layoutq * mice.c: use new prototype for init function, and print errors if too many options are passed (option_modem_lines): use the "dtr", "rts" and "both" options for serial devices. * gpn.c (find_mouse_by_name): new function, using the sysnonym field as a list of alternative names (cmdline): changed use of the -o option (cmdline): avoid closing stderr (init functions must print errors) * gpmInt.h (Gpm_Type): rename "syn" to "synonyms", and changed its use (Gpm_Type): changed prototype of the init function (mouse_feautres): removed "opt_toggle", added "opt_options" * gpm.c (build_argv): new function, used for "-o" (wait_text): remove action on RTS and DTR, as it is in done in dev init (main): create the argv associated to each device, don't act on DTR * doc/doc.gpm (Mouse Types): revised and completed this list (Command Line): documented the new "-o" option * debuglog.c (gpm_oops): always print to stderr as well 1999-12-08 Alessandro Rubini * liblow.c (gpm_convert_event): use "unsigned char" for conversion of xterm data (suggested and partially done by Christian Weisgerber) -----> 1.18.1 released 1999-11-07 Alessandro Rubini * configure.in (release): 1.18.1 * mice.c: new Wacom decoder, contributed by Stefan Runkel . Also a flag marking mouse types that offer a repeater. 1999-10-07 Alessandro Rubini * README: added a paragraph about the CVS repository * Makefile.in: removed ".SECONDARY" for gpm-root.c * gpm-root.y (getdraw): lowered the loglevel for stat(user) 1999-09-12 Ian T Zimmerman * doc/doc.gpm: Update version and update-month. * configure.in (release): Bump to 1.18.0. 1999-08-05 Ian T Zimmerman * mice.c (M_wp): Matt Kimball writes: A few weeks ago I asked for help getting my Genius WizardPad tablet to work. (The 'acecad' driver got it to talk back, but gpm couldn't understand). Well, this morning I got the technical spec for my tablet from the Genius people, and as of right now I am actually able to use my tablet as my only pointing device under X. Woohoo! To do it, I actually added support for the WizardPad to gpm and set gpm in Summa repeater mode. Thanks gpm folks for making it so easy to get my tablet working in so little time! (After getting the specs, of course). Attached is a patch against gpm which provides support for the WizardPad protocol. It turns out that it isn't related to the one that 'acecad' is using at all. It just happened that 'acecad' sent some things which made the WizardPad talk back. Mon Jun 28 07:18:44 1999 Ian T Zimmerman * doc/doc.gpm: Changed info file category because gpm is not really part of Emacs. Thu May 27 23:20:15 1999 Ian T Zimmerman * synaptics.c (ser_read): Apply patch by Henry to allow the touchpad to be ignored if it is unplugged. Tue May 11 18:57:15 1999 Ian T Zimmerman * mice.c: Geert Van der Plas provided the code to support older Synaptics PS/2 touchpads. * synaptics.c: Geert Van der Plas provided the code to support older Synaptics PS/2 touchpads. * mice.c (M_summa): realposy should be 0 based. Fri May 7 22:28:38 1999 Ian T Zimmerman * configure.in (release): Bumped to 1.17.8 * synaptics.c: Fixes by Henry Davies * README: Fix email addresses, contributed by Davide Barbieri Tue Apr 20 07:12:57 1999 Ian T Zimmerman * aclocal.m4: Add ITZ_CHECK_TYPE. * configure.in: Use ITZ_CHECK_TYPE. * liblow.c (Gpm_Open): Before trying ttyname(0) etc., check that the file number refers to a tty device in the first place. This is because libc 5 implementation of ttyname() can be wastefully slow. Antonio Colombo Tue Apr 6 02:22:31 1999 Ian T Zimmerman * configure.in: Change way we deal with presence or absence of __u32, due to glibc header differences. Dan Yefimov (release): Stepped release to 1.17.7 Wed Mar 31 00:03:38 1999 Ian T Zimmerman * doc/doc.gpm (Demo Clients): Split index into Type, Function, and Variable indices. It was getting unwieldy. (Mouse Types): Corrected mtouch item in mouse types. * configure.in (release): Bumped release number to 1.17.6. * Makefile.in (DIFFS): Add the microtouch files. * mice.c (M_mtouch): Add Alessandro's MicroTouch tablet decoder. * doc/doc.gpm (Mouse Types): Add info about microtouch device type. * README: Update information about mailing list and Alessandro's current address. * libxtra.c (Gpm_GetSnapshot): More defensive checks for the case of missing gpm binary. * mouse-test.c (main): Replaced makedev with gpm_makedev for compatibility with glibc2. Reported and fix suggested by David Monniaux . Tue Mar 30 23:59:47 1999 Ian T Zimmerman * mev.c (do_snapshot): Now checking for error return from Gpm_GetSnapshot. Sat Mar 27 22:01:35 1999 Ian T Zimmerman * doc/doc.gpm: Removed redundant @findex lines (@deftypefun creates an index entry atomatically). This didn't do any harm when processed by makeinfo, but it confuses stupid texi2html into producing 2 identical index entries. Tue Mar 2 00:29:40 1999 Ian T Zimmerman * mev.c (do_snapshot): Check return value from Gpm_GetSnapshot, barf loudly if it fails. (Alessandro Rubini , who really should run "make install" someday :) * mice.c: Apply patches from Frank Holtz to handle Acecad tablets; and from Alessandro Rubini to fix stale comments about format of mouse type table. Thu Feb 18 21:21:56 1999 Ian T Zimmerman * gpm.c (processMouse): Apply latest patch from Frank Holtz to produce more isotropic moves. * mice.c (M_summa): Add Frank Holtz's Summa protocol support, at last. This really needs testing. But I suppose we'll hear about any bugs even without asking. Wed Feb 17 21:51:00 1999 Ian T Zimmerman * gpn.c (check_kill): Really unlink the stale pid file, not jusk talk about it. * doc/doc.gpm (Command Line): Improve description of the -V option as suggested by Mircea Damian . (Linux in Romania -- world domination must be really close now). Mon Feb 15 10:25:53 1999 Ian T Zimmerman * synaptics.c: Make source likable to Emacs (function-opening braces in column 1 please). (syn_read_config_file): Config file should go to /usr/etc (ie. SYSCONFDIR), look for it there. * mice.c (I_serial): Assume synaptics device needs baud rate notification like other serial mice. * Makefile.in (%.elc): Correct Emacs byte compilation rule for backward compatibility. * mice.c: Add Synaptics support from Henry Davies . * Makefile.in (DIST): Add Synaptics support files from Henry Davies . Sat Feb 13 10:27:35 1999 Ian T Zimmerman * gpm.c (processMouse): Add Frank Holtz's code for repeating from absolute protocols, with the deletion of some device-specific and resolution-specific stuff. This should be tested, somebody with an absolute device please run "gpm -R msc" and see what happens in X. * mice.c: Add Frank Holtz's SummaSketch driver. It is disabled for nonce because of continuing confusion over that protocol. Anybody with better people/communication skills than I have is encouraged to contact Frank and make sure his contribution (which is very welcome in principle) conforms to gpm's design and coding pratices. * mev.c (main): Stop immediately if I discover I run in xterm. * doc/doc.gpm (mev): Document newly missing xterm functionality. Sun Jan 24 09:03:47 1999 Ian T Zimmerman * Makefile.in (DIST): Add exec.el back in. Thu Jan 14 12:47:53 1999 Ian T Zimmerman * doc/manpager: Handle @file{} as well. * doc/doc.gpm: Hardcode major release number back in. Argh. Fix more formatting in manpages. * doc/Makefile.in (%.texinfo): Roll back this ill-considered change; it forces re-TeXing gpm.texinfo. (TEXI2HTML): Be consistent and make option part of make variable. Wed Jan 13 21:21:03 1999 Ian T Zimmerman * doc/doc.gpm: Fixed incosistent formatting, removed instances of gratuitous visual formatting. * doc/Makefile.in (%.texinfo): Give an additional script piece to sed to substitute for %RELEASE%. (%.html): Add rule for Web fanatics. Tue Jan 12 00:11:10 1999 Ian T Zimmerman * doc/manpager: Improve to italicize @var{} items. * doc/doc.gpm (Command Line): Document parametrized repeater, in particular raw repeater. Mon Jan 11 22:42:16 1999 Ian T Zimmerman * mice.c (mice): Add the repeat_fun fields. (R_msc): Add. * gpm.c: Apply patch from "Jan D." for raw repeater. (opt_repeater_type): Add. (repeated_type): Add. (processMouse): Use repeat_fun rather than hardcoding msc protocol in repeating. * gpmInt.h: Apply patch from "Jan D." for raw repeater. (opt_repeater_type): Add. (repeated_type): Add. (Gpm_Type): Add new method repeat_fun to handle the task of repeating a given mouse event in a particular protocol. * gpn.c: Apply patch from "Jan D." for raw repeater. (cmdline): Use an optional argument to -R rather than a new option. Barf if the repeat_fun method of requested protocol is null. Fri Jan 8 11:05:57 1999 Ian T Zimmerman * aclocal.m4: Change darned gcc test again because GCC variable is modified by AC_PREFIX_PROGRAM. Use ac_cv_prog_gcc instead. * gpm-root.y (get_winsize): use /dev/tty0 not /dev/console. (f.debug): disable undocumented f.debug function because it uses a file in /tmp in a fashion which invites symlink abuse. * mouse-test.c (main): exclude devices with a minor number of 130 from the device probe to avoid causing spontaneous reboots on machines where watchdog is used. Reported by Jim Studt , patch by James Troup . * gpn.c (usage): typo (s/an unexistent/a non-existent/). Patch by James Troup . * doc/manpager: Interpret only with gawk. Patch by James Troup . * aclocal.m4: Change broken test for gcc to use $GCC, not $CC. As reported by James Troup . Replace -fpic with -fPIC. As suggested by James Troup . Add dependency on libc to shared library linking flags. As suggested by James Troup . Thu Jan 7 21:36:46 1999 Ian T Zimmerman * doc/doc.gpm: Apply patch from James Troup fixing various typos and documenting the mouse-test program. Sun Jan 3 11:43:20 1999 Ian T Zimmerman * doc/Makefile.in (append-diff): diff exits with status 1 if it finds differences. Argh. (install): Make sure data files are installed with 644 mode. * Makefile.in (append-diff): diff exits with status 1 if it finds differences. Argh. (install): Make sure data files are installed with 644 mode. * gpmCfg.h (MAX_VC): Use MAX_NR_CONSOLES to define this if possible. * configure.in: Add a check for linux/tty.h. * doc/doc.gpm (Command Line): Document -A [limit]. * gpn.c (usage): Indicate that -A takes an optional parameter. (cmdline): Add setting of opt_age_limit depending on optional parameter to -A. * gpmInt.h (opt_age_limit): Add. * gpm.c (selection_paste): Add general aging test. Sun Dec 27 08:05:18 1998 Ian T Zimmerman * doc/doc.gpm: Add a directory entry for install-info. Sat Dec 26 17:05:22 1998 Ian T Zimmerman * Makefile.in (libgpm.so.@abi_full@): Start a new version number scheme for the shared library. This is intended to be compatible with libtool versioning, and the initial number is chosen with continuity in mind, so nothing needs to be recopmiled or even relinked. * configure.in: Rewrite auto-configuration rules per Autoconf Info page. * Makefile.in (config.h): Add config.h support to reduce build noise. Wed Dec 16 22:06:31 1998 Ian T Zimmerman * liblow.c (Gpm_Open): Use sigaction() instead of signal() to manipulate SIGWINCH and SIGTSTP; suggested i.a. by Jan Vroonhof to fix an infinite signal loop under XEmacs. * gpn.c (cmdline): Get rid of remaining uses of stderr (suggested by md@linux.it (Marco d'Itri)). * gpm.c (gpm_killed): Get rid of remaining uses of stderr (suggested by md@linux.it (Marco d'Itri)). * mice.c: Apply patch from John Anderson to support Calcomp UltraSlate tablets. * t-mouse.el (t-mouse-make-event): Applied patch from Tom Breton for braindead chords in t-mouse with 2 button mice. Tue Nov 17 23:10:04 1998 Ian T Zimmerman * configure.in (release): Step to 1.16.0 Mon Oct 5 22:00:19 1998 Ian T Zimmerman * Makefile.in (append-diff): Add some flags to the diff command (most important, --unidirectional-new-file). Wed Sep 30 11:08:59 1998 Ian T Zimmerman * doc/manpager: Add handling of forced line breaks, cross-references, and boldface (used for cross-references). * doc/doc.gpm: Fixed manpage cross-references. (Command Line): Mention disable-paste. Tue Sep 29 10:39:48 1998 Ian T Zimmerman * gpn.c (xfer_options): Move the option structure type into gpmInt.h to prevent stupid future problems. * Makefile.in (install): Add disable-paste (and make it setuid). * disable-paste.c (main): Add a new program (not a large one :) * mice.c (M_brw): Apply eb patch for broken Fellowes Browser mice. * sample/Makefile.in (append-diff): Added rules to recursively append to the diff file being created in top directory. * Makefile.in (DIST): Remove exec.el from the distribution because it is not needed anymore. Modern Emacs has en --eval command line option that allows me to do the same thing directly. * configure.in (ITZ_PATH_SITE_LISP): Use it. * aclocal.m4 (ITZ_PATH_SITE_LISP): Added. Mon Sep 14 18:03:45 1998 Ian T Zimmerman * doc/Makefile.in (gv): Replace "$(TARGET)" with "gpm". * Makefile.in (gpm-%-to-@release@.diff): Added rule to create a diff from snapshot of previous release. * mice.c: Reapply Edmund Grimley Evans' patch with new mouse types ms+ and ms-lr which get lost somewhere. Sun Sep 13 00:08:54 1998 Ian T Zimmerman * configure.in: Set CURSES_OBJS dependent on finding the curses header. Sat Sep 12 10:53:54 1998 Ian T Zimmerman * Makefile.in (LOBJ): Make the buliding of libcurses.o decided by configure again. * libcurses.c (Gpm_Wgetch): Remove the ELF assembler-dependent wgetch hack again, as it is not really needed as long as clients are linked statically. * gpm.c (processRequest): Removed GPM_REQ_CLEAR again, now that its functionality is available with the -A flag and opt_aged. * gpmInt.h: Removed GPM_REQ_CLEAR again, now that its functionality is available with the -A flag and opt_aged. * libxtra.c: Removed Gpm_ClearSelection() again, now that its functionality is available with the -A flag and opt_aged. * gpm.h: Removed Gpm_ClearSelection() again, now that its functionality is available with the -A flag and opt_aged. * mev.c (interact): Removed "clear" command again, now that its functionality is available with the -A flag and opt_aged. * gpmInt.h: Change signature of xfer_options(). Remove it altogether, it's better static and split to gpn.c and gpm.c. Add opt_aged. * gpn.c (check_uniqueness): Completely rewritten. This function was a messy mixture of different things. Wed Sep 9 09:50:59 1998 Ian T Zimmerman * libxtra.c (Gpm_GetServerVersion): Provide explicit path for popen of gpm daemon. * sample/Makefile.in (rmev.o): Added target because of usage of RMEV_RELEASE. (prefix): Looks like this has to be done in _every_ Makefile, sigh. Even if it is not used explicitly, configure subsitutes e.g. "@sysconfdir@" with "$(prefix)/etc". (sysconfdir): Added sysconfdir. * Makefile.in (gpn.o gpm-root.o twiddler.o): gpn.o added to this target because it uses RELEASE symbol substituted by configure. Tue Sep 8 14:04:44 1998 Ian T Zimmerman * mev.c (interact): Added case for "clear" command. * libxtra.c (Gpm_ClearSelection): Added. * gpmInt.h (GPM_REQ_CLEAR): Added (rubino's objection overruled; the gpm protocol is not really ugly, it's the code that is, in effect casting the data exchanged to Gpm_Conn and Gpm_Event. It could be coded cleanly or even fixed from present state, but don't hold your breath, you could suffocate.) * gpm.h: Add Gpm_ClearSelection. * t-mouse.el (t-mouse-swap-alt-keys): Added. This is what is called "personal variable" :-) I swap the left and right Alt keys in my Linux keytable, but I still want Emacs to handle left-Alt events. Wed Sep 2 00:09:42 1998 Ian T Zimmerman * doc/Makefile.in (maintainer-clean): Ignore errors because the file list can be empty. * sample/Makefile.in (maintainer-clean): -rm -i for uniformity. * Makefile.in (maintainer-clean): Ignore errors because the file list can be empty. * mouse-test.c (makedev): Add O_NONBLOCK to open ttyS devices (otherwise the program hangs in this function, at least on my system). * doc/doc.gpm (gpm-root): Use @file at several places in preference to other markup. Fix several other general documentation bugs, mostly referring to obsolete (non-)features. * doc/Makefile.in (.SECONDARY): Need both %.ps and gpm.ps --- looks like a gmake bug. * sample/gpm-xterm.h: Applied patch by Jean-Daniel for looking back when scanning arrow key sequences. * Makefile.in (datadir): Oops, need to define this if I define elispdir. GNU standard document a little incomplete on this point. Fri Aug 28 00:06:05 1998 Ian T Zimmerman * configure.in: Oops, autoconf hates newlines between filenames in AC_CHECK_HEADERS. * create_vcs: Create symlinks in /dev for the new (or old?) names mandated by kernel device list. * gpm-root.y (main): Check for both /dev/vcs and /dev/vcs0. Also check for correct device number. * configure.in: Check for sys/sysmacros.h and linux/major.h. Thu Aug 27 09:33:56 1998 Ian T Zimmerman * sample/Makefile.in: Add TAGS rule. * Makefile.in (libgpm.so.@release@): Change sed script to extract the major release number, now that there are 2 dots in the complete number. * configure.in (release): Now includes the patchlevel number, for instance 1.15.5. * sample/configure.in (release): Define this as RMEV_RELEASE. * configure.in (release): Define this as both GPM_RELEASE and RMEV_RELEASE. * gpmCfg.h: Delete RELEASE definition. (will be passed from configure). * sample/rmev.c (RMEV_DATE): Define from RCS checkin date. Delete RELEASE definition. (will be passed from configure). * gpmCfg.h (GPM_DATE): Define from RCS checkin date. * sample/gpm-xterm.c: Delete RELEASE definition. * Makefile.in: For submakes, add -lgpm to LIBS. Put do-all before @SHLIB@ in the rule for all; let's hope that means submakes will use the static library. Oops, that didn't work. Another try: name the shared library libgpm.so.@release@ maybe that way linker won't find it. * configure.in (GPMXTERM): This is needed because we now configure under sample. * Makefile.in: Add sample to subdirs for recursion. * sample/gpm-xterm.c: Include whatever curses header we can find. * sample/rmev.c (main): Rewrite to use termios to set raw terminal mode, not n?curses. * Makefile.in (top_builddir): Add top_builddir because it is now mentioned in @LDFLAGS@. * configure.in (CPPFLAGS): Add top_srcdir to the include path. (LDFLAGS): Add top_builddir to library path. Add sample/Makefile to output files. * sample/configure.in: Simplified to use default autoconf behavior where possible. Only look for n?curses if we're building without gpm. * sample/Makefile.in: Rewrite to be able to act as slave for toplevel. * doc/Makefile.in: Mostly rewritten to act as slave for toplevel Makefile. (mostlyclean): Instead of moving gpm.ps to a funny filename and then back just to delete all the gpm.?? files, let's just rename it permanently to gpmdoc.ps. Create a SECONDARY rule to avoid re-TeXing after gpm.ps has been renamed. * configure.in (lispdir): Set as recommended by GNU standard. * Makefile.in (DIST): Fix typo (create-vcs => create_vcs). (.SUFFIXES): Clear this before setting it. Magic suggested by the Standards Info file. (install): Add install-strip. Added subdirectory recursion magic. * configure.in: Rewrite for new Makefile. * aclocal.m4: Delete useless stuff. * Makefile.in: Complete rewrite, now conforms to GNU standard. * libcurses.c: Remove the curses argument, it's quite useless. Check for the curses header in reasonable places. * configure.in: Remove the curses argument, it's quite useless. Check for the curses header in reasonable places. * README: Fix references to /usr/bin/gpm as gpm is now installed in /usr/sbin. Fix reference to /etc/gpm-root.conf as this file is now installed in SYSCONFDIR (== /usr/etc by default). * gpm-root.y (SYSTEM_CFG): Place this in SYSCONFDIR not hardcoded in /etc. * README: Fixed reference to debugging version. Wed Aug 26 18:47:16 1998 Ian T Zimmerman * aclocal.m4: Add ITZ_PROG_EMACS. * twiddler.h (TW_CUSTOM_FILE): These files now go to SYSCONFDIR which is the GNUsically correct way. * configure.in: Use LIBS (GNU standard) not LDLIBS. Add AC_REVISION. Make srcdir an absolute path. Figure out default prefix based on location of gcc. Use AC_CHECK_TYPE to look for __u32. Don't cache the values from command-line options. (REL_MAJ): This and RELEASE shouldn't be cached either, as Alessandro has discovered. Thu Aug 20 00:07:42 1998 Ian T Zimmerman * Makefile.in (all): Should now recurse into doc ... * doc/doc.gpm (Server Invocation): The server manpage should go to section 8, not section 1. (gpm-root): Fixed all references in the documentation to /var/run/gpmctl to /dev/gpmctl. * doc/Makefile.in (install): Added this rule here instead of installing directly from top make. Since I care about consistency so much, I must have a little mind ... (distclean): Don't directly rm doc/Makefile from top make, instead recursively make distclean in doc subdirectory. * Makefile.in (distclean): Don't directly rm doc/Makefile here, instead recursively make distclean in doc subdirectory. Wed Aug 19 13:01:00 1998 Ian T Zimmerman * gpm.c (processConn): Added code to bind the client side of the socket to the name of a temporary file. This is a quick and dirty authentication scheme described in Stevens p. 504. * liblow.c (Gpm_Open): Added code to bind the client side of the socket to the name of a temporary file. This is a quick and dirty authentication scheme described in Stevens p. 504. Server side hack to follow shortly. * Makefile.in (distclean): Have to clean doc/Makefile as well. * doc/doc.gpm (gpm-root): Argh, haven't understood that the manpages are generated from the info source. Added description of the options here. TODO: cross-references in manpages should be in bold type. Someone has to hack doc/manpager to do that. (Emacs Support): Deleted obsolete rubbish about t-mouse. Thu Aug 13 13:39:23 1998 Ian T Zimmerman * Makefile.in (install): gpm should go to /usr/sbin not /usr/bin. * configure.in: Enable libtinfo. * libcurses.c: Added weak definition of wgetch() that programs which don't need the curses part of the library don't need to link the whole libncurses (instead they can link with libtinfo). * gpm-root.y (main): restructured to use the new style logging exclusively. * gpm.c (main): moved file cleanup into an atexit hook. * gpn.c (cmdline): restructured to use the new style logging exclusively. Thu Jul 2 00:05:16 1998 Ian T Zimmerman * gpm-root.1: Add -D & -V to the options string. Add boldface to man references. Update pathname for /dev/gpmctl (should this be done automatically?) * gpm.1: Described new -D & -V options. Added boldface to other manpage references, to make them behave as hyperlinks where software allows. * gpm-root.y (main): Add -D & -V to the options string. * configure.in: Fixed show-stopping problem of repeated calls to AC_OUTPUT. * gpm-root.y: Replaced PERROR calls with gpm_debug_log. (usage): Document new flags -D and -V, in analogy to gpm flags. (cmdline): Implement the new options. Wed Jul 1 09:56:30 1998 Ian T Zimmerman * gpm-root.y: Replaced PDEBUGGGG calls with gpm_debug_log. (PERROR): Remove. * gpm-root.y: Reindent. * debuglog.c (gpm_oops): Moved va_list declaration in front of initialization statements (I hate C!). * gpm.c (processRequest): Fixed debug statement to look inside passed Gpm_Cinfo structure. * tar.exclude: added sundry files created by configure. * Makefile.in (tar): changed tar flags to GNU style, otherwise options get confused with filenames. If anybody tries to use this rule with a non-GNU tar, good luck. Also added -9 flag to gzip to squeeze that last byte :-) * special.c: Replaced PDEBUG invocations. * mouse-test.c (_oops): Delete, it is in the library now. * mice.c: Replaced PDEBUG invocations with gpm_debug_log. Reindent. * libxtra.c: Reindent. (Gpm_GetSnapshot): Replaced PDEBUG invocations with gpm_debug_log. * liblow.c: Replaced PDEBUG invocations with gpm_debug_log. * liblow.c: Reindent. * gpn.c (cmdline): replaced old oops invocations. * wd.h (gpm_oops): Add declaration. * gpmInt.h: remove declaration of _oops (see above). * debuglog.c (gpm_oops): Added as a replacement for _oops in gpn.c. * configure.in: check for syslog() as well Added check for alloca(). * gpn.c: removed _oops; see above. * gpmInt.h (_oops): Changed signature of _oops (oops): redefined accordingly * gpm.c: Removed a few leftover newlines in logging calls * gpn.c: Reindent, because it was so bad as to confuse my tools. (usage): Added description of new options -D and -V. Used D partly because it is mentioned in the string passed to getopt(), but is actually unused. (cmdline): Added -D and -V to the getopt() loop. * gpm.c: Replaced ugggly macros by calls to gpm_debug_log. * debuglog.c (gpm_debug_log): Print a trailing newline if using stdio. * configure.in: Added generation of doc/Makefile * gpn.c: Removed the Log function (now done through debuglog.c) * gpmInt.h: Removed debug/log related declarations (now in wd.h/debuglog.c) * gpmCfg.h: Removed CONFIG_GPM_LOG line. * gpm.h: Twiddled various pathnames, included paths.h * Makefile.in (tar): exclude the files mentioned in tar.exclude. Create the archive in the current directory, not parent. * configure.in: Move doc/Makefile to doc/Makefile.in and make configure generate doc/Makefile. Right now it doesn't substitute anything, but it might one day, the new way is better conformant with GNU distribution guidelines, and it makes it easier to create clean tarballs. (There, a fine oxymoron.) * Makefile.in (LOBJS): Added debuglog.o (TARGET): Likewise. (depend dep): The preprocessor run needs $(CPPFLAGS). (DEPEND DEP): Likewise. (CPPFLAGS): Split from CFLAGS to correctly distribute flags to compilation and preprocessor rules. (.sh.o): needs CPPFLAGS. ($(TARGET)): This needs LDFLAGS, not CFLAGS. ($(TARGET).static): Likewise. (mouse-test): Likewise. * tar.exclude: create * wd.h: Rewritten to refer to debuglog.c. * debuglog.c (gpm_debug_log): Prefixed globals with gpm_ as this is going into the library. (gpm_debug_log): Reversed level test. (gpm_debug_level): 2 alternative definitions depending on DEBUG. * aclocal.m4 (DEFS): -DDEBUG should go into DEFS, not CFLAGS. This would actually make a difference if we autogenerated header dependencies. Which we do, but the make rule for it is imprecise. See Makefile.in entry above. Also, use AC_DEFINE instead of twiddling the flags by hand. * configure.in (DEFS): check for syslog.h and vsyslog(). (DEFS): Moved definition of PREFIX here from Makefile.in. * debuglog.c (debug_log): created. Sat Jul 25 21:08:46 1998 Edmund Grimley Evans (edmund@vocalis.com) * mice.c: added M_ms_plus and M_ms_plus_lr Mon Jul 6 13:00:23 1998 Robin Houston (robin.houston@guardian.co.uk) * mev.c (main): "-p" doesn't take an argument Sat Jul 4 14:40:09 1998 Dan Fandrich (danf@npsnet.com) * mice.c (I_serial): Send only "*X" to mman Mon Jun 15 21:31:35 1998 Pavel Machek (pavel@ucw.cz) ===> 1.14 released * mice.c: added support for Genius NetMouse Sun May 10 11:12:46 1998 David Given (dg@tao.co.uk) * mice.c (M_js): joystick support Sun May 10 10:41:58 1998 Ian Zimmermann (itz@lanminds.com) * t-mouse.el: partial rewrite to enhance its workings * mev.c: partial rewrite to fit t-mouse.el Tue Apr 21 18:24:52 1998 Holger Jakob (jakob@ph-cip.Uni-Koeln.DE) * mice.c: changed all (char) to (signed char), to suit ppc Linux Tue Jan 6 00:31:25 1998 Alessandro Rubini (rubini@amelia) * gpn.c (cmdline): -M forces -R (why didn't it?) * Makefile.in (YACC): Use autoconf to assign YACC Mon Jan 5 14:48:23 1998 kw@dtek.chalmers.se (Kristian Wiklund) * mice.c (M_geni): new mouse type Mon Jan 5 00:53:57 1998 Alessandro Rubini (rubini@amelia) * twiddler.c: new file to support keyboard workings * README.twiddler: documentation about the twiddler keyboard * gpn.c (cmdline): opt_scale ("-r") is now limited to 100 Mon Dec 29 09:43:28 1997 (rubini@morgana) * mice.c (M_twid): new mouse type * mice.c: removed the PROTO field * kmouse.h: removed the file Thu Sep 11 21:43:27 1997 Jan Daciuk (jandac@pg.gda.pl) ===> 1.13 released * t-mouse.el (t-mouse-tty): another possibility for ps * gpm.h (GPM_XTERM_OFF): the string was buggy (James Troup) * gpm-root.c (get_winsize): use tty0 not console Sun Sep 7 12:00:35 1997 Steve Bennett (s.bennett@lancaster.ac.uk) * mice.c: new type "-t ms3" for intellimouse devices. Sun Sep 7 12:00:35 1997 Alessandro Rubini (rubini@amelia) * gpn.c (cmdline): bugfix: accel allowed to be 1 Mon Sep 1 14:22:31 1997 (rubini@morgana) * mice.c: new type "-t pnp", supporting braindead ms devices. Sun Aug 31 18:28:01 1997 (rubini@morgana) * gpm-root.y (f_mktty): use /sbin/mingetty instead of agetty Fri Aug 29 08:11:32 1997 (rubini@morgana) * Makefile (configure): update ./configure when needed Fri Apr 11 10:19:18 1997 (rubini@morgana) * mev.c (main): Ctrl-C terminates the program * doc/doc.gpm: revision of the docs. Tue Apr 8 17:06:06 1997 (Dave Flater: dave@universe.digex.net) * mice.c (M_ms): removed a typo in the disabled decoder * FAQ: Marked the change in the decoder for ms-middle Tue Apr 8 16:57:17 1997 (Ian Zimmermann: itz@rahul.net) * gpm.c: fix to handle the whole stack of clients * liblow.c (Gpm_Open): support for SIGTSTP Tue Apr 8 01:27:09 1997 (Thomas E. Dickey: dickey@clark.net) * aclocal.m4, configure.in: added support for autoconf Tue Apr 8 00:48:46 1997 (rubini@morgana) * doc/doc.gpm (Mouse Types): fixed the list * gpmCfg.h (MAX_VC): raised from 32 to 64 (needed by some users) * README: Added a check for "window-system" in the .emacs clause Tue Apr 8 00:35:33 1997 (Pavel Machek: pavel@Elf.mj.gts.cz) * mice.c (M_logimsc): new mode needed for some mice Tue Apr 8 00:13:30 1997 (Matthias Grimrath: y0001032@rzserv8.rz.tu-bs.de) * gpm.h: check for c++ inclusion Tue Apr 8 00:10:33 1997 (Stephen Tell: tell@cs.unc.edu) * mice.c (M_ps2): patch to support some strange devices Tue Aug 27 15:54:10 1996 (rubini@morgana) * gpmCfg.h (SELECT_TIME): increased, to avoid possible hd spinup. Fri Jul 26 12:33:39 1996 (rubini@morgana) ===> 1.10 released * FAQ: new file * doc/doc.gpm: provided docs about special commands Thu Jul 25 09:38:29 1996 (jrt@miel.demon.co.uk) * gpm-root.y (main): added a missing arg in a message Wed Jul 10 15:59:33 1996 (rubini@morgana) * liblow.c (Gpm_Open): fixed a fault when stdin not a tty (John Davis) * mice.c (I_wacom): fixed initialization described the fields of Gpm_Type, in order to easily add new types * special.c: new file, based on an idea by Karsten Ballueder * gpm.c (processMouse): use a different "repeater" (Markus) Sun May 5 22:01:48 1996 (rubini@morgana) ===> 1.09 released * gpmCfg.h (DEF_GLIDEPOINT_TAP): changed to 0. The tapping code for ps2 mice must be disabled for non glidepoint protocols. Tue Apr 23 14:05:43 1996 (rubini@morgana) ===> 1.08 released * mice.c: support glidepoint ps2 mice (suggested by Don Schwarz) Mon Apr 22 15:20:05 1996 (rubini@morgana) * mice.c: added the wacom protocol Sun Apr 14 20:59:08 1996 (rubini@morgana) * t-mouse.el (t-mouse-tty): comply with procps-0.99 Sun Feb 11 01:05:07 1996 (rubini@morgana) * Makefile (MAN): libgpm.so.1 was installed. Fixed. * gpn.c: try to kill even if connection fails (usage): removed the line about "-P" (dropped time ago) (cmdline): added a missing "break": -o forced -p. * gpmInt.h: new globals: opt_kernel, opt_explicittype * gpn.c (cmdline): support for "-K" (kernel module) Fri Jan 12 00:31:40 1996 (Michael_Plass.PARC@xerox.com) * mice.c (M_ms): allow motion and button change in a single event however, some mice won't work, so the code is still "#if 0" Tue Nov 14 14:18:26 1995 ===> 1.06 released, unexpectedly * mouse-test.c: added missing variable to link with mice.c (main): don't use absolute pointing devices as possible mice. Mon Nov 13 11:21:42 1995 (Marc Meis 100334.1426@compuserve.com) ===> 1.05 released * gpmInt.h: added flag "absolute" to Gpm_Type to indicate absolute pointing device * mice.c: added NCR3125 pen support * gpm.c: modified processMouse to support absolute pointing device Sat Nov 11 11:40:27 1995 (rubini@morgana) * t-mouse.el (t-mouse-run): fixed bug in linux-to-linux remote link. * doc/doc.gpm (gpm-root): documented the need for /dev/vcso * gpm-root.y (main): check for /dev/vcs0 before starting Only run with /dev/vcs -- disregard kernels 1.1.73-92 (scr_dump, scr_restore): if open(/dev/vcs) fails, write on syslog * gpm.c (processMouse): only one margin is active at a time. Fri Nov 10 22:37:45 1995 (rubini@morgana) * gpm.h (Gpm_FitEvent): bug fix: fit DRAG, not MOVE. * gpm-root.y (main): only ctrl-move gets the default behaviour Fri Nov 09 20:33:26 1995 (lou@lounix4.conc.tdsnet.com) * mice.c (M_mman): added support for glidepoint mice (Lou Sortman) Wed Sep 27 09:51:17 1995 (rubini@morgana) ===> 1.04 released * Makefile: added a dirty check for __u32 Wed Sep 26 01:31:13 1995 (rubini@morgana) * doc/doc.gpm: some fixes * doc/gpmdoc.txt: new file: ascii for "less" readers. Sat Sep 23 08:44:01 1995 (rubini@merlino) * doc/doc.gpm: updated the lisp form to load t-mouse * README: added instructions on compiling and installing * Makefile: minor fixes Sun Sep 17 13:35:26 1995 (rubini@morgana) ===> 1.03 released * doc/doc.gpm (Variables ): gpm_mx and gpm_my are documented. * gpm.h (Gpm_FitEvent): this too was buggy, when dealing with motion. * gpm.c (do_client): masked with GPM_BARE_EVENTS (long-standing bug) (processMouse): removed GPM_SINGLE from motion events * libxtra.c (Gpm_GetSnapshot): return 0 if the input queue is full * mev.c (main): another fflush, I forgot about it. * liblow.c (Gpm_Open): the fix of two days ago broke normal clients. Sat Sep 16 22:47:13 1995 (rubini@morgana) * gpn.c (cmdline): added a missing "break;" (-L) Fri Sep 15 09:40:59 1995 (rubini@morgana) * liblow.c (Gpm_Open): fixed a problem whit pty's (t-mouse broke) Thu Sep 14 01:50:23 1995 (rubini@morgana) ===> 1.02 released * liblow.c (Gpm_Open): fixed a bug with multiple opens * mev.c (user_handler): added fflush() 'cause didn't work with elf/lib5 * gpmInt.h (inline): inhibit inlining when debugging * Makefile (install): some fixes to make it work (Mark Shadley) (static): new target (I've an old gdb :-( ) * hltest.c (xhandler): fixed a problem with messages * libhigh.c (Gpm_HandleRoi): fixed a segfault when no roi matches * gpm.c (get_console_size): create a different resolution for x and y (processMouse): return tiny motions (0,0) if some time has elapsed * gpn.c (cmdline): introduced "-q". Obsoletes "-L". * gpmCfg.h (SELECT_TIME): decuplicated time-out (10 minutes). (MAX_VC): 32 virtual consoles Tue Sep 12 00:12:47 1995 (rubini@morgana) ===> 1.01 released * Makefile: supports elf shlibs (Mark Shadley) Wed Sep 6 22:46:55 1995 (rubini@morgana) * mev.c (main): use current tty instead of /dev/console * liblow.c (Gpm_Open): use /dev/ttyxx instead of /dev/console (Pavel Kankovsky) * gpn.c (cmdline): fixed "-o rts" Wed Jul 26 14:44:59 1995 Alessandro Rubini ===> 1.00 released * doc/doc.gpm (Emacs Support): upgrade * t-mouse.el: upgrade by Ian T Zimmerman * gpm-root.y (cmdline): last bug fix: missing break in switch Wed Jul 26 00:38:51 1995 (rubini@morgana) * t-mouse.el: fixes and enhancements by Ian T Zimmerman * Announce: new file. The announce for c.o.l.a. * liblow.c (Gpm_Open): open console O_WRONLY instead of O_RDONLY (Gpm_Getc): swapped two lines, to handle SIGWINCH in clients * doc/doc.gpm: final fix Tue Jul 25 00:41:44 1995 (rubini@morgana) * mouse-test.c: a new utility to "detect" your mouse type Mon Jul 24 15:52:11 1995 (rubini@morgana) * gpm.c (gpm_killed): removed spurious and annoying message Fri Jul 21 10:57:07 1995 (rubini@morgana) * libhigh.c (Gpm_HandleRoi): fixed a problem with gpm_visiblepointer Thu Jul 20 23:04:42 1995 (rubini@morgana) * gpn.c (cmdline): "-D" removed (use "-k" instead) Wed Jul 19 09:12:29 1995 (rubini@morgana) * gpm.c (processRequest): fixed nasty bug introduced with "-R" * t-mouse.el (t-mouse-keymap): added double-drag and triple-drag * gpm.c (processMouse): the GPM_SINGLE,GPM_DOUBLE and GPM_TRIPLE flags are always delivered (as they should have always been). * gpn.c (cmdline): removed the "-p" option (useless). * doc/doc.gpm: Revised and updated. * liblow.c (Gpm_Open): use the foreseeable device /dev/gmctl * gpn.c (cmdline): no more symlink /tmp/gpmctl * gpm-root.y (main): recursive menus definitely fixed Sat Jul 15 11:16:18 1995 (rubini@morgana) * various places: applied axp patches. * libhigh.c: update, at last. * hltest.c: new file, to test the high level library Mon Jul 10 20:03:46 1995 (rubini@morgana) * gpm-root.y (main): recursive menus * gpm.c (main): chmod 777 /var/run/gpmctl (1.2.9 and later broke it) * mice.c (M_mman): chord-middle detected Wed Jul 5 09:29:52 1995 (rubini@morgana) ===> 0.99 released * doc/Makefile: minor cleanup * doc/manpager: changed any "continue" to "next" Fri Jun 30 09:14:13 1995 (rubini@morgana) * gpm.c (wait_text): fixed interaction with X when non repeater. Wed May 31 09:17:55 1995 (rubini@morgana) ===> 0.98.3 released * gpm.c (processMouse): fixed update of number of buttons * doc/doc.gpm: minor fixes * libxtra.c (Gpm_GetSnapshot): check if a connection is open Sun May 28 22:02:20 1995 (rubini@morgana) * gpm-root.y (main): reset gpm_tried after failure Tue May 16 10:28:01 1995 (rubini@morgana) * gpm.c: setuid(0) * gpm-root.y: setuid(0) Tue Apr 25 18:02:03 1995 (rubini@morgana) * t-mouse.el (t-mouse-make-event): fixed problem with split windows Sat Apr 22 13:19:50 1995 (rubini@morgana) * t-mouse.el: mouse-2 in Info-mode is handled mouse-2 in dired-mode is handled * gpm-root.y (main): added sleep() if Gpm_Open() fails Wed Apr 12 00:29:46 1995 (rubini@morgana) ===> 0.98.2 available * mev.c (main): use the new library functions * gpm.c (processRequest): added information retrivial * liblow.c (Gpm_Open): try /tmp/gpmctl as well * libxtra.c (Gpm_GetLibVersion): new function (Gpm_GetServerVersion): new function (Gpm_GetSnapshot): new function * gpm-root.y (postmenu): use /dev/vcs and fine line-drawing chars (main): change of semantic: use button-down to choose item. (tableMod[]): use KG_SHIFT (main): logging out is correctly managed (in /etc/utmp) Tue Apr 11 15:48:27 1995 (rubini@morgana) * t-mouse.el (t-mouse-process-filter): catch errors in mev messages * mice.c (I_serial): mouseMan fix (Stephen Lee) (mice[]): added an information string and a synonym. (M_listTypes): new function to give some help * mev.c (user_handler): added "0x" in printf (ajohnson) (tableMod[]): use keyboard.h instead of constant values. * gpm-root.y: added missing ';'s (ajohnson@apanix.apana.org.au) (postmenu): fixed "unsigned char" bug (johnvl@einstein.et.tudelft.nl) * Makefile (install): fixed problems with info file Thu Apr 6 00:33:03 1995 (rubini@morgana) ===> 0.98.1 made available * gpm.c gpn.c: read two mice at a time * gpm-root.y (f_jptty): added ioctl(VT_WAITACTIVE) (main): console disallocation is provided Wed Apr 5 08:03:37 1995 (rubini@morgana) * gpm.c (wait_text): only invoked if already graphics (processMouse): be a repeater if we're in graphic mode * gpn.c (check_uniqueness): fixed bug with "-k" and nobody to kill * gpm-root.y (scr_dump): fixed bug with clr_selection and dump/restore * wd.h: changed DEBUG(()) to PDEBUG(()) Tue Apr 4 08:56:33 1995 (rubini@morgana) * gpn.c (usage): changed semantics, to be more useful Sun Apr 2 13:20:28 1995 (rubini@merlino) * gpn.c (cmdline): device is opened with O_NDELAY Mon Mar 6 09:49:19 1995 (rubini@morgana) ===> 0.98 released * Makefile (info): new target: no more info file from simple "make" * gpn.c (loadlut): use octal codes and latin-1 chars (Andries Brouwer) (cmdline): create a symlink /tmp/gpmctl to run precompiled executables Sat Mar 4 18:44:54 1995 (rubini@morgana) * t-mouse.el (t-mouse-keymap): use M-mouse to enable the scrollbar Tue Feb 28 00:20:35 1995 (rubini@morgana) * mev.c (main): added report of kdb modifiers for key events * Makefile (clean): remove *.1, since they're not sources * kernel/*: removed the directory as obsolete * root.y (scr_dump): added support for /dev/vcs Sun Feb 26 14:25:31 1995 (rubini@morgana) * wd.h: when intactive use "" instead of "0" (to use "-Wall") * various fixes to face "-Wall" messages Mon Feb 20 18:08:02 1995 (rubini@morgana) * liblow.c (Gpm_Open): bug fix, closed an open comment (John E. Davis) Wed Feb 15 12:25:14 1995 (rubini@morgana) * mev.c (sigHandler): propagate SIGWINCH to the father * gpm.c (main): propagate SIGWINCH to the clients * gpmInt.h: modified Gpm_Type; one more field to allow extra bytes * mice.c (I_serial): changed prototype to autodetect mouseman (M_mman): new mouse type for damned MouseMan. Tue Feb 14 00:33:34 1995 (rubini@morgana) * gpn.c (cmdline): modem-line toggle added Thu Feb 9 00:42:51 1995 (rubini@morgana) * root.y (main): the "-B" option is no longer supported (scr_restore): be sensitive to SIGWINCH Wed Feb 8 11:46:52 1995 (rubini@morgana) * gpm.c (main): added support for SIGWINCH Thu Jan 26 12:11:59 1995 (rubini@morgana) ===> 0.97 released * root.y (postmenu): get color to restore from the cursor cell instead of the previous one (it failed with `less') (yylex): allow double quotes in strings (main): go to background * gpn.c (cmdline): go to background and setsid() (Stefan) (cmdline): new switch -k (kill) for busmouse users * gpm.h (GPM_NODE_DIR): use "/var/run" instead of "/tmp" (Larry) * Makefile: use "-O3" and don't release binaries any more * mice.c (I_logi): don't jump to I_serial anymore (Larry) Fri Jan 13 12:57:41 1995 (rubini@morgana) ===> 0.97alpha releasd * gpm.c (gpm_killed): use signal SIGUSR1 to kill an existent gpm (main): removed the annoting warning in signal() Thu Jan 12 11:45:08 1995 (rubini@morgana) * mev.c: added "any" to event list * t-mouse.el (t-mouse-suspend): fixed behaviour (thanks Larry) * mice.c (I_serial): flushed pending input (thanks Miguel) (I_logi): fixed "howmany" problem with serial vs. busmice * gpn.c (cmdline): m_type is passed to m_type->init * gpmInt.h: removed unused field "device" in Gpm_Type Mon Dec 26 01:21:54 1994 (rubini@morgana) * gpn.c (cmdline): authentication moved here. Wed Dec 21 11:28:41 1994 (rubini@morgana) * gpm.c (main): new (smarter) authentication Sun Dec 18 11:18:40 1994 (rubini@morgana) ===> gpm-0.96 released * root.y: allright and tested * gpn.c: new '-P' option * doc/manpager: new file to generate man pages * Makefile: fixed the installation stuff, use /usr as $(PREFIX). * gpn.c, mice.c: removed the last #ifndef linux * getopt.[ch]: removed from the distribution Fri Dec 16 17:09:19 1994 (rubini@morgana) * doc/doc.gpm: general update, addition of gpm-root docs. Thu Dec 1 01:03:51 1994 (rubini@morgana) * liblow.c (Gpm_Open): fixed console detection (thanks Miguel) and removed unused ttyp* and ttyq* recognition Fri Nov 25 01:37:37 1994 (rubini@morgana) * root.c (main): new file: a tentative default handler * gpm.c (do_client): bug-fix: default handlers now can run * gpm.h: new struct and prototypes for libhigh.c * doc/doc.gpm: minor fixes * libhigh.c: new file with "Region-of-Interest" management Fri Nov 25 01:24:45 1994 laurent@brasil.frmug.fr.net (Laurent Chemla) * gpm.c (processMouse): fix for button-up reporting Tue Nov 22 19:54:54 1994 (rubini@morgana) * gpm.c (do_selection): draw a running pointer or none at all Thu Nov 17 00:24:13 1994 (rubini@morgana) ===> gpm-0.93 released * t-mouse.el (tm-scroll-jump): changed behaviour: doesn't jump * doc/doc.gpm (Emacs Support): documented new word and line facilities * liblow.c (gpm_convert_event): fix: use gpm_zerobased (gpm_convert_event): fix: report all buttons on button-up Wed Nov 16 21:15:15 1994 (rubini@morgana) * t-mouse.el: tm-word and tm-line implemented Thu Nov 10 15:27:07 1994 (rubini@godipmec) ===> gpm-0.92 released * gpmInt.h (Gpm_Type): new field "howmany" * mice.c: fixed behaviour for "-t bm" (thanks to Reuben Sumner) * gpm.c (getMouseData): fixed data reading Sun Nov 6 13:18:34 1994 (rubini@morgana) * removed all the outdated "#ifdef linux" Sat Nov 5 10:23:30 1994 (rubini@morgana) * Makefile (all): executables are stripped Tue Nov 1 13:10:48 1994 (rick@razorback.brisnet.org.au) * gpm.c (check_mode): fix in mouse re-openig Sun Oct 30 01:49:14 1994 Alessandro Rubini (rubini@coroide) ===> gpm-0.9 released * doc/infofilter: fixed indentation of lisp code Sat Oct 29 17:24:54 1994 (rubini@morgana) * sample/configure.in: shows how to setup for both gpm and xterm * sample/rmev.c: new file, to test xterm compatibility * mev.c (usage): fixed ugly bug in printf() (main): added initscr() to work under sunos-hpux Fri Oct 28 13:19:37 1994 (rubini@godipmec) * gpm-xterm.c, gpm-xterm.h: new files, for xterm applications * mev.c (main): fixed ascii value reporting Thu Oct 27 01:56:13 1994 (rubini@morgana) * libcurses.c: xterm support is there as well Wed Oct 26 21:07:11 1994 (rubini@morgana) * liblow.c: xterm support is there Tue Oct 25 00:32:36 1994 (rubini@morgana) * libcurses.c (Gpm_Wgetch): new file, single function * gpm.h (Gpm_Getchar): removed a spurious "eject" string Mon Oct 24 22:47:37 1994 (rubini@morgana) * liblow.c (Gpm_Repeat): new function (Gpm_Open): uses gpm_consolefd * doc/doc.gpm: updated info, created indexes Sun Oct 16 11:36:07 1994 (rubini@morgana) ==> gpm-0.17 released * gpm.c (processConn): give the client a motion event at connection * t-mouse.el (t-mouse-run): added interactive to restart mouse (t-mouse-tty): bug fix: the -.16 one won't work on most machines Thu Oct 13 09:48:07 1994 (rubini@morgana) ===> gpm-0.16 released * gpm.c (main): a better check for uniqueness (gpm_killed): a signal handler to remove /tmp/gpm* on exit Wed Oct 12 16:10:26 1994 (rubini@godipmec) * Makefile (all): the info file is generated * t-mouse.el (t-mouse-tty): procps 0.95 is recognized Fri Sep 23 12:26:37 1994 (rubini@morgana) ===> gpm-0.15 released * t-mouse.el (t-mouse-keymap): the scroll-bar is there. * mev.c: new flag "-p" to show the pointer during drags Thu Sep 22 13:15:22 1994 Alessandro Rubini (rubini@ipvvis) ===> gpm-0.14 released * doc/doc.gpm: fixed the section about emacs Fri Sep 23 12:26:37 1994 (rubini@morgana) * t-mouse.el (t-mouse-keymap): the scroll-bar is there. Mon Sep 19 01:06:56 1994 (rubini@morgana) * mev.c: new flag "-f" to fit events. * Makefile (quickinst): new target gpm.info is installed as well (distrib): the precompiled binaries are distributed as well * t-mouse.el: it is really full-featured, now. Sun Sep 18 11:44:36 1994 (rubini@morgana) * mev.c (emacs_handler): up events now return the press location * Makefile: binaries are now released with the package Wed Sep 14 14:12:48 1994 (rubini@morgana) * t-mouse.el: removed free variables: clean compile * Makefile: t-mouse.elc is properly compiled * exec.el: used to compile elisp. * doc/*: texinfo is used, and online docs are available Wed Sep 7 19:34:28 1994 (rubini@morgana) ===> gpm-0.13 released * gpmCfg.h (MAX_VC): manage 16 virtual consoles * t-mouse.el: avoid invoking awk on startup * mev.c (cmdline): accept hex numbers with "-C" Sat Aug 27 11:41:57 1994 (rubini@morgana) * t-mouse.el: added the "-s" option to 'mev', to prevent error msg. Mon Aug 22 20:28:47 1994 (rubini@morgana) * liblow.c (Gpm_GetEvent): Closing connection correctly handled. (Gpm_Close): fix to help the above handling Fri Aug 19 10:23:01 1994 (rubini@morgana) ===> gpm-0.12 released * gpn.c (cmdline): new options: "-2" and "-3" * doc/gpm.tex: (Emacs Support) new section Thu Aug 18 10:01:22 1994 (rubini@morgana.unipv.it) * gpm.c (do_selection): use right button to extend selection, if the middle one is present * t-mouse.el: recognizes the controlling terminal * doc/gpm.tex (Compiling and Installing) note about rc.local * gpm.c (processMouse): fix: first click is single Wed Aug 17 09:20:54 1994 (Olav Woelfelschneider) ===> gpm-0.11 released * gpmInt.h: changed "char proto[]" to unsigned Tue Aug 2 05:26:55 1994 (rubini@morgana) ===> gpm-0.10 released * liblow.c (Gpm_FitValuesM): bug fix Mon Aug 1 19:22:50 1994 (rubini@morgana) * gpn.c (cmdline): fixed bug with opt_device (Miguel de Icaza) * liblow.c (Gpm_Close): fixed the gpm_tried bug * gpm.c (processMouse): clustering added (getMouseData): new function to ease readability Fri Jul 29 13:54:38 1994 (rubini@ipvvis) * gpn.c: moved many functions to gpm.c to make them inline Fri Jul 29 01:56:39 1994 (rubini@morgana) * gpm.h: Gpm_DrawPointer: new facility * liblow.c: gpm_zerobased added * gpn.c (do_client): added an option to map "drag" to "move" (ugly) Thu Jul 28 23:55:18 1994 (rubini@coroide) ===> gpm-0.06 released * doc/gpm.tex: updated Thu Jul 28 11:02:48 1994 (rubini@morgana) * gpn.c (cmdline): configurable button order (cmdline): double click time, too. (cmdline): "-L" option. (do_selection): fixed bug about wrap-around. Wed Jul 27 23:56:14 1994 (rubini@morgana) * liblow.c: no more public gpm_timeout * gpn.c (do_client): bug fix Tue Jul 26 14:44:37 1994 (rubini@mimmo) * gpm.h: ctl file now in /tmp Sat Jul 23 13:22:29 1994 (rubini@morgana) * gpn.c (cmdline): /dev/mouse is the default * gpm.c (processMouse): button-up: report which one Fri Jul 22 15:57:35 1994 (rubini@morgana) * mev.c: emacs syntax is there Wed Jul 20 19:35:16 1994 (rubini@morgana) * gpm.h: added GPM_HARD * gpn.c (do_client): fixed default management. Tue Jul 19 16:31:23 1994 (rubini@morgana) * gpm.h: changed Gpm_Event to fit ptys Tue Jul 19 09:21:37 1994 (rubini@morgana) ===> gpm-0.04 released * gpn.c (cmdline): use "/dev/mouse" as a second trial for the name * gpm.c (processRequest): can override info * mev.c (interact): new function to test stacking Mon Jul 18 11:44:13 1994 (rubini@morgana) * liblow.c (Gpm_Open): added stacking and an ugly goto * gpn.c (_oops): fixed bug about errno (Steven S. Dick) * doc/gpm.tex: fixed the terrible language, hopefully. Fri Jul 15 18:21:08 1994 (rubini@merlino) * mev.c: raw stdin added Tue Jul 12 16:57:45 1994 (rubini@ipvvis) ===> gpm-0.03 released /* Local Variables: */ /* tab-width:8 */ /* End: */ gpm-1.20.4/doc/specs004070000017500001750000000000001077613005100130205ustar00niconico00gpm-1.20.4/doc/specs/synaptics004070000017500001750000000000001077613005100150355ustar00niconico00gpm-1.20.4/doc/specs/synaptics/www.synaptics.com004070000017500001750000000000001077613005100204525ustar00niconico00gpm-1.20.4/doc/specs/synaptics/www.synaptics.com/decaf004070000017500001750000000000001077613005100215145ustar00niconico00gpm-1.20.4/doc/specs/synaptics/www.synaptics.com/decaf/utilities004070000017500001750000000000001077613005100235275ustar00niconico00gpm-1.20.4/doc/specs/synaptics/www.synaptics.com/decaf/utilities/511-000024-01a.pdf010060000017500001750000014000051077613005100257100ustar00niconico00%PDF-1.4 %âăĎÓ 1 0 obj << /Type /Page /Parent 1591 0 R /Resources << /ColorSpace << /CS2 1605 0 R /CS3 1604 0 R >> /ExtGState << /GS2 1626 0 R /GS3 1628 0 R >> /Font << /TT3 1599 0 R /TT4 1601 0 R /TT5 1603 0 R /C2_1 1611 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 7 0 R /Annots [ 2 0 R 3 0 R 4 0 R 5 0 R 6 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 1 >> endobj 2 0 obj << /Dest [ 1 0 R /XYZ 230 587 null ] /Type /Annot /Subtype /Link /Rect [ 498 668 538 681 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 3 0 obj << /Dest [ 1 0 R /XYZ 183 366 null ] /Type /Annot /Subtype /Link /Rect [ 290 527 330 540 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 4 0 obj << /Dest [ 1 0 R /XYZ 183 366 null ] /Type /Annot /Subtype /Link /Rect [ 169 325 209 338 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 5 0 obj << /Dest [ 1 0 R /XYZ 190 132 null ] /Type /Annot /Subtype /Link /Rect [ 186 280 225 293 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 6 0 obj << /Dest [ 9 0 R /XYZ 180 599 null ] /Type /Annot /Subtype /Link /Rect [ 226 84 265 97 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 7 0 obj << /Filter /FlateDecode /Length 8 0 R >> stream H‰œW[oŰF~ׯ˜‡}HxÄšŰ €&Ý `Äzh‘-ѡ2Š•({óď÷ ošĄÎPJ҇ ţ΅çö3óë]]˝űř+XkLjáŹS“šśńOZšńQK3ŃGŇţrM Ń(Ý|ĚÇ'hЧźŹÝGE] rîžţ¨BEƒ˙Á…Ł<ą>OGbhó#˝ü4ľrّ]Áz‡I—j*ŰR]×d[˝äťŤĂöuăs,Ţ̲ĺŇW*J˛ŹžžPqĂ)c%O˛ôRÔk‚*pŚŠÖĄý ä`Ůrć îkRŐë|Gnďć)Ęaö͐ƒeA$ ľzĚłV;ňYĺĎĹ2ß0K>l™hlCŠ„ŠDą:eˆvł!÷9<ő„M†K‡SąňX˝ăęѤY$×3dľj*›ľŒé:t"*÷D›ˆ Î/Şąíi”ľO­šhQŘ4Łdcŕj썁CšQ°O2yBÁ>K8dýŚFWRłę†óěxŤřČ XM´cú-S˜%cG y+jw pœ1$6nÍ÷°áőŞtw˜Ŕčvü*ifJÚĆ˟¤zîn‡PRƚmq”}ŘÄžHa_tb¸L‹„ů&˙ˆš‡WZ^ć^_âžshđć âG9çB€>t_<˘˘śaÁw–¨ R`Ą`,sQ8đN2ŠŮ0›¨k Ľ¸$H;O¸>”H$Œ…c/ G‡ó ?ŃH/˛hÝśA‚>Ąą¤đXŃîĹy6ž\âY 8F5úçsĚ"ťČ"ÄbRăü}ź+WÂĐʞÔĐ'é;÷ƒ; Ŕ=‰ÇŕŽĆ#pOä1¸ŁňܓyöóŒż\&hÉÉť‡‹ź{Ŕ00ÁÄÝă$”ĘŘ"FÁžŽ8ŘUűâ`WAě뇃]őP°Ż úYFŸkÉi~ť˘%gžš]V—T-q9:W5îŽ;ˇđٰĹá(4ťűZ8ľÔ˘ÇŔ,zœĄŕĐ(Ř÷=‚}O`  ö=CO` _CôĽ{ţ8ăđa“ÇŮ €g};ryżăł˘9YšŠ&đi ŢBÎô›$áć-ŘO;ˆŘľ&ś†<Şżúă şă€vˇ× h(.˜Rî*;ČŃä+*ăŔ¸Űšƒ$6Zy`fîAĄ#°ŸPű]ăϤŠńG‡ ĆßYćçßÁ‰ËcŠ‚ý€â`7 (Ř(vŠ‚ý€â`7 (Ř× ˝,‹äűŞĆ(›*š@ݤKŠĆëž+DŔ'8ťĹٜÝÂQΆ*YożéQO čĐ8ÚwŠmŁ}_ čŽö˘Ck ¨_Lü;KŢŔu‚O˛÷Q§ď#NDŹÓďńˇJSwvţ0ő_ý9Íŕžä4…{‚ç8ÜĹ* Ռ’xöłú]7œ‚”ŞI:řÁΖçč@ĽĆ…Đ7° ÇYĽÂŤR {;Î1]­ÜŸ{Ý1‘tÓQć°xä„rK1e@u\šăŠˆ˛hG9ŞÜRILš%ϘrÇ4e Í>‘°ŽˆbĘ:™JX׾ĺÇWÉQ×ďÁđm^šQOƒcĂŁ1ÎĄkŔ6Đk‡íƒOSž…Ć2ĺ Ą€ŚžŰx<ěrčrBnďćœ|Î7Y]<űJŽ „tr06‚)ë §Ş.Ş@ ŇhÎËÇRԤؓŞÜt$HťÁM´fžÎ7RćË|żĎvßP­)S*P!uE˛Ő źääţP×UŮü…,ŞĂr}›afD˘ŠPƒgf… Bť[–‚ä •äŚĘĆQ˛Z6ůkRŻó2ą'ű:Ťs˛ĚJ̀ä#ťĎĄťˇŐŽÎW¤@•,P`Á÷áÖ- fÓ&~âÖyÓÍ^gCiEŹ´8IvWۧbľÚ´ G éĐ\ŞPŠÂESŘÓ2 EKrďšU€ŒtŐ đ~I`°Űů˘Mࡨź…}Š‘é;T6"°áHô8ę9Ţ'\%TƒĘ(1ŤźÉžç&§PFXŞĄ™ú˛Ž^ňç|×tL_Y‘üż‡â9ŰäeMśŐž †,‡úcľ†˘h›´Ëţú~_mu$"¸Sh*ŕ!čDJmŠbbdž˝&Őî)Ť_“—uą\ĂˇŁ ”š†kđ˙œW]Ü6ü+z<ZüŚä!÷ŕŔ@‚äljó0ťŤľgĎ,vfmřß_Q#JäLQŁ]ś×ŽV7Ů쎎.|4\|¸Ô›íǧ)‹z’­’eQă/'Ń…/¤M‰ćĂż~nýív󚚼ˇŃ¨€ßůRio‰ŤĚU\3­Çd;ť!^ąßÝoút#€ĺ#‰— SɸZKu9:ŒŻ?rä]s×ÝF×;8ĺá 8˘.Č],†Ňc3œ}CSŠL\H  SĆf7ÜsşŁ›îh[ŕ˜Ś‹mQÜôéq×ěëőŽ1žƒłşüęas÷A)E?°cŁnÍ?8pçzFŸgî5őŐž;Ë7!ś}dŸ"ˇwi`lw›ű~ƒ›÷?˘Júéîg{ݔNS+™*ÄĹźG"üžŰ<ˇˇNľżUTRůWc‰˝ĺ íQě íY|rěď7ˇńżwQdĺŃÚZ4Oűxډ‰%âcŁÁ{Řś aBC|Ůčşô*QÖhĄîäyÜśĆ_Y€¸ú3Čw\?Nů|™EzÁ 3j]Ž*Š!€Ş(ĆŹ˘ZblÔQ'ă˙œĐáż P‰v:rŗ& )Sů2‚őë`Ž.\ÇśÝ|sNj`Lńx™V(DĆE†/Á,Áœó{ fé%ŕœÝK0Ëç]‚Y.Áźé0ŚÜ´kH—O9Đ*(ĚŤxęĄ7ż˝‰ň!2ÓlѸĄ 2ÇŤDa[ÖeĂŕ5ńpÓÄ$ĹŻyšőřI‚B<&’{Z‚ä(3J3LŇNšÜŽvɎrá|.s‡- Ü)!Oi¸Y­‰ŹĚ ŞuîđÝß,4_a=öÇĚR nDë˘Î˜-…ú‡šú :ĺWÝGŻšÖF8çÍŐLĆŠęŰuohVEö¨PU:䙌#Öľş+ƌŚGwq‚úU‡´ki4ćˆôE…˙Î"°<Ź+4ˇ*r@ƒcďËţJ#Ł‚3ĄybbP\b( KuĆĹžŘ˜Ăýq8żő 䁃Řq‹Š|Š<ˆžwôJoPľ6nťW˝9ĘŻĽ7…ň]çWxăYzCQŕ˘n…7N{…7 –—ëźqŇ)˝AUâě oœH oFŰř f…7ŢńĽ7Ěqź‚ŽxK˝ä:Q5 K]DąQŇ0,)Š‚†aIĎPl”3 Kḭ́<“tąh/nlc=-•—ń/mcx^TůC‚Źˆ ŻŤ(ꆢŐ< ]ˆ"‡¨[ Ś^ œ*‚Š8ŐS100ť S90pŞć^Śn퐌%u;[pu;㍪UĺňAݞŠËáGKŐmçăi,Ôë‰ ŢsŠ×BúN斒 ah đ‹)| . •B JËŔ5Ą–Bb喕Tx>ˆ.T–(çÜáŸTz´čo|nHdZô˛ŞůZ‚ŒŒ]Żőő‰ńJKž Ł0 e¨ĺgjfŹ §çٕϗ8 ž°(q<Ď+¸1zžFśŽF_ KěEą‘ź–¸‹b#u1,1ĹFâbXz3†ĺšŐϚcÊvqŽyŞWÖź•uzĺą°yę…96ŔŐ96 Ő9§Ą:Ç(˜*ƒc)P0ŐÇb ŕt Žĺ@ÁTĚĐžlŽAƒęĺ96[đ96㍮UÝÎ4sĚůpŔ›ťxB#ô‰úţúŰ ŃţC+LGZŤ2`ΏX_ňXCéV¨eň{é~=_ë']­řK$•;AĆZżDRĄdŹňK$•8AĆúžDŇó\"y&ťg˝ŒXfáeU+^&zžú4 4ś@u\Ľş­RPU}x ڎçŕřüLŔÁą(˜Ý…€c)P0Uóäbĺ*ŐA-űeŞ›-8ŐÍxcjŐEEĎ,ٍÖx*ŮľođÚ~ԙLJ)(­Ě kgŃk4ł ^´ŢŞë‘;čHŮę5‘Šœ¸\Ď Lć°˛Ś 7ÚÄĘÉΨřNĺä%ÄňŠSÚU§ôVtž+^ćO~Ęŕ„Őqš~ʍĐĆýăú)éđźŘ|0&)Bˇ,°ÖŚŞYU>~U`ťŁtřŽŚG‡€ľÇwnivtçD§ÔŞ7¤söbŇJ¨Voř;]¸tÜjôŞôtŤ"KŤ‹Ęý•FFP`-ň4 Rs)eŚ9ŔáiTŕ4 8‰…'ˇ¨ă:ůBľ=/:ڃâĚ[čg žkŢ8ŐŢjŰw_áÓwé őŠ‹şŢ8ÍŢ4^ŽóĆé°ô"Ć+ŘŢ8ÇŢↃW0+źq2*˝_AWźĽ6GżššÖcXjpŠÝͰÔÚűšaŠŠ)6v4ĂR;3,ĎäóD;H§…—‘íKUt}Uő#rAőpUőhUő#_ŽŞú)˜Jƒc-P0Çj `ş Çz `* /ř2ŮŻ‘Yš(ű3 *ű3źąŐúŞë~=O  Ď|üŤ.,u„ëźĘ-˝ÔT˘Ě$”fʅ ŇÂŰPDçbLa?°!ˇc-ЂrĆw.R¨ŸÓóşÓ˘]dcŮŇ1v˝çáúJĂëΠ´xSRlěIŽZ’bcGrěԐű‘c§v¤Řř\+RkŸőVĐ1ę ?Óąžâ­˘ëküŹq [çç\ăçZă爜5~ćŕT LĹŔŔŠ(˜ĘŮ]˜ ‚SE0°xA˙2~ßv™Ÿg ÎĎ3޸j}Qiś’Ÿ=×ó˝żÂĎłĺU~žMŻđól¸ĚĎłkČu_çç\¤đYšL{#Ě2?Ëj˛Áőľ–÷NĚĺęϚÖ+ić(:zlZţĽłB™ôĺ9U¤–ŚŸ*‰ăÖ?ž ĐU?Mt@?`¨:’˙t¤Eţi˘úi\jęiJDĂ?uíBšRŇO'0~ڞ‘|QqĽ†Ô§Šűa &™HJ뜤dP"v— ˘=°79 ɊhĽÍ ś…AŸ{ffđńéąo”hšßţx­šŸoűĎOÇžÉ?SëâćŻţ|ýţő_šn­ˆÄ–Ůź.qMÝď 鄴2ǛŻIU\îËţ¸ÝMa\J§sĂŰ˙őÇćĂYŔ08 ĽĂťžů)ˇ22ŰX Ůšä‡WUŠjď(OÝ Ÿeř)RśZ7Ćx{ln7ťćŚďwÍĄšś°—Z %˝Ďż‚ńýăţ 5wíŰć͛íéů›ă§ÍôřÇżwűćđˆž†#Űéđ;|œ:ÝŔ‡ł÷›íńĐlžnśŸ77Ÿűć¸G<ě‡8Íá¸A•íď›Íî;;Žń^ŕ´ENšÍÝÝ6žřćót0äşĆęZZ•ڧS=űÝáÇćÓţ͓ę0Â:S~Őí˙ÝP{Ť1Ąâ3äöńŠŃúL|L}ÝŇłJ× Ż;[úúăűnópÜŢš˙îŸn?ąC(Ł@:úěĐżqÓXĐČUaşškŢîŽýăýćvËž‚Ą°qę_í>6żŁFH-×BZíE2Z݆´Žň‹Ş†ŁVHľ2xĄtpë!Á>ER6CjÚň}ˇ÷4:ąKţehwŹxšľf×5‘ŒKIJKą_3kˇ*ó|^-{×ă˙Ě" Ą…ľ˝ÚM&9­ĐFpăwwß!Ď 3ęüŐŞß1[(V ŐDŇX8š¨Wů´˙ď ÔBNW†œƒŒímăd۟c]Zů'Óůs–ŽWÁœâńc°‹ (ŚĐE†/ÁY‚ xÎď%8K/ĎŮ˝g9"ŕ9E—ŕ, —`UÉtlő#qÚc”ŸD0n9BzhĐ?ŤÍÚ*fŞ:[ě*úBfĄpĆWĂą>ëǴ͡ł7śěC-ŁLŔoŘ(EV ůGa 5ʑÚC7axW–ÍűxvŸ —1ŹŞ}J=iĄ†tl ś„×6djjŸ~ańľ‡j PZ•­Ü6 éł<™Ű ý+5Q$ś~XÜňaĘÚű`7ä5Ďß 7?kÚ> tőŇ'ĎkƧiQ€4U&ĺQťüŹÖ]ÜrWk %UX4Ŕ{ŢćF [KШMá#X@ĹEŠźŁáŃ,ŃŰŘ_8e- —)ČV_łv.źÝ€ 9ˇŕ‘žp!čgKĂĎm¸ŠŸ[tşYstô:~(9_Őń)ĘVIčRŮ?q)+!{CRľ­˘˘ŇLd~—˝Z#KŰČU/žKa¤ŐśÍŹđiv!­ŘjŸ?R-%Á!†Ú”fËJ4|ČKÂőlY•ÉÁ˜-ٲ0qqiËłe5檊íd•Ś×QŘíրK 5ŕę%üËĺî†Â\}_Ş60-\çŽ]çYôLjÎH äŕHƒ,™ćŕH‚,ČÁ‘)Xž‚Ušă‹fd.ťţnTmy7% ŐŽ˝›Áť2ź9¸9Ťö|äčT-…AŃŠ28ZJƒ˘łObh)ŠNŐAŃůk:ůşů.ő~u:ž-řl<ăi՚SŹÖŢô—:ÓĎrĚŕů}ž˘~(ĺŸ BČ_Y˝!Qq…puÇöňIL%/üľ˝Ó˝rďĚΝż*BdZäČÁą ŕĐ[ ŔÁąŕP˙_ƒU˘íËŢN‹xMś8*[śź]RŢÎ šB#Ţ"Čn¤‚šrM‚l Smp´E§ęŕh)ŠNŸÄŃR *„˘Ő{rńs U49Ń+9ł 9Ă;ŰŹ6*˘ÎŤƒ¨ń@Wr ¨˜ËŚ\ŚC•ŐĐĄNŐŚÍ Ĺ-Ş]Ĺ dpzKxô…RŇl OĹÉĺŇâąŕ`ĽŞ|6'äÉŘ\IŐU5ßpJEľí˛^nşlp"…´xŞůe#€‰iŰe:DbÚvY:Š/Ö1c1tń%‹nL”śËĘëMŃCĎ4U&F´~X|˝¤™2˜ŤIë­ĎJ§÷ĺzç…öj‘Ş÷t4:‡_tËšiŔ YVë÷ÔÔZ]ÚúvÓGá|Z–Ô;~Ő\ŤÚ,űjš 8SÇöU§ůĽňÚyĄ×ŚĆái‚5ŕ2Â8<Ͱ\†‡§)րËăđ4Ç8\˝ kjAFÁ"Ň­2ü+Oř˛kÎé|[xŒ)×|Ü葨ʣ6O)…ůĚŠ=b༞/ˇx |0T :]m÷ČŮťöˆ†Ä˸9#W­qůeěFœ7kŃć—1m…  ÂBsÇĄ`aŽ@ÁÂűŸ‚Ľű98ö>KçS°JëËvœ`…ž6 Âkw8Wvœŕ3ƒľwœoî8ÜÜq˛žjď8jƒŁĽ8(:UGKyPtú$Ž–ĄčT!­Ţó•;RfKśśœš ßsćkÖ\{Ó1çv!qŁP6K2aíŠn62Bˇ šf–AjŞPvŘÍćŚ\ŕjˆŤč\]j,C.ÎíhSháW@ŽR_Ä(.Ť×y€Nž <×Ć_c4†j28K—rplR –ĺŕآ,ĘÁąA)X^Ž‚ó4Gů˛wƒż,ŁĘ!U[Ţ /Ż˝› "Žą÷€7Ů{€›ě Ř´Ů›ŁĽ.čX-•Ń@ÇŇŕčě“:GKup´zMý:öś.'zťĎœšĎx盵FUÝFŢÎ+ęPĘ?]áíłĺUŢ>›^áíłá:oŸíh;ŘţX‹ˇp•—)8tkźś´Ĺ×*8›+úş‚ł:˙(U‹¨zŘ$ÜÓćżć >śpă¨wĐĽĺč’;JƒółZŮţľÉHM}ŻJE †YQ¨Š˙-łż”BƒčíáŘ=ˇĎŸOOݡýéžű:rwu(‹.›butĎ Á‰^úšáíí—ÝřÜOâŃÚ* ňěŕbÂ;Ź73CÔĺéţ楝ËúO×Ó$×, :bŒŘü&łhĎÇrËżu˙ţóáćń´˙üÔ=?íž:řžůrb׹F‚đLőÁ;nˆ>‘ÎU÷~¸9íşZ›Ý§Ý=#~ŘęŘ-5LČź´Őínť)#n*‹Ô(‹„—㏁›ŮŽ>ł„m@ ÎĎ<ŢäöčîÇF Ý”ŞĎܜ¸˙€Ţ[X>uO÷Ô6ýŸĎjŮi‚ż˛?@żâô˜ !qC…[ŐCŇÖRGnDéß3.¤6Äâě{˝ł;ť<[I,1Ú^2=™›iÉě;ńő÷÷Zâ–ÔPťÉěÚnň˝÷v{Ę_Ú˝rö•×ÓÔv$z“79;Ń6oűI ú.S*R˜\RVĐ6áçł6=̂]HĎqęŸ0%ćGˆń÷1C ‰‘p=Úq ă˜;…Ń]×.ŠćY3űÄbU 7 žĆŤŞ IŻ B(ôżŻ—’‡ÁzÍíř> /ExtGState << /GS2 1626 0 R /GS3 1628 0 R >> /Font << /TT3 1599 0 R /TT4 1603 0 R /TT5 1601 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 10 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 2 >> endobj 10 0 obj << /Filter /FlateDecode /Length 11 0 R >> stream H‰¤WŰn7}ŸŻŕăîƒ(Ţ/‹ €ĺxƒ1`Ř$YĂ ČŇؙ…- ň(›üý{šÝ¤ú°ťgÖœOuUąxŞęđňĹăa˙éúćŔžűîrű×Î]žšţźżť>ěďďŘĺ‹Ăáúć÷Ý-{š˝`.ŻŽî˙dď˝ŕĘ2o,×N[fâ>XĂź Ü !ه￿úáĺćňĺ;Ĺnž1ŃýÇžÝÜm$ŰłÍĺŰÝŠđÇîĺý—űÇý×ÝáqĂ÷›ËéƒĎß6WŰÍĺvŤ™dŰOÁ…–moŘE÷“ţńżĚó:ŻÝŻ(›ŔbŰŻ›żmďŸn~s}Ë~ş;ěţžýĎŚ6–Ęp!Ľ-?yüt ľć:šĘđ™yn¤ ĽŮţî3űńiťc/noQQqŤuőÍÝíÓ×°×O_ű‡/ť‹ŤôUw`7ž]MĎŽ,š2˘ŞŔÓá@×÷îéáá~[EË]0Ś:˙˝{˜šjЏ“žJswł˙´żé> ;œ,?`S3c#7ĆűŇĚJyA'Ŕ:jâ[pĽľ2D„Š­•–G*Ďowpö˘+gޤH5”TNŐ}vüeuä‘ţLľÝÝ÷Ž/ÓUĐm?î6Ÿ6Ż^Ëߤćyýň§ČۑřGţš‘żRu‘é—ęčťĐ‘EÉéâTç° ůĚŻD~łŠ%e&LéçjHžęPeŒŤBůF05,­ősÁčPF§RÁ\#˜ž Ś´ŕŇʙXĘN#¨ŽĄmÄ2łą|äÚ8=,D4˘2˜iłsÁ´ ÔłŇÍÓDHAŹŻ‚éF07Ě{sÁBŕJÉŞŇÄĚĎ3Ęń¨•š fşyé*ž2ŮfƒyÇĽňv.Xp4ÁdĹWp°ŰwœyŇt?Ž­KăF̡n=ěŃ)­ CˇÔjŻ’­ť9”<÷s¨˙S őĹÓ—žkš4ĎËŠDĹMłj@­+Q%5Č&ę4—M4-ÝFL˙rDťŽ@ĹŐ2 Ů44…i|™ŔöqŇ.iNJ8çšăY0•¸;ŒăAő(égFŕP`ćú"p(/su8Ô‚šDŠ€Ŕ’Čp uËÍçĺF~ŠĺF•Ć—H*ńؚU­I äCKŁĹŽÂ-"ČoŽ ŠP—uűÖ¤ä í‘ÔýÓşÔ[Hi˙]™BLĚhƒFiJťV*Ľ2ń<ŢČŇĄ€I)Ęc#›5‘•Ąu‚.ţň…VŽ„ž´Ô[’ěsI_Œ–\}€Ś>đ¨üŞóŘ5çŃÚpçźYŹdÚ¨^ŹťCˇ*˛'†ŞÚ!ŽdÚŻNčXŃ –GÇ´?ýŞ$ýš$&é×IřŃá[ŮčŔƒ_G´°*r —Ą"ĹĎ02őBp&´"“Xs›'””éw=‹1@°ź@uޚŁçŤœ_sŁ^s#Ît‹]ąë˘Ëiœ1ĎwÝšK’<:NĆ˝÷œ‹ˆaŢq=3p™˘9ŠĄˆ&ÂĽägZʞŮRɡȞŰME-â#,ób=í–Yąžô˜‡XOy„ĺ;CXY^w҅Q@5?ĄţXq]ÉóâLuš™€ܜ€ڜ€„6r˜ÁL\€`&‹ł4}ř€Ŕňą†Yœ€ôŔ˛š•[3°´ÁS°´`ŚĹ1¨ˆFšo¸´ĆCšŻť îˆ#ś×¨HNJŁHNZY6r1bŢ–Ásái^.FŽŠ”žĐk"C­1}dĐó)Ňă§pŘxâPm´Iü)rTř=b‰…2š5YŞUYzËŁŐÍüŠł¤ç Őé)´œe¤véí˛œ%ÜŹ“W“6œZú(°Ö¤2‚YEł*°OýQ;ü–G2ž:ł€ŐŃŃŃsF­şC¸‚§o0jĄ*ŽżĹľÔ䪢俥!Ő[éXü՟hJ2č°ć4nŐi<˝öŒŠNó3Î2˝9]=U^CØčă]+Çź‰ŹO l˘˛ň.jŔyľŕ~5༑Zpż“pŢJ-¸ßK 8oŚ\^oŠ•ŁöŠĹnÜ,™Š%yžu ×Ô3oz!vƒoÁ›Ĺ‹ŚňŚ4iŸý oxyÔŢhiŃAÝ oxČWŢ4­šÎĆľ7Zt v…7=’oľüRL˘pćńŃÁÍÇG‡6„š68°‚™řÁLg`ŚN °źÂ3Z¤ŘsOŃ?) 5ÖĘ4ďtęŐĺW˝‹ 5ĄˇqEŠÝfôUd‰ Š­ľmژç&=´äŒšmÁýkŔyĚľŕ~Đ5ŕ<ępY\sşšĽfłjÖA˛b &ĎKPyîZ[ ayIAŹßQË÷ąţň–obýľ!,ßÂĘڞ&Yé‚0{Wç –äY-^–Ą#´ĺJ7ĺJ‡6ĺŠŇ<4ĺ &@0S ˜É€Ŕá,Ět@ŕŔ–xŚ\9iNތXތ8s-výßr…Ć–>ÎŢßäĘhš(WFÓš2.ȕѰQ ˘\.ȕŃ0Ě˕ĺO”+K)re4tóre9ĹĺĘBŠŁ\Y`Ä(W–S{Ţ´ĚrçŠäÝc'jšČŤ7} Ť_ŞüxDÔ/‘Ą¤zŇs7<+ź—˜˙^ňő–Ľ˘Á“‰'o yäHÍMĹ}˝A\I Ŕ§ňNŻľÓkKśgŔĄ×ÔňyÜ]÷$ş~ vź§y?ľěs ľ/bß ÍŘĐV|Ú˛„b Żň2}׊7ĹĘ´ÉçˇâĄŽÚgz=?Â/ľ,רĎÉ”>†ŒŸßqÎyqÄ ­Š8Jx:Őv× Ŕç?ť§úąîořZ1AĹŸĘ8.ťÖuîp[I›^ʊ¤(+śšĘf† ŽŇľ;–(Œą™QeRź”6K+ŘâÜ#ĚD~];ƒ]1uĚ-tĚPŃCC)ŀ0v‘IÜ[ŽˆŘśOŚce:Š\lÎbO‚(Œ766]žńŇÉŘôŔ›úLJ›$PívßĂęő:0:Ąr] ?•ĎLŔbUvťÁ˛‰?A] ]č8vkć’÷ŠUÇ ˆ׃I­YęĹĂůšV§g‰LcŕŠ"ś}hPńĢĽ/i˙F[ŢÔgVú*u _LçO¨ôÄaœI- ➌’ž—‰Ű-ţ~ľëfUѐÜ/ě`“)'mobć™Jf›lĄýčHB@š3ű…iSÎăRĽОÁ _méI§űîREkL J29Ę<(ވ Âž8+ąI#Úç[déôÜh•Şcő—%ŤóĽí墂“ůŰ$<ŻŕŔްIdţŘ{.5]dÂy›˛{@jŽÄɑŠ086WCGşœt\’V+´Ę–2Éx‘Ôü6°~׳u§ăŇz—<›%e=¤cácS–@”S™ľ…ŽM{ŢÔáş-ŽŠťňň4mŃ;OŹą$–áQĆg~9îčˆ=Ž7áŔł­ÁQ˘súáĹT Z"˝Lj…YáUąCľdŠŇ!H ť:Ú$Ń1ÓöyšŤi;)vaăŰVá=E ˇó”t •ZĆöř˘-ôäČéô\¸šđ‡4*öć73Î3Łu’ŘLWýА) pŮÂĹŃţԐ)4ż+nІ,?~šQm0١ŐnBÚ3Ęx@>y5­Űť×\“Hľ-´Ó‚@áÎ9_EQŰę‘đŽdűzWWl*J8bĄöăPëť7´YkąiĆŘgĽŚ1žťń<âŃâ\ą)Ť+Ta2]ČزšJ!'Œkśe¸6ĺ…;ċ¨{ Kň‚–5•PšZ%äœĘ3élňÚEAgpęY—Dćń Î4đ‚ ĂXŠÓî@Đ “ŢšŔdžÓ#Ë+:j@łeIË{nĘsŽ’ 'Š2o‹Ň9ŸŰk2PÔj•ƒeŮça-oL;Ż(Rk֔¸ŘćÉËX>4×ÜçIԚ,ăËĚ9—Œ6É(ŻáúcîL ň›nŘPöz…­Wő<ĺK“wjä"ĆN°ź!ľ>TsóÞ.ÖŢéŢë4<ĐŘxŢ ­łČƒ-°Â=ę ˆŕČ´îCŮÎťŤŐ–VţTĂrŞĄĺjH Ą.ŠHK“˛îŘgjƒöY•<ŤâŘžž^(ÝBó}‰7Bs›|ĘĄÄcľkÖń›…×~¸}őáăűW?}?˙üÓÇ÷żţ"°{Ţž}÷ËűWďn“Ĺ('–ÍY–E$ŕNŤëŘZő˙*öqRj4‡ÔŔÜcżŤořË@c%J“| űŠę^ŘjƒŘt‡ţ„ ˛4qÚĆAŽBpyGšÄž`óÔěvÓš4‰ŹœY´'Ŕ 2Ž"Şáxšŕů Ą‘— ˘ÓČşkwźhЙ3ÉŤäE‰:'–|8pËԒ.ĂŠ’÷ü ĚM–ăRMZ@ĽäA¨łgbbΛ:˜Ú$Ľí"^X.2…E÷Dž´ŽöI˝—g§ĘKíŽ(š)q†úÔt #‘&ŔŽň‹×‰Ĺ†ŐŇ%•ĹT]^'*`ńŻç-ĹÄ⠙ çŮ4hvB3 ů˝óƁXĆćt~\LVÍiĚć> œołŇăËqxÖTŃĄq™ߖćܛ$*­tĚ:Ÿ˛Ó8(l|a Ľ÷™†ŒˆyąT¨Ź´¸#S> Í]˜:ŮmD7x8qa3Qs%Ë$éą>ór1"´ÔIߛ!\ˆU;j‡u ś|bKŠFjhK64Şšu–J&ŕۘ˘Jg@ž­Ë Sçy44Çm|‘ŘüŹŘQX3DČ>gűň ÎâuťŇ(î@Ĺ˝<Á÷v­w. ŽŚć‹Zcgď€î?v ^‘-’—(šÇĐôZŤžƒĽˆkĹ]ůĺŐŮVȅWŻM~nŘIĄ:ӊN‹čĚęg…Ą H’ŐťÓöy~ÚâK7ŤKŠ×řšň×Ăćéźß˛´„l3a~ŸI˛ňJsSřŮůőÂúg•_¤éĂĄČ Ň‡čuţułÝ”}mʞń•î˝öŻ—ý°'dĽîbŽ&`Óő]Ťm>œ›Gé;h$8üáëń;–Ó/Ľî“ÉöĹž™ě{.ôBăU‹—5R5ăęwCNć KÓÂlЧgÎLü˘A]˘î|r €U݊•V8ż†Vč@:>ƒŤWáby˛˛Žžn€öń+pe§AŤi \ľ—Ô ŘŚŽš.ş uŤp‘*yWŽÂĹč4Upí­p‰ß¤\Ť„ÁbšĂkpĄŒk°ş›ąR‘Ů5ŹČ“Đ9ÖnŤ—­Ö5p} ŽÔŠě˜Đh­v­´$ÖĘ6ŹĄŐĘd(Ą 7ŁuਾBĐGJfhý*ZÚ)*Ŕ†.;Ň>´f4"§AĄč¨ë}k×Ă .lĆ[Ô­đ*ÂÉëá$u¨ŠpŞ" ޑ,Z†Ł‹–ö0$cĐ6Ć´€y×AÂBtý ń ŰüÂęŁséYĐÇÂ,•l.–ŢŠľ*­†yĐ[űż'VÝĆpTÓ4ZZ1̃.ž…d튛˝W#š) TZ9đşiVĂ­řË`”Py–9ăœeĆşH2g“ĚXIćŹs˘ëœ(ƸHc]ąćЏçđ^ŐCiç Ř ĎFÁ†_`‰ŃŽ—śŁZŰž˙kő‰'HÄëRç݁sŘ,1Şlę;čÉ _ú8ƒoJ}yWƒ`ĺM\K}mŘžÎCRQH$) yxĎ^"PB„Ô—O–ŘmşęďqůKœĽ¨Ÿ9â]5ÉgO&yWÍ][ÖUbř^D-¸!uíx×Ŕ`ýÂş*”ĄwžîemÍË*dJ[—˝Öwť#WÚşŰ]ŐíhëĐÉŹ[śěí†v֐šţ›uľćł^ŮłŽ`PŮç?<|g=i— ŰŽ M ƒÖušň5šŇŇ´ĘiSńR¤Ôœ ˛îöPuťďZßATÜĺ%ěʧĂ "A葮ŃÚF&ÓŠ`FLÁ<͘’y2ó8e ÖiĚ̋”ŠŽăôl”ˆŒřěubżĐVô ”CY÷ż‚l-ް¤3ú˘žŁ˘žđBATýÂŻÔLR°Í”jĚĽٛIÓkŠTŐŐ,űçe§ZÓĽŮŤeg[ot¨şšyD,8óÚ͖žŮşŞ›ůa’G ˜:}é­~÷r>9J†Ö¨éuT¨_ŤMR~Lĺą'ŤĺŐ$‘6VXߪŽć'ZQKÓâŁýŐŤIá:í꾚~yDˆv/ÝőN$*\ĽŤ'‚”DIetM˛`(’7GŽ,˜'’ä͑% ć‰&yóēź5%oNžƒŐQ!2*”‰&PbW_şBFĚ2ńz<ŒzI&VÄ㙹 +âńt[‰ń*dö,+âUČěY&VÄŤŮłLäăíiiČi˘c5]Š ߯HZ3’?ŠŮ×JĎö‚‘˜…ð:š¸¸“œĺc6ˇRožXĄpVk‹‡'Îŕňľtv$”ÂYX.é†?KĆPÎőDFüáÉ:^ŰeU:łÔPnw˝¨S=Wáj„ú Tś>΅RáE›FeZČÁÉşO­şŐŞ'¨Áúíĺyטśi>&n^ľÂž4š_śżmšíféŚTך¸ë)5k˜ŒÖűý÷ԌˇąAňHĄégďh=§VԄô.Z_SŤGd?g¨šßŸOĹ~wĹčB|ą|Ń9<˘O˙ŁŮŇ÷Ăčź Ë#ŰÍywB]vĎ˙Ű%ÎŕŚÎunéü8XdąóI´!UÇç9e1ŤP&ÂŤä{ţL,žL$áÉa(fsŠ–šTŕ;LĘ$ěń´k~ěŇb2˜0iěCbGvÁůĽĂ>óEI-–߲Oôô‰4Ćf— ä>ÉŤĆ#8‘Śíő˜xvވVËďżnśgę̏Żřˆ7żmží›óţxhŢź=Ÿ7ŰÇÝCóéÍť#֙͗7ďŢ˙j>9¤Ň ĺ-9žĆ„D…ŮbÜa:{něĄÇ{juÓxď`Jb$-Z65 Ҋě~=>]şIJ‘Q‹X݌“Ő’ŚŒNĎűoçćł4:ć„! ŕý|B70nhnФYż=! X2:6OçýöÔ|8l˙WŚc sÍ Í‘4ä  =ǜ… Űąč27…”p]Ĺ A+EK›ł‡Ą’-Ć $mKfŔ(7Ű0Ě ‘S(WÎĽ endstream endobj 11 0 obj 8670 endobj 12 0 obj << /Type /Page /Parent 1591 0 R /Resources << /ColorSpace << /CS2 1605 0 R /CS3 1604 0 R >> /ExtGState << /GS2 1626 0 R /GS3 1628 0 R >> /Font << /TT4 1599 0 R /TT5 1603 0 R /TT6 1601 0 R /TT7 1597 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 16 0 R /Annots [ 13 0 R 14 0 R 15 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 3 >> endobj 13 0 obj << /Dest [ 9 0 R /XYZ 180 599 null ] /Type /Annot /Subtype /Link /Rect [ 482 690 520 703 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 14 0 obj << /Dest [ 1 0 R /XYZ 190 132 null ] /Type /Annot /Subtype /Link /Rect [ 386 626 425 639 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 15 0 obj << /Dest [ 9 0 R /XYZ 180 599 null ] /Type /Annot /Subtype /Link /Rect [ 430 272 469 285 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /H /O >> endobj 16 0 obj << /Filter /FlateDecode /Length 17 0 R >> stream H‰”WM7˝ëWđ°đpřýdx'đÁ@6°‡ŘÔšéÍXŇś¤8Ţ_żÝúhR՚žĂbąX|UőŢíŰfW/góűńÇŰé÷MĹn›=ÔŤŮŽ^ŻŘíŰÝn6ŹěŰézĂžÜŢÝ­˙fxÁ•eŢXŽśĚĹ}°†y¸B˛/?ýt÷óťÉíťOŠÍˇL´˙ŘvžšHVłÉíďŐNřŤzˇ~Z7ő×j×ÔsÖԓŰ_ąáa;š›Nn§SĂ$›.'‚ !,›ÎŮMű‰?~cžÇĐzm?źB4;ĹŚ_'ŻŚëýüńˇŮ‚}XíŞ×Ó˙LrcŠ RÚţ–f9# ľć:šĚpN™yn¤ }łzőŔ~Ý׋Š˝],¨˘âVëlĎją˙úű¸Ú՛§ęć.íj/ěÎwW—wWތČ2°ßíđ|Ÿö›Íúňl-wÁ˜ěţ;öisiŞĽâNú,Ěj^/ëy běDp˛ż]šš1Ţ÷ÍŹ”7¸Ą ŹŁނë[+s \ÚZiyt!óü{őgoŰtŚLŠ”C‰tŞv[÷euä˙]ţ~:Ü÷Ž/ÓS൛j˛œź˙”˙–Šçăť?Ă[üżöŒ_ŮâGbížle€óYłÍÇt`i=â3şgY/OŐ]űĆiNrÝI˝ú(˝ŸÜĚ=7ěóŤűzG)ĂóD×7–âóëcBŠ[ËěÖŽWľąÍ÷Ą~‰ „çm΅ĺÁ¤ŔSő>Ö[†Ŕ~ś~–l÷Xą ęůqFEŤPĎĆ(•ťŮ˛#­ńĐ2“[%MçÎ Ÿ›Ö¤ŠÜK[Śgb÷í;qĆ>,Y^ŃíW ň˘‘öc#ůTZIEyň#mŠ>ĽD‘î<ŮČôę”îoőÓ`žY7í#“„üpaŹ‘$‹<9•ĽSfô13’†ń1.ľ#LëĄK1ŰîfťŠŐ]üłÍŚYoš:ýió46ń靌:÷?›ŸÜ -­-<ېďţş^¤tÎ˙ŹvoŘlľ`ł-ź-R Ĺ`…ß_ę‡}S1Cú´x_řTšOě:^Iž26Přnjtą şjNWy{ż]?íwĎ*˝ĺ ÖŮśóMĐ;ž%¨ü›.ŠôQ^ěţ§üüšłéă)xy ^“… 4ÇŹ0šŁĄěKŽĆĽs[2>ŕJfJbV'nc1 2ÓSe“[‚ÄlwEĘĐzK™ctsëŒĎÍŮj˝cóőj ѐŰ0BuPĄH͂íÖěřď!ğů™ĺD~UŞ‘äéď]ľZŔßĐ5%ŹÁţBž ­Ž´‡)Ť˜D^ôŃ<°ĹŽ¸ŇƒŮ dg$7î8‘YĄ¨€Š4ٖr"ŞP Q9‘ůéf3‰séa ĄoŽgłšÍçĘ34&B0ę„10›—놭Ÿ7[2A ?F=f>žÓŚÇů˜›>ŃŚ‘ $gŚtOPĘa‚;›Ű.ń¨7C°VÎrŻŔ˛-iźÖAƒKGŸ['ŢÝĐ˝„šŠđţ†6ľ\*]d/MEľ7ő}6=4›ÝŻ1—H†”zĘŽČ.FQšŔöj#ÍĆ3MÎ=xş€Ĺ§ď+šŘD̊cg23VƎĹeĆ5ÔăřIw„,Ŕ$Otň ÉR˛˜Š"Ä|G’tášÜ¸‚rœŐ Áˆöœ’mťlśť¤Ť&‘6[„řůŐ_Uł…cŠ˜rEŃvü#sx¨OkŁy8nźÖ\-٧‰–*4ę5On¨Mw ‚điŁŕ!‘üţ0ŹţľŻšşÚţA?6诃4Íś*úĽ~0Ú2SÎ͔Žhmnü…x`ÂŻ'ńë×>§v“` ÇŃűźÔ`ĘŕŠV,UęÔŢŤmĹÚ㚊NŒáĘë˜oŰ4Řśę4ÂjO3Âă$˛÷Ćǒ%ŞAcD*uúlSKJţŰ=4M dF(ƒÜHçyôIštšŔÂúť;A´íűvögJë‡ —nŇÍÉą–: s F™ł46i-…^iRš“ŚŹQÄ"7łłŠ'°ŮŤÍÓôSt„LߤáN6sŠĄó¤´ů†=i Îl1érSZf@pŨ Ż÷´ŠăVę"b$ˆœ ńĚöŰc=dŐj%˛˝ŠVPLM(˘8 \ üÍúÜú€ë­C‰X\'50IÚÔޝܨ|HWĄu…†rI%×ßńH›‚z@&3u€?‡œhŞ„}Î>,)Ę`)Ăi]ľ• DË&ÚĽ;!8~1á¤Ç`Íü&fJ>T–ˆNĺÖ˙Ťšő›tK0¨ţ_­YŚ{ ż†.,/Ź}j[Š4_vaĚńÂ$0pçbęĺ…%hŞŮŽjŢĐőpz4G-b _ľoü¸Ţ‰ ‡ú´:ߗŕ°óY“ĘTI´Äx˛=tĄ)(ŤŠ°¨<¸š—!7Ms€´FuyW„@+t{ŃT„0ŘŢÖůHá(šňُĘHփ„˙"olôؒžG‹mŤôşß脎jŹ#JcđG ŐܔځyQ˜ŽčŽŔtŹtŕË|Ăę%¨+é")ŐÎĚž RQ™ˆ`‹łRٟ†ŃŔçÎ$—˛Ű‚jÁhY i٧Ĺ1ëšv‡x^;áՀMj‰ďŤó%BĽDÜ*ł`łUâŃ2[š HÍub™)Í”ähš…Wš ŕ ´Ô…×ŽțCăÜvU++c{RdAsĂ 4ß)wu[ŢÇĺ¨ÁP} °ÜBSâîň–ę;Ű0Ť|iŹRŽE+MäZ•᪍á:ÁŽzq¸2"\ W ƒömtŽźŽ‚\…ĺˆpőKĂU&u´ká"Uę"\q5ÜDF…k^ŽΔşn4^áĘx-\­ü˜Xí‹cM s×bEž¤)c Wc Š3&\÷Ňp @&ŻDk4J(Łőע5:)•1ŃúG›0v­+dJ”]AşŤá˘ďĄĺĆ1“ýۡb!÷‹Ž •HyP ×ܒ#°č]Šb]gĎşSâyw*U”hťËłîäw˝O’i„;őź;@i„ăNp—P„ăÎ<ďÎŕÁ…rŒ;;Â]*îÁ‡€ZQ) Ť2‰GĹn 0Äëž@1Bo5d‹Ţç{ƒë/+ Aa†6ŤşŃNŽjŁťIÚŽśĎVMŰSş­&Íńţj éďC{AŰZX’çxłC‹˛dŘńőU¤Yw§â)şEUf™ZwH,­äFG;ćd˛ç—•ĐÜĘÜ!y˛Ž*q2=J‡8Q?2ŒöQŽ8YÓ¤p¨%đcs‡äÉZ&y•(Áó'ÓĂŚtč"1wHŸě5W6üŸňŞë‘Ű8‚…1"óəyˆ°ź%€€$°üpŇQžƒOťÂîž%ĺ×§šKr9s5$ďi螞bOwuőžwś|.ńX˙âö;;Ű.Eťçf>Âʀ#6ÄíwvěkŤÉž˜Î´Y×Ţ׏&§şŠuâ:nžÉŽbžŘŽ›gşŤ˜'žăć‰đ¸uf]Nf‰Gôă óꉫZŔŇU‚¨U elK ő‰­$ëIj’ŮŚn¤śą™męCj›ŮĆdŚŠý˜m™GóÚ}0ÚańĄtÄbŁě‚ł˙Ú*¨Ľ_âŇżňŕöľ@AČ"ƒŤPĽń­)°şUŹŇŒfVJhŤXÁh&Öą尊"KŹv ŤA§KŮlbĽš†ŐaŽaE–L‰ŐŹbك•ňďV‹ę2ŚŽŐjßU`ŐkX-dń6PĘěŤ@Ľ´ş H‘vPľ TŘĎíŔJÇƀĐMXUZbu:śvĽD‡Ĺ˜?hZƒęŹĎ?ž•ޤU¨ŁqĺýE¸Y“CŤPŢĄ‚óDƒ ŕY5Ë,ˇÝq˘LƘŮƑ2ťĽu*ôč4U¨q+ƒń:–F'_r=č„)—ƇéÁOމŢ9Ž$j›fşj\§‹ŇŹŠP„U˛źŠÔ–ç[PEŒeR&ľ˜,ľ*˜­´ nVZüđTÜ:UÂŐZ)…ńh­*gÇbŕ÷ŽŐŔÓ‹óŔëÖQť™ÚŐhZ,Y–šqĘ2ľÎIćÖ)ÉÔ:'™[§DQë”(jœSA­Ë"6ʈ‚ě¤9ÎűÔŠVŁŤœ’i)ęĂĎlË՝nU KÇoîˆ 7-<˘ŽÁˇŢť,$0r´$wňWęťśó: iۖş&¸†˜ÁTĚŃ(ݝ;ţĆ=˜¨—Ž5žą”oŠ€V;Ź0ŕEŔˇěf {4ÚěšŮíşšCÍŠ< ż#Öt6íšŮďšŮÚąqłôCPßssˇë樠ló€üfČŹŐwžŘŠ›w/­[¨×œD¨u&nH„Z'ĄĆ™D¨u™+*^çKDŃ8eľl†ëC–jÍڐ]Ć+gʤÚ]ťrˇšŸŰFę§Ć‰ůšq|3jœžŒÇŁĆńÁ¨mz/j\ćôŐ˘8Bmc?Hł†)D1hQ‹|_x4aMkeڔűó÷ďÔkąj˝mVŔjŻ‘ümˇŠÖGÔŐ°úŐ`‘šIÖ¨€b(Ŕú5°MwĄ5ŻEkź‘Ę\AŰ|NÖ­˘ĹаťĐÚעľH_ką”*U€ľk`­q`ű=`ÝŤÁ"sÉ­ĄĹĐtŽ@kVŃb6ł­-Z‡ÔŮ5BAKFĐkhÇěb„îŐh‘ş¸Ć2œmÉjmÉÔŔŽ f%ú°śĐÍVşĐÝŹtĄă‡ç‘C­óĚŹ•…n ʀ>´u3äž I﹙ύ" ŐNčJoŢluhŁŽqÇ͑˜2 |Ly@~3d˜ńqĎ;G>Š€ÎřÖÚ¸ý΢Fť힛ůŕ*BZ‡ˇßY”ĽśŐdOL§EF^{ZǛœę*։ë¸y&ťŠyb;nžéŽbžřŽ›'Âă֙ń¸yůtěϲŽčňQŰ!5qUÄ ŕŚíśĂQnŽiťípœ`+Ún;g͊śŰˇCß´Ýv¸şřŚí6ĂĽşřŚíx¸ą-C’˜Fr4™:‘î‹"zœ#ʏŐf˜ěÓY'”@”aĺ0ŹÁ,.V† G~ŘXpŻŠŢ<ąAĺ0Ź]W=¨ÜľÚފ*ˇ GáĘD•†úKČÔD ^Â/Ryłs#헏šƒűţćđűóŠoşśiŢežĐU&ú´ô<>|řçÝ}ÓgŽ`M•[:~Ë"@)˝t¸d!Ź’u(d¨÷™ƄĹčsƒÎR]Xz4˙zîOýšůr—šź›%Ąo2—qĐš,Óşůđx9׈#ŸüţŚŻľšM5ÉđOŇĆÖşë˙üíŇîűűŸžG19k ĘvĐ6‹#—Ëńpţ•z{$ŹKŮ–:vş 4şpl[E]‘ˇ ¤ĽnŽż‰cžP #ńÁCťŔ>[¸H™ˇ8ÍűżĚŮ-ý2˜}.ƒ¨}Űjóţ‡ÚsĐŮ? ăš‚°‹¨S‰˙îĄ?÷×ďϟűÓÝĽo.}s q"śËcĐg4łMI%/]?sWđHVÉ\?PW‡QĽú—ŽýŠ9~júąŹšĎC˝°óž“&^ž§Ża*kK×óó—/ÇÓEnůN9ô¸ ÎćÇ.Ň÷móîîţĐ\Žż÷ČňéMsaAźQmŒĄ€ůŔ]ťÖ)áŻ,#ߊŻĹ&×už|ýP2~âb•ŞĹŁ-FęxňÓńDT›Şz^zÓti d­´Í]ď÷5Ů "é!(“`Šđ´^°ÂqAl™+ęel牿ŞÔĽe¸Ç„ œ:Úw2ÎTHĄČČׇǏźĎ@ďŠ/|Ŕ`ýrBżĐ­ŇŁ—ăĺîi~ž‘€ƒaŹąXSů1<ĹÖÉěŔç˜wZ VۛPMÖŮ2,Ľł2Đ4ř\‹-‹óWýţ‡ÔÍůářő|ˌž3cŤ…­&ĄşĘ\œn>ßhi¨$cBĘOđâĆpJ/\QŘ|@ĹÖĽÎĺΔņĺŰ!xŹN箕Žr-TX•Ď舎śČ ^š=lPc1ČĘš Â`3°Ö tW˘řuůétäŃôi2Ĺk7Ž—‡ć?ÍÝážůoóx¨Žƒ¤Lq›táß?œOĎ›ôJ§‘Ձ;Ţ÷˙č/hăŠůx<üٟÎýÓ÷7Ż˘cąîtŞŰUľ П¨Vm|á:H„;(č§#úëCϟXCńdGš”°h#‹Í tw(ŮĽĘ;7˜Ÿ`żaôž˙Ąmţńi7…Ë TG@匳ESMČţןŽÂČěă §™ő *čA—¸?Ň\z̀Nů9ďf{­B›ś€VÓG/  }u§dBuůIxCáé›C´6÷˙Ć9?ĘęÜuzdŽ„Á…ĄŔÂe&Rš’EěËą&_˝ČŞ<)ç7CëK/ç55h{°E­˛$LđEŽąÝźž´LR2›‹lŠ.oîűÇűNł˜_V•ŻŒöËăďĎ'úŽÎÇś ¨Ąü¸kž>>=5‡ţĎQ,˝ŹĺŽ `ęüÜ8†ó'wŤ*›§Ů$őÝ_ ‘č÷WÇĂ%4ŁĐKkbv~䈇đ)€›=´Mvtf›ůM÷"݇-V ě0Ş?K˘ça@Ÿ*H•Ž8Ëdž’E'鑱A˝°ťtÁŇűŤŇżŠ?ē…ľHęLxäoúÚ6Ă+ĺ^}j—ÚĹgä˘ńľîč„Đ>*AťgÇž/ćďqtRÔĹ)Î˛Í ‘fŽCœ/˙§źjzÜśč}=6˛řMA€őfš"Mö–ć xe[¨×r%yŃý÷}¤m‰#SFs֛ѐ|óćMهMĆ9Źś\L~ÁžVť˛Ż_gž^ş*“nhŹD8…ĽĐ¤ IiáŇóI%ĎUjx|ş{üüpˇřÂŢż_|~řô‘Š}ř°üřpˇ|Šj~űš<ţĂĹĺ 3šu2÷YňnÜՂŸ|ŃőXŒĐUt a\*BŽu!IU ¸L[AŞĘ@@d5Ž>žßCCSÎĐ78Ř–˘šôd)Ź™˝&řXô;˝Çž`‘ľ%ŁI:öRŇ~‚¸hK.󍻩‘lJÁxʂdŰV@QŽăŁ0”'ôo–ű4„'íwôJaŢfIGG~¤a`’ȏŽPPnT¨ůőý ućxqÚW°h´UG[ÂS0/(ŽÚ÷l}lĄ…-C­'ú+ ÚČëoslË~čCA^RƂ„Ćňd@"ĂS!ô ďęďŞ÷üRöYB6”…Ăż%îçź˝żX >'Ćó}Ű×ërŐűÜOo‡Š-ž”›zŕĹ}ߗŤ-ZěűbŮŔE˝°‹ĺ˛ů—}ˇ9Œ3؆ÝŽR:I†Ł’ý˜óĹhÇÐą—2íšJLhń Ÿ1Ç Ś˜čĄ9\ĂđÎYŽe”ë-‚>@˙ŠÔ֛mĎţ‚Î CžˆŔфsnŒPě[ő•ĐĂŰ7—§Ôڗ‡ž^uěÓ~Ő´×^Î ˇQŔĄi˝ôeě~ˇc_}í‰(3°”Q׎j_}ŕ5-‚KÉU|D0Ö\ř‚'×ţ…ą ďcjz&ý'ŔÄuSq endstream endobj 17 0 obj 6784 endobj 18 0 obj << /Type /Page /Parent 1591 0 R /Resources << /ColorSpace << /CS2 1605 0 R /CS3 1604 0 R >> /ExtGState << /GS2 1626 0 R /GS3 1628 0 R >> /Font << /TT4 1599 0 R /TT5 1597 0 R /TT6 1601 0 R /TT7 1603 0 R /C2_1 1611 0 R >> /ProcSet [ /PDF /Text ] >> /Contents 19 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 4 >> endobj 19 0 obj << /Filter /FlateDecode /Length 20 0 R >> stream H‰¤WŰrăĆ}×WĚŁ]%sż8.WIkÇŃĂnTódťRސP wWůúœ)rJŞd÷”tú2}9Ý=ťî‡fYVűńÇŮüy]łŮ]ůšiËĄéZ6ť†˛zŹě÷Ůź[ł?g77Ý7öťă…4ĚiS(Ť 3ZÎ͜ń…ă\°?úéćçł÷’UĆÇ˙lSľ‚5ěbö[˝‚…/ő‡nŐőÍS=ôMĹúćbö+>o.nćłů\3ÁćË ^pÎ ›WějüŠ_~eŽ~Ô:~qŢřÂJ6şřnŢmŤÇťrÁnŰĄţ~ţŻ R\“ŠôË2TŞPA`•ƒšB íSXÓ~fżn›EÍŽ‹œAF)"Ó.śO?°ŰŐĐŹWőŐM”lo—§o—Ş4'ŘŇwż]ŻťSŰ2˜Âz­Éűvż>…*! +qłŽšeS’Ž{+Rv Ó&Z;—ÂŒWx!Ď ƒB˝y›˘ĽžB!œb0E°žhţ­ţR°ë1œ1’<ĆP œrŰ}3*˙N˙e~r5` g™v"ŚŮîë‹ĺĹ/Qĺwąy>~¸ýÚv…Oę÷9˜Ć7ŠŁý0Ú°Žŕ UřÉOÝP˙ŔFĂP`RöŕűA6ćđ([é›1ď{áÔş°/ÖQrЇ<ŘT űŕđwďbp’żˇ‹œsҝ:Ba`x˜ę–mh9ąţ‘„(ŒĽšĹbE0Ň DH15ŁĂBcsMMĎ&ď:&í(k›Jľż|n†lČĹ!ä*‹´ˆËD +űš=m‡- ţŘ|܈š˘ UJż°¨eg9Ô P…Ő’ÔhýäQţĐpęźh-kIŰMó…` 8)xRjuÁn—ʤţx]‘8ޏ5˜žŻSR[ˆŕˆśu×›\ŽŐIéâ˝x4­ű|sGӘrG´X]ˆI}łM=°áąnsM$N›ČpQHÍI誏Ó&0Ň’š¤‰Łi!%§Z_¸.š@řđÇ1 LcŔ'„—Č‘ÝŘl/ٍ+BW\řG‹_ Ń˜ާ€†dĄMʞ#`Eş€Żć€… ĺR{ u#Ź/‚ű§Šjq3XxRH}™úŃOX5řB;N -ĽFîôÄŐ@ƒwDĂYţ"I•KNâřĂdLľ`ă3-Œ$TÉ‚}.ĄŇŕ÷!ő$_+$„ôťt0d-QóŸşď ŠÂFĂ5ůß:Â(i ś;[€‘lCŕĝš"ű’ř/uůÎNVĘDÚ';íde1ň´9ő‚6Ů ”ľq˙Łš(I=)Œyx őôžzQŢîÇŐťęĺŔ…ŠrĄxŠz¤$4ʐ´ÇŰevTĐ–(ZS„Âýš;A“öjÖ-YkgŒËnĺň‡×Lx,>•YŹĽcf”ďŔęý_XÝÄĎKö@ťUâŕgP ą(?5Q:<^˛ŽgmGŮAÇj—uX ÉHkb˝N4>SHÜţ‚ڐ“ţă†; A“ĆAVnŘŞ›öˆĘR4NĄr:yŻ’ÉIĘMÇL v’i„słWšH “ˇłf2ŻËž8vÖÇh˝2ě$vödؓĺxXěď‘Ý7l!6NžČ…Ń‹żÇaUš.šą÷§BœŸˆ5Ă3{h†Í%Z{WöTWeŰlr:¤Vq'3TÇSŠÁ*4č@Ůářt‡aîrϓťŢ…‰ĽĄŰod'p§ çc§đr|QÖ=ĹVGń;Ň=âôS!–3Ń –YÔŮ()œtŇű‰ďUŠq†eí›<Öíś‚}¨ŹiÇĚíëŘ‹hǛťŚČV‘ŽÇ’š†ůţš-×CSmŘźŰfýÚQ;•{ź+‡ güŽćrŒrňăt€đm;Ôý˛ŹôőŻŰfńҖIO}hě“ęƢgT,ˇT'éȤëÔžë ÔިĽphfśŠÚÓ­3ŠÔq>bˇ}ąŹ^ŢvŻ‹fhşś\ąŰvŮőOeüéŒ:ˇč^Ńć—f´)we´f<€ŃÚoő˛îëśB%vŐöŠn‡×̙—Gş’ÇŚžźő4gü/íhţݘ!ĺńÁÍřŕ,ő`•ŔfRáŃÓK´3žŔĐ׹€—ÝjŐ}íńŔ‘YěZ‰ź;ßÝ6ž¸>…ŽńŮüp&86ÉĹůO‘&#œ­:0]ŃŘ­öϏ¨řÓi3žŃ‚ť¨-QF1XŞŠßmŤą oŰl ńw¨˙v×Ů#‰Č,Wc Ä&fS­ěď˛ö1—&Đť|˛Eáƒ#/›}bFđ+žÍ8Ś›Rđ/ÁŸÚÂă@xˆ•A‰‰FĎ˙řţLš˙˝‚źbFZXC)˝^C{Műĺ\ 9Oô˝ŻŒxL`*ľ/¤ť>+#…CŔ%ő|wMž@ĽżbŘRőy¨bŞľŘMßÔË3‘÷˙_äÁăŚńFäí!ňţőČ'ú&“ô%ž‹-^ôąě˙]MžMcGIŤŠ˛Ďě~]WͲŠFňœtęŮ‡Ş¸×›‰cgBŢ e>Š‚iď l{ţ­(žąöíŁh‰ž×˘ˆĎełĘą–;˛V–nă•bœŁŽGŢş‹<ĂĂĎӂtŘ輧bg°8<š'kÎrˆŕď]LŽŮNWmÁš;+óž\ÔO¨ąÍ9[â=ű€<ä+KýŃ&.Ž'yşmŤŽ_w}9ԋË8Űł´Ŕ ҘTťĎöÇí˘q>%Čç<ĐBę_|ZĺyL‡ű›J%>wťs(?Ápi(Š?ˇ%+x#-@ öńî˝'Pźz˝ĆJ–HŁňăá1Ääf-b/Ç]J˛’żœ/Ź $öcątK–Ocź2rš˘1…ŰVďľÄEî÷×1€3,ˆÝî.í˛t/°€OՐĽDíOŰ &ĆňPˇ"KĄ ›‚]ŻV{—ĆćOWtŤ1SSeH\vČ` ÂÄęžýN+áÇ55Q{đşďÖu?<ÇdŕçŚÇšźő͗šu_ۺߜťlаďcŤ——dygá~ĺůÔĄęsÖÔ;8䭝öę`ώˇçŻ.ăŠéRôîŢÉ6ŸP˛FřŢáBjÚóľ,ĐÜÜbJd†ÇfĂÖۇŐ~ě˛řcß}iĺ`ď ŮÂđŘiL ~/ŕCššj6—ěk3<˛śË—‰]*‰hýmj@ŁöŹÉÉhwT"“§Ć$ @§Ŕőށg_Ëž/Ű syŽĺ•S…’|w‡6mľÚ.â QśĎ/ŇY~vXlˆ|Źó|:b—艾§şŻa |hVŮDJ—Ü{*6<_˛e3´1vË7Ö:0=ît5ŃŐ糅iĺäqI~°…”¨‰<ÔAň‰ŢuŮŁ3ˇŤ˛Guţ—ńjWn‚}ž`S›,íTé2wŽ FlÎP¤†¤œřďłG=H@GťĐÜíí키űpG˜hÚćžjśşČń‰byËP/Ý:sîtěDţeßvĄ'lÖŐXěś-2mœYŘÎą.ßËĄoĂHł?bčЃčś|1`ô(5>ƒhĎf3,xĂSĽçŹĐ#uEvťË\Řë#T͝ˆpϝgľÎüÚ'Ÿˇ2őĆä'ń…Äsřтź×’yĆXĐŞB]c}Ęú˛[xO‡Ĺ MÁG˝id ťç#oňƒ"3ćéâҁŸšœSžźrÄčȋ<ĎÁŁX•Ôň+ľTI‚é<çP5č|‡YĎ MÚŠăůĽănŠăÚffüy™< P §lË6Ş Ü%Í#9@,˛ľ6ɝˆd´‘É•:śŔŽqm ˘ŕˇ÷ĄżCݲúOi @Ť0ĘáůŸÄŇéŁůŘ<łšNĽžńN%QJ&Ľ?q&Żô\f•Mj8‚ŻdoDq9ţÜPtmd†2Ś8ő-/'\ćĽKĐ h“|fü{ öŸłÎ3ďĺg c=‘”~ĂŤŕŃ{äIŸř9łdÓ*–KÓkÖ^ŢP?ă$ţ%oť[œs㓫Šm×îÄPíB4ă7č]çkN§Œůd7ËATž­ąüöĄě]HIkL| / 0ţůUča˙†îŤ•ŠPn¨"Îťˆ&yy a/:ŕ‹"ɞŻQ~)¨ Ň;łć w”ĘíaěÜ,2R×WžŽt!4óq6!vUXŰr3ÝyţÜąúYžUÍńŤ‡a(7ď¸ÜËęąáuőřŘţ/2Đâ+ĄÎ VŚ´P!°”ŻGżYą 4÷jüůÎţ„ĚJ>u:ţYLę)č{ťżSkđŽŐłł>™ ˆ€ľTĹÔU fń  Ŕ k&OƒÉɧ s$“$ 3¤1Ä_ŽGb/Ag9úŁŮ´Ýu‚ĆuՔ°o;ŔűO&ęZ<Ńݙ,o ÇrĘęĹSčC÷A‰×ńVĄ3r=űŠ%ÓâÎxAË-uđ5 ôŃä˘ ßś#’ţ 0žŒs endstream endobj 20 0 obj 3398 endobj 21 0 obj << /Type /Page /Parent 1591 0 R /Resources << /ColorSpace << /CS2 1605 0 R /CS3 1604 0 R >> /ExtGState << /GS2 1626 0 R /GS3 1628 0 R >> /Font << /TT3 1599 0 R /TT4 1601 0 R /TT5 1597 0 R >> /XObject << /Im1 1622 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> /Contents 22 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 5 >> endobj 22 0 obj << /Filter /FlateDecode /Length 23 0 R >> stream H‰ŒV[ÚF~÷Ż8‰šć~‰˘¨Ŕ˘„Ş{ 8­Ş$Ôxw]Ś`vť˙žÇƒŞîžXč;÷ďĚůzýMU<̲ >|輯ëz÷łÇb5ŤŠr˝~UͲ§|ßziš†˝Á üžJ¸#Z(P’c•Ł,1”2řńńăŕz˜ô†S٨˙‡mśJô&ů#<çĂrQnŠe^mŠ 6EŇű„Űd&˝4Ŕ }H(Ą”*H3¸ňŸřă âŹ÷ę? Çl,ŃŇeň&-wŮÓýlăU•żM˙JB0ă’PĆTŰdó0‹… ÂɘĹ`†H&mVŹáÓŽ˜çПĎc98N”Íjž[ž‡›Ý˘*֋üjP[ů‚őŠvŢ­+t%iЁ]UářŚťőşěĆćNmĽ ęŻ`şîBăD3¤™gĹC‘y‚D G­fmč¤rDJcÚ0ĹŘVH#h'oVˇŃ\^!şXĹqÚž'ů3žogÝIZ÷a;š7Ű)áˆĂżNâŁ4Aş×ĐÄh†ŐŁŔioňä!Ý Ëďë嚎ŻŃ۞řčR‹Ú;1Îě‰Pz?LáłÁ/\Ś:Ľ&îéĚ NŐ§1,WU˝ĄÓ×Ől]¸OM^gÁŮ!řiŰöAekä!&kşĐ4o˙…ľĂnÖ%:‡ę)oE/pţ9ŹňŮĆ3űÜ çŽX'tËŐ6Š’0ĹÚ¸ ^ŁH|i”´ś…,Ł8Ű2×.b÷˘HÍń pmĎĹś¨ Ümŕ÷üOŔďfźźÄ̅v„Ú6!ŰhîÂb7h{ÓH’•˘…”őŰŔY˂ÄqŠp‡ďď wźaƞŞĄĂqœwę°}ŚŚ¸6~#<őjžŹĚÔpsX˙Áľ$\śńw“űťI?ÁqŮžĹň6öóŃ7ďşĆ‡§őŻż|íOŇŃdq­ áAÚTĽp 5>:Úš}§Ś§ĘXŹ2á;ţžŐÜöďÓń0–Ĺ=ˇ!z|ŞÎFĘŁxYBƒŰáĄy×ÝX‚>Kç¨E0ęŕšQÇçĆtŚŽđĺÓxDŽmÜsa F“ńí'¸žŒۏôętşćKŤ?|{űˇđËÝtô†}pЉöD\0+C֊`ăÜôa˜ĆëŐdůuÚżĐyąLDÓWN˘šit˙ů}íölYŽ6őŽĆç;°Ć"ˆe=.¨ĆŕęÚs?´ľxu4ö:€°‚;%œ:ËăűIí÷ˇ ƒžcŰÎ!Ä 4p)đ RƒdŁŇ ]Vą.DÚĽ *È3G˘ü:šţ<=,ŢÝ\ˆĽƒX˛5—îđď˜Ä%śÝ]ŻĹ*Ÿ>ÍPě|›Ć7ęOúţNPrŕůő ËëkĎ5­ßŻ˝Ďl‰n– ŽËäËyšöäŞ%e›t;ÇAĄ˝˜é˙ÖćƒőŢňLžKF8Ő{uΞ'Ęź;0w™**°eăšœEśHd×4,#r’Sdžśě5bO3w'ĐŚx|Şŕ;^wôчľćOěŃBÂ4Ăs… W˙][lŠă#č {ĆŤŹÜÄ$˛¨%rË`]nP4ÍQr.0ŠsXáŕOĎŃj “|›ožkÈŹĺ8F[Q4ę0܉śDĹ6hS¨˙ 0œ—ő endstream endobj 23 0 obj 1249 endobj 24 0 obj << /Count 11 /First 1638 0 R /Last 1638 0 R >> endobj 25 0 obj << /Title (Introduction) /Dest [ 1595 0 R /XYZ 0 562 null ] /Parent 1638 0 R /Next 34 0 R >> endobj 26 0 obj << /Title (Additional Information) /Dest [ 18 0 R /XYZ 0 617 null ] /Last 29 0 R /Count 4 /First 28 0 R /Prev 27 0 R /Parent 1638 0 R >> endobj 27 0 obj << /Title (Capability bits) /Dest [ 9 0 R /XYZ 0 275 null ] /Next 26 0 R /Prev 32 0 R /Parent 1638 0 R >> endobj 28 0 obj << /Title (Reference documentation) /Dest [ 18 0 R /XYZ 0 595 null ] /Parent 26 0 R /Next 31 0 R >> endobj 29 0 obj << /Title (Contact Synaptics) /Dest [ 21 0 R /XYZ 0 722 null ] /Parent 26 0 R /Prev 30 0 R >> endobj 30 0 obj << /Title (Notice) /Dest [ 18 0 R /XYZ 0 410 null ] /Parent 26 0 R /Prev 31 0 R /Next 29 0 R >> endobj 31 0 obj << /Title (Trademarks) /Dest [ 18 0 R /XYZ 0 467 null ] /Parent 26 0 R /Prev 28 0 R /Next 30 0 R >> endobj 32 0 obj << /Title (Implementation details) /Dest [ 1 0 R /XYZ 0 722 null ] /Next 27 0 R /Prev 33 0 R /Parent 1638 0 R >> endobj 33 0 obj << /Title (Software considerations) /Dest [ 1595 0 R /XYZ 0 244 null ] /Next 32 0 R /Prev 34 0 R /Parent 1638 0 R >> endobj 34 0 obj << /Title (Hardware considerations) /Dest [ 1595 0 R /XYZ 0 418 null ] /Next 33 0 R /Prev 25 0 R /Parent 1638 0 R >> endobj 35 0 obj << /S /Title /C /Title /Pg 1595 0 R /K 0 /P 464 0 R >> endobj 36 0 obj << /Title /P /Part#20Subtitle /P /Heading#201 /H1 /Body#20Text /P /Note /P /Bullet#20Level#201 /P /Table#20Column#20Title /P /Normal /P /Table#20Entry /P /Caption /P /Heading#202 /H2 /Front#20Matter#20Heading#202 /P /Front#20Matter#20Text /P /Footer /P /TextBox /Div /Frame /Div /Footnote /Note /Endnote /Note /Shape /Figure /InlineShape /Figure /TOA /TOC /TOAI /TOCI /TOF /TOC /TOFI /TOCI /Superscript /Span /Subscript /Span /Strikeout /Span /Underline /Span /DropCap /Figure >> endobj 37 0 obj << /Title 38 0 R /Part#20Subtitle 41 0 R /Heading#201 43 0 R /Body#20Text 45 0 R /Note 48 0 R /Bullet#20Level#201 52 0 R /Table#20Column#20Title 61 0 R /Normal 70 0 R /Table#20Entry 72 0 R /Caption 98 0 R /Heading#202 440 0 R /Front#20Matter#20Heading#202 453 0 R /Front#20Matter#20Text 456 0 R /Footer 463 0 R >> endobj 38 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 24 /SpaceAfter 12 /TextIndent 0 >> endobj 39 0 obj << /S /Part#20Subtitle /C /Part#20Subtitle /Pg 1595 0 R /K 1 /P 464 0 R >> endobj 40 0 obj << /S /Heading#201 /C /Heading#201 /Pg 1595 0 R /K 2 /P 464 0 R >> endobj 41 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 18 /SpaceAfter 6 /TextIndent 0 >> endobj 42 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1595 0 R /K [ 3 44 0 R 5 ] /P 464 0 R >> endobj 43 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 18 /SpaceAfter 0 /TextIndent 0 >> endobj 44 0 obj << /S /Superscript /P 42 0 R /A 1573 0 R /Pg 1595 0 R /K 4 >> endobj 45 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 6 /SpaceAfter 6 /TextIndent 0 >> endobj 46 0 obj << /S /Note /C /Note /Pg 1595 0 R /K 6 /P 464 0 R >> endobj 47 0 obj << /S /Heading#201 /C /Heading#201 /Pg 1595 0 R /K 7 /P 464 0 R >> endobj 48 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 72 /EndIndent 0 /TextAlign /Start /SpaceBefore 18 /SpaceAfter 18 /TextIndent -35.99998 >> endobj 49 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1595 0 R /K 8 /P 464 0 R >> endobj 50 0 obj << /S /LBody /C /Bullet#20Level#201 /Pg 1595 0 R /K 9 /P 1564 0 R >> endobj 51 0 obj << /S /LBody /C /Bullet#20Level#201 /Pg 1595 0 R /K 10 /P 1565 0 R >> endobj 52 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 36 /EndIndent 0 /TextAlign /Start /SpaceBefore 6 /SpaceAfter 6 /TextIndent -17.99998 >> endobj 53 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1595 0 R /K 11 /P 464 0 R >> endobj 54 0 obj << /S /Heading#201 /C /Heading#201 /Pg 1595 0 R /K 12 /P 464 0 R >> endobj 55 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1595 0 R /K 13 /P 464 0 R >> endobj 56 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1595 0 R /K 14 /P 464 0 R >> endobj 57 0 obj << /S /Heading#201 /C /Heading#201 /Pg 1 0 R /K 0 /P 464 0 R >> endobj 58 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 1 /P 464 0 R >> endobj 59 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 2 /P 467 0 R >> endobj 60 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 3 /P 470 0 R >> endobj 61 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 0 /SpaceAfter 1 /TextIndent 0 >> endobj 62 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 4 /P 473 0 R >> endobj 63 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 5 /P 476 0 R >> endobj 64 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 6 /P 479 0 R >> endobj 65 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 7 /P 482 0 R >> endobj 66 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 8 /P 485 0 R >> endobj 67 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 9 /P 488 0 R >> endobj 68 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 10 /P 491 0 R >> endobj 69 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 11 /P 495 0 R >> endobj 70 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 71 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 12 /P 498 0 R >> endobj 72 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 73 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 13 /P 502 0 R >> endobj 74 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 14 /P 505 0 R >> endobj 75 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 15 /P 508 0 R >> endobj 76 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 16 /P 511 0 R >> endobj 77 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 17 /P 514 0 R >> endobj 78 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 18 /P 517 0 R >> endobj 79 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 19 /P 520 0 R >> endobj 80 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 20 /P 523 0 R >> endobj 81 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 21 /P 526 0 R >> endobj 82 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 22 /P 530 0 R >> endobj 83 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 23 /P 533 0 R >> endobj 84 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 24 /P 537 0 R >> endobj 85 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 25 /P 540 0 R >> endobj 86 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 26 /P 544 0 R >> endobj 87 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 27 /P 547 0 R >> endobj 88 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 28 /P 551 0 R >> endobj 89 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 29 /P 554 0 R >> endobj 90 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 30 /P 558 0 R >> endobj 91 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 31 /P 561 0 R >> endobj 92 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 32 /P 565 0 R >> endobj 93 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 33 /P 568 0 R >> endobj 94 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 34 /P 572 0 R >> endobj 95 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 35 /P 575 0 R >> endobj 96 0 obj << /S /Caption /C /Caption /Pg 1 0 R /K 36 /P 464 0 R >> endobj 97 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 37 /P 464 0 R >> endobj 98 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Center /SpaceBefore 6 /SpaceAfter 12 /TextIndent 0 >> endobj 99 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 38 /P 580 0 R >> endobj 100 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 39 /P 583 0 R >> endobj 101 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 40 /P 586 0 R >> endobj 102 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 41 /P 589 0 R >> endobj 103 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 42 /P 592 0 R >> endobj 104 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 43 /P 595 0 R >> endobj 105 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 44 /P 598 0 R >> endobj 106 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 45 /P 601 0 R >> endobj 107 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 46 /P 604 0 R >> endobj 108 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 47 /P 608 0 R >> endobj 109 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 48 /P 611 0 R >> endobj 110 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 49 /P 615 0 R >> endobj 111 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 50 58 ] /P 618 0 R >> endobj 112 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 51 /P 621 0 R >> endobj 113 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 52 /P 624 0 R >> endobj 114 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 53 62 ] /P 627 0 R >> endobj 115 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 54 63 ] /P 630 0 R >> endobj 116 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 55 /P 633 0 R >> endobj 117 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 56 /P 636 0 R >> endobj 118 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 57 /P 640 0 R >> endobj 119 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 59 /P 643 0 R >> endobj 120 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 60 /P 646 0 R >> endobj 121 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 61 /P 649 0 R >> endobj 122 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 64 /P 652 0 R >> endobj 123 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 65 /P 655 0 R >> endobj 124 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 66 /P 659 0 R >> endobj 125 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 67 /P 662 0 R >> endobj 126 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 68 /P 666 0 R >> endobj 127 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 69 /P 669 0 R >> endobj 128 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 70 /P 672 0 R >> endobj 129 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 71 /P 676 0 R >> endobj 130 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 72 /P 679 0 R >> endobj 131 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 73 /P 683 0 R >> endobj 132 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 74 /P 686 0 R >> endobj 133 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 75 /P 690 0 R >> endobj 134 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 76 /P 693 0 R >> endobj 135 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 77 /P 697 0 R >> endobj 136 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 78 /P 700 0 R >> endobj 137 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 79 /P 704 0 R >> endobj 138 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 80 /P 707 0 R >> endobj 139 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 81 /P 711 0 R >> endobj 140 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 82 91 ] /P 714 0 R >> endobj 141 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 83 /P 717 0 R >> endobj 142 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 84 /P 720 0 R >> endobj 143 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 85 /P 723 0 R >> endobj 144 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 86 95 ] /P 726 0 R >> endobj 145 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 87 96 ] /P 729 0 R >> endobj 146 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 88 /P 732 0 R >> endobj 147 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 89 /P 735 0 R >> endobj 148 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 90 /P 739 0 R >> endobj 149 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 92 /P 742 0 R >> endobj 150 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 93 /P 745 0 R >> endobj 151 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 94 /P 748 0 R >> endobj 152 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 97 /P 751 0 R >> endobj 153 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 98 /P 754 0 R >> endobj 154 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 99 /P 758 0 R >> endobj 155 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 100 /P 761 0 R >> endobj 156 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 101 /P 765 0 R >> endobj 157 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 102 /P 768 0 R >> endobj 158 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 103 /P 772 0 R >> endobj 159 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 104 /P 775 0 R >> endobj 160 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 105 /P 779 0 R >> endobj 161 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 106 /P 782 0 R >> endobj 162 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 107 /P 786 0 R >> endobj 163 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 108 /P 789 0 R >> endobj 164 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 109 /P 793 0 R >> endobj 165 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 110 /P 796 0 R >> endobj 166 0 obj << /S /Caption /C /Caption /Pg 1 0 R /K 111 /P 464 0 R >> endobj 167 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 112 /P 464 0 R >> endobj 168 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 113 /P 801 0 R >> endobj 169 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 114 /P 804 0 R >> endobj 170 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 115 /P 807 0 R >> endobj 171 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 116 /P 810 0 R >> endobj 172 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 117 /P 813 0 R >> endobj 173 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 118 /P 816 0 R >> endobj 174 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 119 /P 819 0 R >> endobj 175 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 120 /P 822 0 R >> endobj 176 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 121 /P 825 0 R >> endobj 177 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 122 /P 829 0 R >> endobj 178 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 123 /P 832 0 R >> endobj 179 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 124 /P 836 0 R >> endobj 180 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 125 133 ] /P 839 0 R >> endobj 181 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 126 /P 842 0 R >> endobj 182 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 127 /P 845 0 R >> endobj 183 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 128 137 ] /P 848 0 R >> endobj 184 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 129 138 ] /P 851 0 R >> endobj 185 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 130 /P 854 0 R >> endobj 186 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 131 /P 857 0 R >> endobj 187 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 132 /P 861 0 R >> endobj 188 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 134 /P 864 0 R >> endobj 189 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 135 /P 867 0 R >> endobj 190 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 136 /P 870 0 R >> endobj 191 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 139 /P 873 0 R >> endobj 192 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 140 /P 876 0 R >> endobj 193 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 141 /P 880 0 R >> endobj 194 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 142 /P 883 0 R >> endobj 195 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 143 /P 887 0 R >> endobj 196 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 144 /P 890 0 R >> endobj 197 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 145 /P 893 0 R >> endobj 198 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 146 /P 897 0 R >> endobj 199 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 147 /P 900 0 R >> endobj 200 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 148 /P 904 0 R >> endobj 201 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 149 /P 907 0 R >> endobj 202 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 150 /P 911 0 R >> endobj 203 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 151 /P 914 0 R >> endobj 204 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 152 /P 918 0 R >> endobj 205 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 153 /P 921 0 R >> endobj 206 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 154 /P 925 0 R >> endobj 207 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 155 /P 928 0 R >> endobj 208 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 156 /P 932 0 R >> endobj 209 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 157 166 ] /P 935 0 R >> endobj 210 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 158 /P 938 0 R >> endobj 211 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 159 /P 941 0 R >> endobj 212 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 160 /P 944 0 R >> endobj 213 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 161 170 ] /P 947 0 R >> endobj 214 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K [ 162 171 ] /P 950 0 R >> endobj 215 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 163 /P 953 0 R >> endobj 216 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 164 /P 956 0 R >> endobj 217 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 165 /P 960 0 R >> endobj 218 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 167 /P 963 0 R >> endobj 219 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 168 /P 966 0 R >> endobj 220 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 169 /P 969 0 R >> endobj 221 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 172 /P 972 0 R >> endobj 222 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 173 /P 975 0 R >> endobj 223 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 174 /P 979 0 R >> endobj 224 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 175 /P 982 0 R >> endobj 225 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 176 /P 986 0 R >> endobj 226 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 177 /P 989 0 R >> endobj 227 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 178 /P 993 0 R >> endobj 228 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 179 /P 996 0 R >> endobj 229 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 180 /P 1000 0 R >> endobj 230 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 181 /P 1003 0 R >> endobj 231 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 182 /P 1007 0 R >> endobj 232 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 183 /P 1010 0 R >> endobj 233 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 1 0 R /K 184 /P 1014 0 R >> endobj 234 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 1 0 R /K 185 /P 1017 0 R >> endobj 235 0 obj << /S /Caption /C /Caption /Pg 1 0 R /K 186 /P 464 0 R >> endobj 236 0 obj << /S /Body#20Text /C /Body#20Text /Pg 1 0 R /K 187 /P 464 0 R >> endobj 237 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 0 /P 1022 0 R >> endobj 238 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 1 /P 1025 0 R >> endobj 239 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 2 /P 1028 0 R >> endobj 240 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 3 /P 1031 0 R >> endobj 241 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 4 /P 1034 0 R >> endobj 242 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 5 /P 1037 0 R >> endobj 243 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 6 /P 1040 0 R >> endobj 244 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 7 /P 1043 0 R >> endobj 245 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 8 /P 1046 0 R >> endobj 246 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 9 /P 1050 0 R >> endobj 247 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 10 /P 1053 0 R >> endobj 248 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 11 /P 1057 0 R >> endobj 249 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 12 /P 1060 0 R >> endobj 250 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 13 /P 1063 0 R >> endobj 251 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 14 /P 1066 0 R >> endobj 252 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 15 /P 1069 0 R >> endobj 253 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 16 /P 1072 0 R >> endobj 254 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 17 /P 1075 0 R >> endobj 255 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 18 /P 1078 0 R >> endobj 256 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 19 /P 1082 0 R >> endobj 257 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 20 /P 1085 0 R >> endobj 258 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 21 /P 1088 0 R >> endobj 259 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 22 /P 1091 0 R >> endobj 260 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 23 /P 1095 0 R >> endobj 261 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 24 /P 1098 0 R >> endobj 262 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 25 /P 1102 0 R >> endobj 263 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 26 /P 1105 0 R >> endobj 264 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 27 /P 1108 0 R >> endobj 265 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 28 /P 1112 0 R >> endobj 266 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 29 /P 1115 0 R >> endobj 267 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 30 /P 1119 0 R >> endobj 268 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 31 /P 1122 0 R >> endobj 269 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 32 /P 1126 0 R >> endobj 270 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 33 /P 1129 0 R >> endobj 271 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 34 /P 1133 0 R >> endobj 272 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 35 /P 1136 0 R >> endobj 273 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 36 /P 1140 0 R >> endobj 274 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 37 /P 1143 0 R >> endobj 275 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 38 /P 1147 0 R >> endobj 276 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 39 48 ] /P 1150 0 R >> endobj 277 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 40 /P 1153 0 R >> endobj 278 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 41 /P 1156 0 R >> endobj 279 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 42 /P 1159 0 R >> endobj 280 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 43 52 ] /P 1162 0 R >> endobj 281 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 44 53 ] /P 1165 0 R >> endobj 282 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 45 /P 1168 0 R >> endobj 283 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 46 /P 1171 0 R >> endobj 284 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 47 /P 1175 0 R >> endobj 285 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 49 /P 1178 0 R >> endobj 286 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 50 /P 1181 0 R >> endobj 287 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 51 /P 1184 0 R >> endobj 288 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 54 /P 1187 0 R >> endobj 289 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 55 /P 1190 0 R >> endobj 290 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 56 /P 1194 0 R >> endobj 291 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 57 /P 1197 0 R >> endobj 292 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 58 /P 1201 0 R >> endobj 293 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 59 /P 1204 0 R >> endobj 294 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 60 /P 1207 0 R >> endobj 295 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 61 /P 1210 0 R >> endobj 296 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 62 /P 1213 0 R >> endobj 297 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 63 /P 1216 0 R >> endobj 298 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 64 /P 1220 0 R >> endobj 299 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 65 /P 1223 0 R >> endobj 300 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 66 /P 1227 0 R >> endobj 301 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 67 /P 1230 0 R >> endobj 302 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 68 /P 1234 0 R >> endobj 303 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 69 /P 1237 0 R >> endobj 304 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 70 /P 1240 0 R >> endobj 305 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 71 /P 1243 0 R >> endobj 306 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 72 /P 1246 0 R >> endobj 307 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 73 /P 1249 0 R >> endobj 308 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 74 /P 1253 0 R >> endobj 309 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 75 /P 1256 0 R >> endobj 310 0 obj << /S /Caption /C /Caption /Pg 9 0 R /K 76 /P 464 0 R >> endobj 311 0 obj << /S /Body#20Text /C /Body#20Text /Pg 9 0 R /K 77 /P 464 0 R >> endobj 312 0 obj << /S /Body#20Text /C /Body#20Text /Pg 9 0 R /K 78 /P 464 0 R >> endobj 313 0 obj << /S /Body#20Text /C /Body#20Text /Pg 9 0 R /K 79 /P 464 0 R >> endobj 314 0 obj << /S /Heading#201 /C /Heading#201 /Pg 9 0 R /K 80 /P 464 0 R >> endobj 315 0 obj << /S /Body#20Text /C /Body#20Text /Pg 9 0 R /K 81 /P 464 0 R >> endobj 316 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 82 /P 1261 0 R >> endobj 317 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 83 /P 1264 0 R >> endobj 318 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 84 /P 1267 0 R >> endobj 319 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 85 /P 1270 0 R >> endobj 320 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 86 /P 1273 0 R >> endobj 321 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 87 /P 1276 0 R >> endobj 322 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 88 /P 1279 0 R >> endobj 323 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 89 /P 1282 0 R >> endobj 324 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 91 /P 1286 0 R >> endobj 325 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 93 /P 1289 0 R >> endobj 326 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 90 94 100 ] /P 1293 0 R >> endobj 327 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 92 95 102 ] /P 1296 0 R >> endobj 328 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 96 /P 1299 0 R >> endobj 329 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 97 /P 1302 0 R >> endobj 330 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 98 /P 1305 0 R >> endobj 331 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 99 /P 1308 0 R >> endobj 332 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 101 /P 1312 0 R >> endobj 333 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 103 /P 1315 0 R >> endobj 334 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 104 /P 1319 0 R >> endobj 335 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 105 /P 1322 0 R >> endobj 336 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 106 /P 1325 0 R >> endobj 337 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 107 /P 1328 0 R >> endobj 338 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 108 /P 1331 0 R >> endobj 339 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 109 /P 1334 0 R >> endobj 340 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 110 /P 1337 0 R >> endobj 341 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 9 0 R /K 111 /P 1340 0 R >> endobj 342 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 112 120 128 ] /P 1344 0 R >> endobj 343 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 113 121 ] /P 1347 0 R >> endobj 344 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 114 122 130 ] /P 1350 0 R >> endobj 345 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 115 123 ] /P 1353 0 R >> endobj 346 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 116 124 132 ] /P 1356 0 R >> endobj 347 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 117 125 ] /P 1359 0 R >> endobj 348 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 118 126 134 ] /P 1362 0 R >> endobj 349 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K [ 119 127 135 ] /P 1365 0 R >> endobj 350 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 129 /P 1369 0 R >> endobj 351 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 131 /P 1372 0 R >> endobj 352 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 9 0 R /K 133 /P 1375 0 R >> endobj 353 0 obj << /S /Caption /C /Caption /Pg 9 0 R /K 136 /P 464 0 R >> endobj 354 0 obj << /S /Note /C /Note /Pg 9 0 R /K 137 /P 464 0 R >> endobj 355 0 obj << /S /Normal /C /Normal /Pg 12 0 R /K 0 /P 464 0 R >> endobj 356 0 obj << /S /Normal /A [ 357 0 R ] /C /Normal /Pg 12 0 R /K 1 /P 464 0 R >> endobj 357 0 obj << /O /Layout /StartIndent 36 >> endobj 358 0 obj << /S /Normal /C /Normal /Pg 12 0 R /K 2 /P 464 0 R >> endobj 359 0 obj << /S /Normal /C /Normal /Pg 12 0 R /K 3 /P 464 0 R >> endobj 360 0 obj << /S /Normal /A [ 361 0 R ] /C /Normal /Pg 12 0 R /K 4 /P 464 0 R >> endobj 361 0 obj << /O /Layout /StartIndent 36 >> endobj 362 0 obj << /S /Normal /C /Normal /Pg 12 0 R /K 5 /P 464 0 R >> endobj 363 0 obj << /S /Normal /C /Normal /Pg 12 0 R /K 6 /P 464 0 R >> endobj 364 0 obj << /S /Normal /A [ 365 0 R ] /C /Normal /Pg 12 0 R /K 7 /P 464 0 R >> endobj 365 0 obj << /O /Layout /StartIndent 36 >> endobj 366 0 obj << /S /Body#20Text /C /Body#20Text /Pg 12 0 R /K 8 /P 464 0 R >> endobj 367 0 obj << /S /Body#20Text /C /Body#20Text /Pg 12 0 R /K 9 /P 464 0 R >> endobj 368 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 10 /P 1380 0 R >> endobj 369 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 11 /P 1383 0 R >> endobj 370 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 12 /P 1386 0 R >> endobj 371 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 13 /P 1389 0 R >> endobj 372 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 14 /P 1392 0 R >> endobj 373 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 15 /P 1395 0 R >> endobj 374 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 16 /P 1398 0 R >> endobj 375 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 17 /P 1401 0 R >> endobj 376 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 18 26 34 ] /P 1405 0 R >> endobj 377 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 19 27 ] /P 1408 0 R >> endobj 378 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 20 28 36 ] /P 1411 0 R >> endobj 379 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 21 29 ] /P 1414 0 R >> endobj 380 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 22 30 38 ] /P 1417 0 R >> endobj 381 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 23 31 ] /P 1420 0 R >> endobj 382 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 24 32 40 ] /P 1423 0 R >> endobj 383 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 25 33 41 ] /P 1426 0 R >> endobj 384 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 35 /P 1430 0 R >> endobj 385 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 37 /P 1433 0 R >> endobj 386 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 39 /P 1436 0 R >> endobj 387 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 42 /P 1440 0 R >> endobj 388 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 43 /P 1443 0 R >> endobj 389 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 44 /P 1446 0 R >> endobj 390 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 45 /P 1449 0 R >> endobj 391 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 46 /P 1452 0 R >> endobj 392 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 47 /P 1455 0 R >> endobj 393 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 48 /P 1458 0 R >> endobj 394 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 49 /P 1461 0 R >> endobj 395 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 50 /P 1465 0 R >> endobj 396 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 51 /P 1468 0 R >> endobj 397 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 52 /P 1472 0 R >> endobj 398 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 53 /P 1475 0 R >> endobj 399 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 54 /P 1478 0 R >> endobj 400 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 55 /P 1481 0 R >> endobj 401 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 56 /P 1484 0 R >> endobj 402 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 57 /P 1488 0 R >> endobj 403 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 58 /P 1491 0 R >> endobj 404 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 59 /P 1495 0 R >> endobj 405 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 60 /P 1498 0 R >> endobj 406 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 61 /P 1501 0 R >> endobj 407 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 62 /P 1504 0 R >> endobj 408 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 63 /P 1507 0 R >> endobj 409 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 64 /P 1510 0 R >> endobj 410 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 65 /P 1513 0 R >> endobj 411 0 obj << /S /Table#20Column#20Title /C /Table#20Column#20Title /Pg 12 0 R /K 66 /P 1516 0 R >> endobj 412 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 67 75 83 ] /P 1520 0 R >> endobj 413 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 68 76 ] /P 1523 0 R >> endobj 414 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 69 77 85 ] /P 1526 0 R >> endobj 415 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 70 78 ] /P 1529 0 R >> endobj 416 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 71 79 87 ] /P 1532 0 R >> endobj 417 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 72 80 ] /P 1535 0 R >> endobj 418 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 73 81 89 ] /P 1538 0 R >> endobj 419 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K [ 74 82 90 ] /P 1541 0 R >> endobj 420 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 84 /P 1545 0 R >> endobj 421 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 86 /P 1548 0 R >> endobj 422 0 obj << /S /Table#20Entry /C /Table#20Entry /Pg 12 0 R /K 88 /P 1551 0 R >> endobj 423 0 obj << /S /Caption /C /Caption /Pg 12 0 R /K 91 /P 464 0 R >> endobj 424 0 obj << /S /Normal /C /Normal /Pg 12 0 R /K 92 /P 464 0 R >> endobj 425 0 obj << /S /Normal /A [ 426 0 R ] /C /Normal /Pg 12 0 R /K 93 /P 464 0 R >> endobj 426 0 obj << /O /Layout /StartIndent 36 >> endobj 427 0 obj << /S /Normal /A [ 428 0 R ] /C /Normal /Pg 12 0 R /K 94 /P 464 0 R >> endobj 428 0 obj << /O /Layout /StartIndent 36 >> endobj 429 0 obj << /S /Normal /A [ 430 0 R ] /C /Normal /Pg 12 0 R /K 95 /P 464 0 R >> endobj 430 0 obj << /O /Layout /StartIndent 36 >> endobj 431 0 obj << /S /Note /A [ 432 0 R ] /C /Note /Pg 12 0 R /K [ 96 97 ] /P 464 0 R >> endobj 432 0 obj << /O /Layout /SpaceAfter 6 >> endobj 433 0 obj << /S /Body#20Text /A [ 434 0 R ] /C /Body#20Text /Pg 12 0 R /K 98 /P 464 0 R >> endobj 434 0 obj << /O /Layout /SpaceBefore 0 /SpaceAfter 0 >> endobj 435 0 obj << /S /Note /C /Note /Pg 18 0 R /K [ 0 1 ] /P 464 0 R >> endobj 436 0 obj << /S /Body#20Text /C /Body#20Text /Pg 18 0 R /K 2 /P 464 0 R >> endobj 437 0 obj << /S /Heading#201 /C /Heading#201 /Pg 18 0 R /K 3 /P 464 0 R >> endobj 438 0 obj << /S /Heading#202 /C /Heading#202 /Pg 18 0 R /K 4 /P 464 0 R >> endobj 439 0 obj << /S /Body#20Text /C /Body#20Text /Pg 18 0 R /K 5 /P 464 0 R >> endobj 440 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 12 /SpaceAfter 0 /TextIndent 0 >> endobj 441 0 obj << /S /LBody /C /Bullet#20Level#201 /Pg 18 0 R /K 6 /P 1567 0 R >> endobj 442 0 obj << /S /LBody /C /Bullet#20Level#201 /Pg 18 0 R /K 7 /P 1568 0 R >> endobj 443 0 obj << /S /LBody /C /Bullet#20Level#201 /Pg 18 0 R /K 8 /P 1569 0 R >> endobj 444 0 obj << /S /LBody /C /Bullet#20Level#201 /Pg 18 0 R /K 9 /P 1570 0 R >> endobj 445 0 obj << /S /Heading#202 /C /Heading#202 /Pg 18 0 R /K 10 /P 464 0 R >> endobj 446 0 obj << /S /Body#20Text /C /Body#20Text /Pg 18 0 R /K 11 /P 464 0 R >> endobj 447 0 obj << /S /Heading#202 /C /Heading#202 /Pg 18 0 R /K 12 /P 464 0 R >> endobj 448 0 obj << /S /Body#20Text /C /Body#20Text /Pg 18 0 R /K 13 /P 464 0 R >> endobj 449 0 obj << /S /Heading#202 /C /Heading#202 /Pg 21 0 R /K 0 /P 464 0 R >> endobj 450 0 obj << /S /Body#20Text /C /Body#20Text /Pg 21 0 R /K 1 /P 464 0 R >> endobj 451 0 obj << /S /Front#20Matter#20Heading#202 /A [ 452 0 R ] /C /Front#20Matter#20Heading#202 /Pg 21 0 R /K 2 /P 1556 0 R >> endobj 452 0 obj << /O /Layout /StartIndent -10.24998 >> endobj 453 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 6 /SpaceAfter 6 /TextIndent 0 >> endobj 454 0 obj << /S /Front#20Matter#20Text /A [ 455 0 R ] /C /Front#20Matter#20Text /Pg 21 0 R /K 3 /P 1556 0 R >> endobj 455 0 obj << /O /Layout /StartIndent -10.24998 >> endobj 456 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 12 /SpaceAfter 12 /TextIndent 0 >> endobj 457 0 obj << /S /Front#20Matter#20Text /A [ 458 0 R ] /C /Front#20Matter#20Text /Pg 21 0 R /K 4 /P 1556 0 R >> endobj 458 0 obj << /O /Layout /StartIndent -10.24998 >> endobj 459 0 obj << /S /Front#20Matter#20Text /C /Front#20Matter#20Text /Pg 21 0 R /K 5 /P 1556 0 R >> endobj 460 0 obj << /S /Body#20Text /A [ 461 0 R ] /C /Body#20Text /Pg 21 0 R /K [ 6 462 0 R 8 ] /P 1560 0 R >> endobj 461 0 obj << /O /Layout /StartIndent -10.24998 >> endobj 462 0 obj << /S /InlineShape /Pg 21 0 R /K 7 /P 460 0 R /Alt () /A [ 1579 0 R ] >> endobj 463 0 obj << /O /Layout /WritingMode /LrTb /StartIndent 0 /EndIndent 0 /TextAlign /Start /SpaceBefore 0 /SpaceAfter 0 /TextIndent 0 >> endobj 464 0 obj << /S /Sect /P 1594 0 R /K [ 35 0 R 39 0 R 40 0 R 42 0 R 46 0 R 47 0 R 49 0 R 1563 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 465 0 R 96 0 R 97 0 R 578 0 R 166 0 R 167 0 R 799 0 R 235 0 R 236 0 R 1020 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 1259 0 R 353 0 R 354 0 R 355 0 R 356 0 R 358 0 R 359 0 R 360 0 R 362 0 R 363 0 R 364 0 R 366 0 R 367 0 R 1378 0 R 423 0 R 424 0 R 425 0 R 427 0 R 429 0 R 431 0 R 433 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 1566 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 1554 0 R ] >> endobj 465 0 obj << /S /Table /P 464 0 R /K [ 466 0 R 494 0 R 501 0 R 529 0 R 536 0 R 543 0 R 550 0 R 557 0 R 564 0 R 571 0 R ] /A [ 1580 0 R ] >> endobj 466 0 obj << /S /TR /P 465 0 R /K [ 467 0 R 470 0 R 473 0 R 476 0 R 479 0 R 482 0 R 485 0 R 488 0 R 491 0 R ] >> endobj 467 0 obj << /S /TD /A [ 468 0 R 469 0 R ] /P 466 0 R /K 59 0 R >> endobj 468 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 469 0 obj << /O /Layout /BlockAlign /Before >> endobj 470 0 obj << /S /TD /A [ 471 0 R 472 0 R ] /P 466 0 R /K 60 0 R >> endobj 471 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 472 0 obj << /O /Layout /BlockAlign /After >> endobj 473 0 obj << /S /TD /A [ 474 0 R 475 0 R ] /P 466 0 R /K 62 0 R >> endobj 474 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 475 0 obj << /O /Layout /BlockAlign /Before >> endobj 476 0 obj << /S /TD /A [ 477 0 R 478 0 R ] /P 466 0 R /K 63 0 R >> endobj 477 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 478 0 obj << /O /Layout /BlockAlign /Before >> endobj 479 0 obj << /S /TD /A [ 480 0 R 481 0 R ] /P 466 0 R /K 64 0 R >> endobj 480 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 481 0 obj << /O /Layout /BlockAlign /Before >> endobj 482 0 obj << /S /TD /A [ 483 0 R 484 0 R ] /P 466 0 R /K 65 0 R >> endobj 483 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 484 0 obj << /O /Layout /BlockAlign /Before >> endobj 485 0 obj << /S /TD /A [ 486 0 R 487 0 R ] /P 466 0 R /K 66 0 R >> endobj 486 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 487 0 obj << /O /Layout /BlockAlign /Before >> endobj 488 0 obj << /S /TD /A [ 489 0 R 490 0 R ] /P 466 0 R /K 67 0 R >> endobj 489 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 490 0 obj << /O /Layout /BlockAlign /Before >> endobj 491 0 obj << /S /TD /A [ 492 0 R 493 0 R ] /P 466 0 R /K 68 0 R >> endobj 492 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 493 0 obj << /O /Layout /BlockAlign /Before >> endobj 494 0 obj << /S /TR /P 465 0 R /K [ 495 0 R 498 0 R ] >> endobj 495 0 obj << /S /TD /A [ 496 0 R 497 0 R ] /P 494 0 R /K 69 0 R >> endobj 496 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 497 0 obj << /O /Layout /BlockAlign /Before >> endobj 498 0 obj << /S /TD /A [ 499 0 R 500 0 R ] /P 494 0 R /K 71 0 R >> endobj 499 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 500 0 obj << /O /Layout /BlockAlign /Before >> endobj 501 0 obj << /S /TR /P 465 0 R /K [ 502 0 R 505 0 R 508 0 R 511 0 R 514 0 R 517 0 R 520 0 R 523 0 R 526 0 R ] >> endobj 502 0 obj << /S /TD /A [ 503 0 R 504 0 R ] /P 501 0 R /K 73 0 R >> endobj 503 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 504 0 obj << /O /Layout /BlockAlign /Before >> endobj 505 0 obj << /S /TD /A [ 506 0 R 507 0 R ] /P 501 0 R /K 74 0 R >> endobj 506 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 507 0 obj << /O /Layout /BlockAlign /Before >> endobj 508 0 obj << /S /TD /A [ 509 0 R 510 0 R ] /P 501 0 R /K 75 0 R >> endobj 509 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 510 0 obj << /O /Layout /BlockAlign /Before >> endobj 511 0 obj << /S /TD /A [ 512 0 R 513 0 R ] /P 501 0 R /K 76 0 R >> endobj 512 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 513 0 obj << /O /Layout /BlockAlign /Before >> endobj 514 0 obj << /S /TD /A [ 515 0 R 516 0 R ] /P 501 0 R /K 77 0 R >> endobj 515 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 516 0 obj << /O /Layout /BlockAlign /Before >> endobj 517 0 obj << /S /TD /A [ 518 0 R 519 0 R ] /P 501 0 R /K 78 0 R >> endobj 518 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 519 0 obj << /O /Layout /BlockAlign /Before >> endobj 520 0 obj << /S /TD /A [ 521 0 R 522 0 R ] /P 501 0 R /K 79 0 R >> endobj 521 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 522 0 obj << /O /Layout /BlockAlign /Before >> endobj 523 0 obj << /S /TD /A [ 524 0 R 525 0 R ] /P 501 0 R /K 80 0 R >> endobj 524 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 525 0 obj << /O /Layout /BlockAlign /Before >> endobj 526 0 obj << /S /TD /A [ 527 0 R 528 0 R ] /P 501 0 R /K 81 0 R >> endobj 527 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 528 0 obj << /O /Layout /BlockAlign /Before >> endobj 529 0 obj << /S /TR /P 465 0 R /K [ 530 0 R 533 0 R ] >> endobj 530 0 obj << /S /TD /A [ 531 0 R 532 0 R ] /P 529 0 R /K 82 0 R >> endobj 531 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 532 0 obj << /O /Layout /BlockAlign /Before >> endobj 533 0 obj << /S /TD /A [ 534 0 R 535 0 R ] /P 529 0 R /K 83 0 R >> endobj 534 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 535 0 obj << /O /Layout /BlockAlign /Before >> endobj 536 0 obj << /S /TR /P 465 0 R /K [ 537 0 R 540 0 R ] >> endobj 537 0 obj << /S /TD /A [ 538 0 R 539 0 R ] /P 536 0 R /K 84 0 R >> endobj 538 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 539 0 obj << /O /Layout /BlockAlign /Before >> endobj 540 0 obj << /S /TD /A [ 541 0 R 542 0 R ] /P 536 0 R /K 85 0 R >> endobj 541 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 542 0 obj << /O /Layout /BlockAlign /Before >> endobj 543 0 obj << /S /TR /P 465 0 R /K [ 544 0 R 547 0 R ] >> endobj 544 0 obj << /S /TD /A [ 545 0 R 546 0 R ] /P 543 0 R /K 86 0 R >> endobj 545 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 546 0 obj << /O /Layout /BlockAlign /Before >> endobj 547 0 obj << /S /TD /A [ 548 0 R 549 0 R ] /P 543 0 R /K 87 0 R >> endobj 548 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 549 0 obj << /O /Layout /BlockAlign /Before >> endobj 550 0 obj << /S /TR /P 465 0 R /K [ 551 0 R 554 0 R ] >> endobj 551 0 obj << /S /TD /A [ 552 0 R 553 0 R ] /P 550 0 R /K 88 0 R >> endobj 552 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 553 0 obj << /O /Layout /BlockAlign /Before >> endobj 554 0 obj << /S /TD /A [ 555 0 R 556 0 R ] /P 550 0 R /K 89 0 R >> endobj 555 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 556 0 obj << /O /Layout /BlockAlign /Before >> endobj 557 0 obj << /S /TR /P 465 0 R /K [ 558 0 R 561 0 R ] >> endobj 558 0 obj << /S /TD /A [ 559 0 R 560 0 R ] /P 557 0 R /K 90 0 R >> endobj 559 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 560 0 obj << /O /Layout /BlockAlign /Before >> endobj 561 0 obj << /S /TD /A [ 562 0 R 563 0 R ] /P 557 0 R /K 91 0 R >> endobj 562 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 563 0 obj << /O /Layout /BlockAlign /Before >> endobj 564 0 obj << /S /TR /P 465 0 R /K [ 565 0 R 568 0 R ] >> endobj 565 0 obj << /S /TD /A [ 566 0 R 567 0 R ] /P 564 0 R /K 92 0 R >> endobj 566 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 567 0 obj << /O /Layout /BlockAlign /Before >> endobj 568 0 obj << /S /TD /A [ 569 0 R 570 0 R ] /P 564 0 R /K 93 0 R >> endobj 569 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 570 0 obj << /O /Layout /BlockAlign /Before >> endobj 571 0 obj << /S /TR /P 465 0 R /K [ 572 0 R 575 0 R ] >> endobj 572 0 obj << /S /TD /A [ 573 0 R 574 0 R ] /P 571 0 R /K 94 0 R >> endobj 573 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 574 0 obj << /O /Layout /BlockAlign /Before >> endobj 575 0 obj << /S /TD /A [ 576 0 R 577 0 R ] /P 571 0 R /K 95 0 R >> endobj 576 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 577 0 obj << /O /Layout /BlockAlign /Before >> endobj 578 0 obj << /S /Table /P 464 0 R /K [ 579 0 R 607 0 R 614 0 R 639 0 R 658 0 R 665 0 R 675 0 R 682 0 R 689 0 R 696 0 R 703 0 R 710 0 R 738 0 R 757 0 R 764 0 R 771 0 R 778 0 R 785 0 R 792 0 R ] /A [ 1581 0 R ] >> endobj 579 0 obj << /S /TR /P 578 0 R /K [ 580 0 R 583 0 R 586 0 R 589 0 R 592 0 R 595 0 R 598 0 R 601 0 R 604 0 R ] >> endobj 580 0 obj << /S /TD /A [ 581 0 R 582 0 R ] /P 579 0 R /K 99 0 R >> endobj 581 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 582 0 obj << /O /Layout /BlockAlign /Before >> endobj 583 0 obj << /S /TD /A [ 584 0 R 585 0 R ] /P 579 0 R /K 100 0 R >> endobj 584 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 585 0 obj << /O /Layout /BlockAlign /Before >> endobj 586 0 obj << /S /TD /A [ 587 0 R 588 0 R ] /P 579 0 R /K 101 0 R >> endobj 587 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 588 0 obj << /O /Layout /BlockAlign /Before >> endobj 589 0 obj << /S /TD /A [ 590 0 R 591 0 R ] /P 579 0 R /K 102 0 R >> endobj 590 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 591 0 obj << /O /Layout /BlockAlign /Before >> endobj 592 0 obj << /S /TD /A [ 593 0 R 594 0 R ] /P 579 0 R /K 103 0 R >> endobj 593 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 594 0 obj << /O /Layout /BlockAlign /Before >> endobj 595 0 obj << /S /TD /A [ 596 0 R 597 0 R ] /P 579 0 R /K 104 0 R >> endobj 596 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 597 0 obj << /O /Layout /BlockAlign /Before >> endobj 598 0 obj << /S /TD /A [ 599 0 R 600 0 R ] /P 579 0 R /K 105 0 R >> endobj 599 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 600 0 obj << /O /Layout /BlockAlign /Before >> endobj 601 0 obj << /S /TD /A [ 602 0 R 603 0 R ] /P 579 0 R /K 106 0 R >> endobj 602 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 603 0 obj << /O /Layout /BlockAlign /Before >> endobj 604 0 obj << /S /TD /A [ 605 0 R 606 0 R ] /P 579 0 R /K 107 0 R >> endobj 605 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 606 0 obj << /O /Layout /BlockAlign /Before >> endobj 607 0 obj << /S /TR /P 578 0 R /K [ 608 0 R 611 0 R ] >> endobj 608 0 obj << /S /TD /A [ 609 0 R 610 0 R ] /P 607 0 R /K 108 0 R >> endobj 609 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 610 0 obj << /O /Layout /BlockAlign /Before >> endobj 611 0 obj << /S /TD /A [ 612 0 R 613 0 R ] /P 607 0 R /K 109 0 R >> endobj 612 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 613 0 obj << /O /Layout /BlockAlign /Before >> endobj 614 0 obj << /S /TR /P 578 0 R /K [ 615 0 R 618 0 R 621 0 R 624 0 R 627 0 R 630 0 R 633 0 R 636 0 R ] >> endobj 615 0 obj << /S /TD /A [ 616 0 R 617 0 R ] /P 614 0 R /K 110 0 R >> endobj 616 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 617 0 obj << /O /Layout /BlockAlign /Before >> endobj 618 0 obj << /S /TD /A [ 619 0 R 620 0 R ] /P 614 0 R /K 111 0 R >> endobj 619 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 620 0 obj << /O /Layout /BlockAlign /Before >> endobj 621 0 obj << /S /TD /A [ 622 0 R 623 0 R ] /P 614 0 R /K 112 0 R >> endobj 622 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 623 0 obj << /O /Layout /BlockAlign /Before >> endobj 624 0 obj << /S /TD /A [ 625 0 R 626 0 R ] /P 614 0 R /K 113 0 R >> endobj 625 0 obj << /O /Table /ColSpan 2 /RowSpan 1 >> endobj 626 0 obj << /O /Layout /BlockAlign /Before >> endobj 627 0 obj << /S /TD /A [ 628 0 R 629 0 R ] /P 614 0 R /K 114 0 R >> endobj 628 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 629 0 obj << /O /Layout /BlockAlign /Before >> endobj 630 0 obj << /S /TD /A [ 631 0 R 632 0 R ] /P 614 0 R /K 115 0 R >> endobj 631 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 632 0 obj << /O /Layout /BlockAlign /Before >> endobj 633 0 obj << /S /TD /A [ 634 0 R 635 0 R ] /P 614 0 R /K 116 0 R >> endobj 634 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 635 0 obj << /O /Layout /BlockAlign /Before >> endobj 636 0 obj << /S /TD /A [ 637 0 R 638 0 R ] /P 614 0 R /K 117 0 R >> endobj 637 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 638 0 obj << /O /Layout /BlockAlign /Before >> endobj 639 0 obj << /S /TR /P 578 0 R /K [ 640 0 R 643 0 R 646 0 R 649 0 R 652 0 R 655 0 R ] >> endobj 640 0 obj << /S /TD /A [ 641 0 R 642 0 R ] /P 639 0 R /K 118 0 R >> endobj 641 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 642 0 obj << /O /Layout /BlockAlign /Before >> endobj 643 0 obj << /S /TD /A [ 644 0 R 645 0 R ] /P 639 0 R /K 119 0 R >> endobj 644 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 645 0 obj << /O /Layout /BlockAlign /Before >> endobj 646 0 obj << /S /TD /A [ 647 0 R 648 0 R ] /P 639 0 R /K 120 0 R >> endobj 647 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 648 0 obj << /O /Layout /BlockAlign /Before >> endobj 649 0 obj << /S /TD /A [ 650 0 R 651 0 R ] /P 639 0 R /K 121 0 R >> endobj 650 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 651 0 obj << /O /Layout /BlockAlign /Before >> endobj 652 0 obj << /S /TD /A [ 653 0 R 654 0 R ] /P 639 0 R /K 122 0 R >> endobj 653 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 654 0 obj << /O /Layout /BlockAlign /Before >> endobj 655 0 obj << /S /TD /A [ 656 0 R 657 0 R ] /P 639 0 R /K 123 0 R >> endobj 656 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 657 0 obj << /O /Layout /BlockAlign /Before >> endobj 658 0 obj << /S /TR /P 578 0 R /K [ 659 0 R 662 0 R ] >> endobj 659 0 obj << /S /TD /A [ 660 0 R 661 0 R ] /P 658 0 R /K 124 0 R >> endobj 660 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 661 0 obj << /O /Layout /BlockAlign /Before >> endobj 662 0 obj << /S /TD /A [ 663 0 R 664 0 R ] /P 658 0 R /K 125 0 R >> endobj 663 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 664 0 obj << /O /Layout /BlockAlign /Before >> endobj 665 0 obj << /S /TR /P 578 0 R /K [ 666 0 R 669 0 R 672 0 R ] >> endobj 666 0 obj << /S /TD /A [ 667 0 R 668 0 R ] /P 665 0 R /K 126 0 R >> endobj 667 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 668 0 obj << /O /Layout /BlockAlign /Before >> endobj 669 0 obj << /S /TD /A [ 670 0 R 671 0 R ] /P 665 0 R /K 127 0 R >> endobj 670 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 671 0 obj << /O /Layout /BlockAlign /Before >> endobj 672 0 obj << /S /TD /A [ 673 0 R 674 0 R ] /P 665 0 R /K 128 0 R >> endobj 673 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 674 0 obj << /O /Layout /BlockAlign /Before >> endobj 675 0 obj << /S /TR /P 578 0 R /K [ 676 0 R 679 0 R ] >> endobj 676 0 obj << /S /TD /A [ 677 0 R 678 0 R ] /P 675 0 R /K 129 0 R >> endobj 677 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 678 0 obj << /O /Layout /BlockAlign /Before >> endobj 679 0 obj << /S /TD /A [ 680 0 R 681 0 R ] /P 675 0 R /K 130 0 R >> endobj 680 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 681 0 obj << /O /Layout /BlockAlign /Before >> endobj 682 0 obj << /S /TR /P 578 0 R /K [ 683 0 R 686 0 R ] >> endobj 683 0 obj << /S /TD /A [ 684 0 R 685 0 R ] /P 682 0 R /K 131 0 R >> endobj 684 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 685 0 obj << /O /Layout /BlockAlign /Before >> endobj 686 0 obj << /S /TD /A [ 687 0 R 688 0 R ] /P 682 0 R /K 132 0 R >> endobj 687 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 688 0 obj << /O /Layout /BlockAlign /Before >> endobj 689 0 obj << /S /TR /P 578 0 R /K [ 690 0 R 693 0 R ] >> endobj 690 0 obj << /S /TD /A [ 691 0 R 692 0 R ] /P 689 0 R /K 133 0 R >> endobj 691 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 692 0 obj << /O /Layout /BlockAlign /Before >> endobj 693 0 obj << /S /TD /A [ 694 0 R 695 0 R ] /P 689 0 R /K 134 0 R >> endobj 694 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 695 0 obj << /O /Layout /BlockAlign /Before >> endobj 696 0 obj << /S /TR /P 578 0 R /K [ 697 0 R 700 0 R ] >> endobj 697 0 obj << /S /TD /A [ 698 0 R 699 0 R ] /P 696 0 R /K 135 0 R >> endobj 698 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 699 0 obj << /O /Layout /BlockAlign /Before >> endobj 700 0 obj << /S /TD /A [ 701 0 R 702 0 R ] /P 696 0 R /K 136 0 R >> endobj 701 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 702 0 obj << /O /Layout /BlockAlign /Before >> endobj 703 0 obj << /S /TR /P 578 0 R /K [ 704 0 R 707 0 R ] >> endobj 704 0 obj << /S /TD /A [ 705 0 R 706 0 R ] /P 703 0 R /K 137 0 R >> endobj 705 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 706 0 obj << /O /Layout /BlockAlign /Before >> endobj 707 0 obj << /S /TD /A [ 708 0 R 709 0 R ] /P 703 0 R /K 138 0 R >> endobj 708 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 709 0 obj << /O /Layout /BlockAlign /Before >> endobj 710 0 obj << /S /TR /P 578 0 R /K [ 711 0 R 714 0 R 717 0 R 720 0 R 723 0 R 726 0 R 729 0 R 732 0 R 735 0 R ] >> endobj 711 0 obj << /S /TD /A [ 712 0 R 713 0 R ] /P 710 0 R /K 139 0 R >> endobj 712 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 713 0 obj << /O /Layout /BlockAlign /Before >> endobj 714 0 obj << /S /TD /A [ 715 0 R 716 0 R ] /P 710 0 R /K 140 0 R >> endobj 715 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 716 0 obj << /O /Layout /BlockAlign /Before >> endobj 717 0 obj << /S /TD /A [ 718 0 R 719 0 R ] /P 710 0 R /K 141 0 R >> endobj 718 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 719 0 obj << /O /Layout /BlockAlign /Before >> endobj 720 0 obj << /S /TD /A [ 721 0 R 722 0 R ] /P 710 0 R /K 142 0 R >> endobj 721 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 722 0 obj << /O /Layout /BlockAlign /Before >> endobj 723 0 obj << /S /TD /A [ 724 0 R 725 0 R ] /P 710 0 R /K 143 0 R >> endobj 724 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 725 0 obj << /O /Layout /BlockAlign /Before >> endobj 726 0 obj << /S /TD /A [ 727 0 R 728 0 R ] /P 710 0 R /K 144 0 R >> endobj 727 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 728 0 obj << /O /Layout /BlockAlign /Before >> endobj 729 0 obj << /S /TD /A [ 730 0 R 731 0 R ] /P 710 0 R /K 145 0 R >> endobj 730 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 731 0 obj << /O /Layout /BlockAlign /Before >> endobj 732 0 obj << /S /TD /A [ 733 0 R 734 0 R ] /P 710 0 R /K 146 0 R >> endobj 733 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 734 0 obj << /O /Layout /BlockAlign /Before >> endobj 735 0 obj << /S /TD /A [ 736 0 R 737 0 R ] /P 710 0 R /K 147 0 R >> endobj 736 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 737 0 obj << /O /Layout /BlockAlign /Before >> endobj 738 0 obj << /S /TR /P 578 0 R /K [ 739 0 R 742 0 R 745 0 R 748 0 R 751 0 R 754 0 R ] >> endobj 739 0 obj << /S /TD /A [ 740 0 R 741 0 R ] /P 738 0 R /K 148 0 R >> endobj 740 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 741 0 obj << /O /Layout /BlockAlign /Before >> endobj 742 0 obj << /S /TD /A [ 743 0 R 744 0 R ] /P 738 0 R /K 149 0 R >> endobj 743 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 744 0 obj << /O /Layout /BlockAlign /Before >> endobj 745 0 obj << /S /TD /A [ 746 0 R 747 0 R ] /P 738 0 R /K 150 0 R >> endobj 746 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 747 0 obj << /O /Layout /BlockAlign /Before >> endobj 748 0 obj << /S /TD /A [ 749 0 R 750 0 R ] /P 738 0 R /K 151 0 R >> endobj 749 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 750 0 obj << /O /Layout /BlockAlign /Before >> endobj 751 0 obj << /S /TD /A [ 752 0 R 753 0 R ] /P 738 0 R /K 152 0 R >> endobj 752 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 753 0 obj << /O /Layout /BlockAlign /Before >> endobj 754 0 obj << /S /TD /A [ 755 0 R 756 0 R ] /P 738 0 R /K 153 0 R >> endobj 755 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 756 0 obj << /O /Layout /BlockAlign /Before >> endobj 757 0 obj << /S /TR /P 578 0 R /K [ 758 0 R 761 0 R ] >> endobj 758 0 obj << /S /TD /A [ 759 0 R 760 0 R ] /P 757 0 R /K 154 0 R >> endobj 759 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 760 0 obj << /O /Layout /BlockAlign /Before >> endobj 761 0 obj << /S /TD /A [ 762 0 R 763 0 R ] /P 757 0 R /K 155 0 R >> endobj 762 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 763 0 obj << /O /Layout /BlockAlign /Before >> endobj 764 0 obj << /S /TR /P 578 0 R /K [ 765 0 R 768 0 R ] >> endobj 765 0 obj << /S /TD /A [ 766 0 R 767 0 R ] /P 764 0 R /K 156 0 R >> endobj 766 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 767 0 obj << /O /Layout /BlockAlign /Before >> endobj 768 0 obj << /S /TD /A [ 769 0 R 770 0 R ] /P 764 0 R /K 157 0 R >> endobj 769 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 770 0 obj << /O /Layout /BlockAlign /Before >> endobj 771 0 obj << /S /TR /P 578 0 R /K [ 772 0 R 775 0 R ] >> endobj 772 0 obj << /S /TD /A [ 773 0 R 774 0 R ] /P 771 0 R /K 158 0 R >> endobj 773 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 774 0 obj << /O /Layout /BlockAlign /Before >> endobj 775 0 obj << /S /TD /A [ 776 0 R 777 0 R ] /P 771 0 R /K 159 0 R >> endobj 776 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 777 0 obj << /O /Layout /BlockAlign /Before >> endobj 778 0 obj << /S /TR /P 578 0 R /K [ 779 0 R 782 0 R ] >> endobj 779 0 obj << /S /TD /A [ 780 0 R 781 0 R ] /P 778 0 R /K 160 0 R >> endobj 780 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 781 0 obj << /O /Layout /BlockAlign /Before >> endobj 782 0 obj << /S /TD /A [ 783 0 R 784 0 R ] /P 778 0 R /K 161 0 R >> endobj 783 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 784 0 obj << /O /Layout /BlockAlign /Before >> endobj 785 0 obj << /S /TR /P 578 0 R /K [ 786 0 R 789 0 R ] >> endobj 786 0 obj << /S /TD /A [ 787 0 R 788 0 R ] /P 785 0 R /K 162 0 R >> endobj 787 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 788 0 obj << /O /Layout /BlockAlign /Before >> endobj 789 0 obj << /S /TD /A [ 790 0 R 791 0 R ] /P 785 0 R /K 163 0 R >> endobj 790 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 791 0 obj << /O /Layout /BlockAlign /Before >> endobj 792 0 obj << /S /TR /P 578 0 R /K [ 793 0 R 796 0 R ] >> endobj 793 0 obj << /S /TD /A [ 794 0 R 795 0 R ] /P 792 0 R /K 164 0 R >> endobj 794 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 795 0 obj << /O /Layout /BlockAlign /Before >> endobj 796 0 obj << /S /TD /A [ 797 0 R 798 0 R ] /P 792 0 R /K 165 0 R >> endobj 797 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 798 0 obj << /O /Layout /BlockAlign /Before >> endobj 799 0 obj << /S /Table /P 464 0 R /K [ 800 0 R 828 0 R 835 0 R 860 0 R 879 0 R 886 0 R 896 0 R 903 0 R 910 0 R 917 0 R 924 0 R 931 0 R 959 0 R 978 0 R 985 0 R 992 0 R 999 0 R 1006 0 R 1013 0 R ] /A [ 1582 0 R ] >> endobj 800 0 obj << /S /TR /P 799 0 R /K [ 801 0 R 804 0 R 807 0 R 810 0 R 813 0 R 816 0 R 819 0 R 822 0 R 825 0 R ] >> endobj 801 0 obj << /S /TD /A [ 802 0 R 803 0 R ] /P 800 0 R /K 168 0 R >> endobj 802 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 803 0 obj << /O /Layout /BlockAlign /Before >> endobj 804 0 obj << /S /TD /A [ 805 0 R 806 0 R ] /P 800 0 R /K 169 0 R >> endobj 805 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 806 0 obj << /O /Layout /BlockAlign /Before >> endobj 807 0 obj << /S /TD /A [ 808 0 R 809 0 R ] /P 800 0 R /K 170 0 R >> endobj 808 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 809 0 obj << /O /Layout /BlockAlign /Before >> endobj 810 0 obj << /S /TD /A [ 811 0 R 812 0 R ] /P 800 0 R /K 171 0 R >> endobj 811 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 812 0 obj << /O /Layout /BlockAlign /Before >> endobj 813 0 obj << /S /TD /A [ 814 0 R 815 0 R ] /P 800 0 R /K 172 0 R >> endobj 814 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 815 0 obj << /O /Layout /BlockAlign /Before >> endobj 816 0 obj << /S /TD /A [ 817 0 R 818 0 R ] /P 800 0 R /K 173 0 R >> endobj 817 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 818 0 obj << /O /Layout /BlockAlign /Before >> endobj 819 0 obj << /S /TD /A [ 820 0 R 821 0 R ] /P 800 0 R /K 174 0 R >> endobj 820 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 821 0 obj << /O /Layout /BlockAlign /Before >> endobj 822 0 obj << /S /TD /A [ 823 0 R 824 0 R ] /P 800 0 R /K 175 0 R >> endobj 823 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 824 0 obj << /O /Layout /BlockAlign /Before >> endobj 825 0 obj << /S /TD /A [ 826 0 R 827 0 R ] /P 800 0 R /K 176 0 R >> endobj 826 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 827 0 obj << /O /Layout /BlockAlign /Before >> endobj 828 0 obj << /S /TR /P 799 0 R /K [ 829 0 R 832 0 R ] >> endobj 829 0 obj << /S /TD /A [ 830 0 R 831 0 R ] /P 828 0 R /K 177 0 R >> endobj 830 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 831 0 obj << /O /Layout /BlockAlign /Before >> endobj 832 0 obj << /S /TD /A [ 833 0 R 834 0 R ] /P 828 0 R /K 178 0 R >> endobj 833 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 834 0 obj << /O /Layout /BlockAlign /Before >> endobj 835 0 obj << /S /TR /P 799 0 R /K [ 836 0 R 839 0 R 842 0 R 845 0 R 848 0 R 851 0 R 854 0 R 857 0 R ] >> endobj 836 0 obj << /S /TD /A [ 837 0 R 838 0 R ] /P 835 0 R /K 179 0 R >> endobj 837 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 838 0 obj << /O /Layout /BlockAlign /Before >> endobj 839 0 obj << /S /TD /A [ 840 0 R 841 0 R ] /P 835 0 R /K 180 0 R >> endobj 840 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 841 0 obj << /O /Layout /BlockAlign /Before >> endobj 842 0 obj << /S /TD /A [ 843 0 R 844 0 R ] /P 835 0 R /K 181 0 R >> endobj 843 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 844 0 obj << /O /Layout /BlockAlign /Before >> endobj 845 0 obj << /S /TD /A [ 846 0 R 847 0 R ] /P 835 0 R /K 182 0 R >> endobj 846 0 obj << /O /Table /ColSpan 2 /RowSpan 1 >> endobj 847 0 obj << /O /Layout /BlockAlign /Before >> endobj 848 0 obj << /S /TD /A [ 849 0 R 850 0 R ] /P 835 0 R /K 183 0 R >> endobj 849 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 850 0 obj << /O /Layout /BlockAlign /Before >> endobj 851 0 obj << /S /TD /A [ 852 0 R 853 0 R ] /P 835 0 R /K 184 0 R >> endobj 852 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 853 0 obj << /O /Layout /BlockAlign /Before >> endobj 854 0 obj << /S /TD /A [ 855 0 R 856 0 R ] /P 835 0 R /K 185 0 R >> endobj 855 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 856 0 obj << /O /Layout /BlockAlign /Before >> endobj 857 0 obj << /S /TD /A [ 858 0 R 859 0 R ] /P 835 0 R /K 186 0 R >> endobj 858 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 859 0 obj << /O /Layout /BlockAlign /Before >> endobj 860 0 obj << /S /TR /P 799 0 R /K [ 861 0 R 864 0 R 867 0 R 870 0 R 873 0 R 876 0 R ] >> endobj 861 0 obj << /S /TD /A [ 862 0 R 863 0 R ] /P 860 0 R /K 187 0 R >> endobj 862 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 863 0 obj << /O /Layout /BlockAlign /Before >> endobj 864 0 obj << /S /TD /A [ 865 0 R 866 0 R ] /P 860 0 R /K 188 0 R >> endobj 865 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 866 0 obj << /O /Layout /BlockAlign /Before >> endobj 867 0 obj << /S /TD /A [ 868 0 R 869 0 R ] /P 860 0 R /K 189 0 R >> endobj 868 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 869 0 obj << /O /Layout /BlockAlign /Before >> endobj 870 0 obj << /S /TD /A [ 871 0 R 872 0 R ] /P 860 0 R /K 190 0 R >> endobj 871 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 872 0 obj << /O /Layout /BlockAlign /Before >> endobj 873 0 obj << /S /TD /A [ 874 0 R 875 0 R ] /P 860 0 R /K 191 0 R >> endobj 874 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 875 0 obj << /O /Layout /BlockAlign /Before >> endobj 876 0 obj << /S /TD /A [ 877 0 R 878 0 R ] /P 860 0 R /K 192 0 R >> endobj 877 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 878 0 obj << /O /Layout /BlockAlign /Before >> endobj 879 0 obj << /S /TR /P 799 0 R /K [ 880 0 R 883 0 R ] >> endobj 880 0 obj << /S /TD /A [ 881 0 R 882 0 R ] /P 879 0 R /K 193 0 R >> endobj 881 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 882 0 obj << /O /Layout /BlockAlign /Before >> endobj 883 0 obj << /S /TD /A [ 884 0 R 885 0 R ] /P 879 0 R /K 194 0 R >> endobj 884 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 885 0 obj << /O /Layout /BlockAlign /Before >> endobj 886 0 obj << /S /TR /P 799 0 R /K [ 887 0 R 890 0 R 893 0 R ] >> endobj 887 0 obj << /S /TD /A [ 888 0 R 889 0 R ] /P 886 0 R /K 195 0 R >> endobj 888 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 889 0 obj << /O /Layout /BlockAlign /Before >> endobj 890 0 obj << /S /TD /A [ 891 0 R 892 0 R ] /P 886 0 R /K 196 0 R >> endobj 891 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 892 0 obj << /O /Layout /BlockAlign /Before >> endobj 893 0 obj << /S /TD /A [ 894 0 R 895 0 R ] /P 886 0 R /K 197 0 R >> endobj 894 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 895 0 obj << /O /Layout /BlockAlign /Before >> endobj 896 0 obj << /S /TR /P 799 0 R /K [ 897 0 R 900 0 R ] >> endobj 897 0 obj << /S /TD /A [ 898 0 R 899 0 R ] /P 896 0 R /K 198 0 R >> endobj 898 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 899 0 obj << /O /Layout /BlockAlign /Before >> endobj 900 0 obj << /S /TD /A [ 901 0 R 902 0 R ] /P 896 0 R /K 199 0 R >> endobj 901 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 902 0 obj << /O /Layout /BlockAlign /Before >> endobj 903 0 obj << /S /TR /P 799 0 R /K [ 904 0 R 907 0 R ] >> endobj 904 0 obj << /S /TD /A [ 905 0 R 906 0 R ] /P 903 0 R /K 200 0 R >> endobj 905 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 906 0 obj << /O /Layout /BlockAlign /Before >> endobj 907 0 obj << /S /TD /A [ 908 0 R 909 0 R ] /P 903 0 R /K 201 0 R >> endobj 908 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 909 0 obj << /O /Layout /BlockAlign /Before >> endobj 910 0 obj << /S /TR /P 799 0 R /K [ 911 0 R 914 0 R ] >> endobj 911 0 obj << /S /TD /A [ 912 0 R 913 0 R ] /P 910 0 R /K 202 0 R >> endobj 912 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 913 0 obj << /O /Layout /BlockAlign /Before >> endobj 914 0 obj << /S /TD /A [ 915 0 R 916 0 R ] /P 910 0 R /K 203 0 R >> endobj 915 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 916 0 obj << /O /Layout /BlockAlign /Before >> endobj 917 0 obj << /S /TR /P 799 0 R /K [ 918 0 R 921 0 R ] >> endobj 918 0 obj << /S /TD /A [ 919 0 R 920 0 R ] /P 917 0 R /K 204 0 R >> endobj 919 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 920 0 obj << /O /Layout /BlockAlign /Before >> endobj 921 0 obj << /S /TD /A [ 922 0 R 923 0 R ] /P 917 0 R /K 205 0 R >> endobj 922 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 923 0 obj << /O /Layout /BlockAlign /Before >> endobj 924 0 obj << /S /TR /P 799 0 R /K [ 925 0 R 928 0 R ] >> endobj 925 0 obj << /S /TD /A [ 926 0 R 927 0 R ] /P 924 0 R /K 206 0 R >> endobj 926 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 927 0 obj << /O /Layout /BlockAlign /Before >> endobj 928 0 obj << /S /TD /A [ 929 0 R 930 0 R ] /P 924 0 R /K 207 0 R >> endobj 929 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 930 0 obj << /O /Layout /BlockAlign /Before >> endobj 931 0 obj << /S /TR /P 799 0 R /K [ 932 0 R 935 0 R 938 0 R 941 0 R 944 0 R 947 0 R 950 0 R 953 0 R 956 0 R ] >> endobj 932 0 obj << /S /TD /A [ 933 0 R 934 0 R ] /P 931 0 R /K 208 0 R >> endobj 933 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 934 0 obj << /O /Layout /BlockAlign /Before >> endobj 935 0 obj << /S /TD /A [ 936 0 R 937 0 R ] /P 931 0 R /K 209 0 R >> endobj 936 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 937 0 obj << /O /Layout /BlockAlign /Before >> endobj 938 0 obj << /S /TD /A [ 939 0 R 940 0 R ] /P 931 0 R /K 210 0 R >> endobj 939 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 940 0 obj << /O /Layout /BlockAlign /Before >> endobj 941 0 obj << /S /TD /A [ 942 0 R 943 0 R ] /P 931 0 R /K 211 0 R >> endobj 942 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 943 0 obj << /O /Layout /BlockAlign /Before >> endobj 944 0 obj << /S /TD /A [ 945 0 R 946 0 R ] /P 931 0 R /K 212 0 R >> endobj 945 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 946 0 obj << /O /Layout /BlockAlign /Before >> endobj 947 0 obj << /S /TD /A [ 948 0 R 949 0 R ] /P 931 0 R /K 213 0 R >> endobj 948 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 949 0 obj << /O /Layout /BlockAlign /Before >> endobj 950 0 obj << /S /TD /A [ 951 0 R 952 0 R ] /P 931 0 R /K 214 0 R >> endobj 951 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 952 0 obj << /O /Layout /BlockAlign /Before >> endobj 953 0 obj << /S /TD /A [ 954 0 R 955 0 R ] /P 931 0 R /K 215 0 R >> endobj 954 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 955 0 obj << /O /Layout /BlockAlign /Before >> endobj 956 0 obj << /S /TD /A [ 957 0 R 958 0 R ] /P 931 0 R /K 216 0 R >> endobj 957 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 958 0 obj << /O /Layout /BlockAlign /Before >> endobj 959 0 obj << /S /TR /P 799 0 R /K [ 960 0 R 963 0 R 966 0 R 969 0 R 972 0 R 975 0 R ] >> endobj 960 0 obj << /S /TD /A [ 961 0 R 962 0 R ] /P 959 0 R /K 217 0 R >> endobj 961 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 962 0 obj << /O /Layout /BlockAlign /Before >> endobj 963 0 obj << /S /TD /A [ 964 0 R 965 0 R ] /P 959 0 R /K 218 0 R >> endobj 964 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 965 0 obj << /O /Layout /BlockAlign /Before >> endobj 966 0 obj << /S /TD /A [ 967 0 R 968 0 R ] /P 959 0 R /K 219 0 R >> endobj 967 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 968 0 obj << /O /Layout /BlockAlign /Before >> endobj 969 0 obj << /S /TD /A [ 970 0 R 971 0 R ] /P 959 0 R /K 220 0 R >> endobj 970 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 971 0 obj << /O /Layout /BlockAlign /Before >> endobj 972 0 obj << /S /TD /A [ 973 0 R 974 0 R ] /P 959 0 R /K 221 0 R >> endobj 973 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 974 0 obj << /O /Layout /BlockAlign /Before >> endobj 975 0 obj << /S /TD /A [ 976 0 R 977 0 R ] /P 959 0 R /K 222 0 R >> endobj 976 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 977 0 obj << /O /Layout /BlockAlign /Before >> endobj 978 0 obj << /S /TR /P 799 0 R /K [ 979 0 R 982 0 R ] >> endobj 979 0 obj << /S /TD /A [ 980 0 R 981 0 R ] /P 978 0 R /K 223 0 R >> endobj 980 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 981 0 obj << /O /Layout /BlockAlign /Before >> endobj 982 0 obj << /S /TD /A [ 983 0 R 984 0 R ] /P 978 0 R /K 224 0 R >> endobj 983 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 984 0 obj << /O /Layout /BlockAlign /Before >> endobj 985 0 obj << /S /TR /P 799 0 R /K [ 986 0 R 989 0 R ] >> endobj 986 0 obj << /S /TD /A [ 987 0 R 988 0 R ] /P 985 0 R /K 225 0 R >> endobj 987 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 988 0 obj << /O /Layout /BlockAlign /Before >> endobj 989 0 obj << /S /TD /A [ 990 0 R 991 0 R ] /P 985 0 R /K 226 0 R >> endobj 990 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 991 0 obj << /O /Layout /BlockAlign /Before >> endobj 992 0 obj << /S /TR /P 799 0 R /K [ 993 0 R 996 0 R ] >> endobj 993 0 obj << /S /TD /A [ 994 0 R 995 0 R ] /P 992 0 R /K 227 0 R >> endobj 994 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 995 0 obj << /O /Layout /BlockAlign /Before >> endobj 996 0 obj << /S /TD /A [ 997 0 R 998 0 R ] /P 992 0 R /K 228 0 R >> endobj 997 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 998 0 obj << /O /Layout /BlockAlign /Before >> endobj 999 0 obj << /S /TR /P 799 0 R /K [ 1000 0 R 1003 0 R ] >> endobj 1000 0 obj << /S /TD /A [ 1001 0 R 1002 0 R ] /P 999 0 R /K 229 0 R >> endobj 1001 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1002 0 obj << /O /Layout /BlockAlign /Before >> endobj 1003 0 obj << /S /TD /A [ 1004 0 R 1005 0 R ] /P 999 0 R /K 230 0 R >> endobj 1004 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1005 0 obj << /O /Layout /BlockAlign /Before >> endobj 1006 0 obj << /S /TR /P 799 0 R /K [ 1007 0 R 1010 0 R ] >> endobj 1007 0 obj << /S /TD /A [ 1008 0 R 1009 0 R ] /P 1006 0 R /K 231 0 R >> endobj 1008 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1009 0 obj << /O /Layout /BlockAlign /Before >> endobj 1010 0 obj << /S /TD /A [ 1011 0 R 1012 0 R ] /P 1006 0 R /K 232 0 R >> endobj 1011 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 1012 0 obj << /O /Layout /BlockAlign /Before >> endobj 1013 0 obj << /S /TR /P 799 0 R /K [ 1014 0 R 1017 0 R ] >> endobj 1014 0 obj << /S /TD /A [ 1015 0 R 1016 0 R ] /P 1013 0 R /K 233 0 R >> endobj 1015 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1016 0 obj << /O /Layout /BlockAlign /Before >> endobj 1017 0 obj << /S /TD /A [ 1018 0 R 1019 0 R ] /P 1013 0 R /K 234 0 R >> endobj 1018 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1019 0 obj << /O /Layout /BlockAlign /Before >> endobj 1020 0 obj << /S /Table /P 464 0 R /K [ 1021 0 R 1049 0 R 1056 0 R 1081 0 R 1094 0 R 1101 0 R 1111 0 R 1118 0 R 1125 0 R 1132 0 R 1139 0 R 1146 0 R 1174 0 R 1193 0 R 1200 0 R 1219 0 R 1226 0 R 1233 0 R 1252 0 R ] /A [ 1583 0 R ] >> endobj 1021 0 obj << /S /TR /P 1020 0 R /K [ 1022 0 R 1025 0 R 1028 0 R 1031 0 R 1034 0 R 1037 0 R 1040 0 R 1043 0 R 1046 0 R ] >> endobj 1022 0 obj << /S /TD /A [ 1023 0 R 1024 0 R ] /P 1021 0 R /K 237 0 R >> endobj 1023 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1024 0 obj << /O /Layout /BlockAlign /Before >> endobj 1025 0 obj << /S /TD /A [ 1026 0 R 1027 0 R ] /P 1021 0 R /K 238 0 R >> endobj 1026 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1027 0 obj << /O /Layout /BlockAlign /Before >> endobj 1028 0 obj << /S /TD /A [ 1029 0 R 1030 0 R ] /P 1021 0 R /K 239 0 R >> endobj 1029 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1030 0 obj << /O /Layout /BlockAlign /Before >> endobj 1031 0 obj << /S /TD /A [ 1032 0 R 1033 0 R ] /P 1021 0 R /K 240 0 R >> endobj 1032 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1033 0 obj << /O /Layout /BlockAlign /Before >> endobj 1034 0 obj << /S /TD /A [ 1035 0 R 1036 0 R ] /P 1021 0 R /K 241 0 R >> endobj 1035 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1036 0 obj << /O /Layout /BlockAlign /Before >> endobj 1037 0 obj << /S /TD /A [ 1038 0 R 1039 0 R ] /P 1021 0 R /K 242 0 R >> endobj 1038 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1039 0 obj << /O /Layout /BlockAlign /Before >> endobj 1040 0 obj << /S /TD /A [ 1041 0 R 1042 0 R ] /P 1021 0 R /K 243 0 R >> endobj 1041 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1042 0 obj << /O /Layout /BlockAlign /Before >> endobj 1043 0 obj << /S /TD /A [ 1044 0 R 1045 0 R ] /P 1021 0 R /K 244 0 R >> endobj 1044 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1045 0 obj << /O /Layout /BlockAlign /Before >> endobj 1046 0 obj << /S /TD /A [ 1047 0 R 1048 0 R ] /P 1021 0 R /K 245 0 R >> endobj 1047 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1048 0 obj << /O /Layout /BlockAlign /Before >> endobj 1049 0 obj << /S /TR /P 1020 0 R /K [ 1050 0 R 1053 0 R ] >> endobj 1050 0 obj << /S /TD /A [ 1051 0 R 1052 0 R ] /P 1049 0 R /K 246 0 R >> endobj 1051 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1052 0 obj << /O /Layout /BlockAlign /Before >> endobj 1053 0 obj << /S /TD /A [ 1054 0 R 1055 0 R ] /P 1049 0 R /K 247 0 R >> endobj 1054 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1055 0 obj << /O /Layout /BlockAlign /Before >> endobj 1056 0 obj << /S /TR /P 1020 0 R /K [ 1057 0 R 1060 0 R 1063 0 R 1066 0 R 1069 0 R 1072 0 R 1075 0 R 1078 0 R ] >> endobj 1057 0 obj << /S /TD /A [ 1058 0 R 1059 0 R ] /P 1056 0 R /K 248 0 R >> endobj 1058 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1059 0 obj << /O /Layout /BlockAlign /Before >> endobj 1060 0 obj << /S /TD /A [ 1061 0 R 1062 0 R ] /P 1056 0 R /K 249 0 R >> endobj 1061 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1062 0 obj << /O /Layout /BlockAlign /Before >> endobj 1063 0 obj << /S /TD /A [ 1064 0 R 1065 0 R ] /P 1056 0 R /K 250 0 R >> endobj 1064 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1065 0 obj << /O /Layout /BlockAlign /Before >> endobj 1066 0 obj << /S /TD /A [ 1067 0 R 1068 0 R ] /P 1056 0 R /K 251 0 R >> endobj 1067 0 obj << /O /Table /ColSpan 2 /RowSpan 1 >> endobj 1068 0 obj << /O /Layout /BlockAlign /Before >> endobj 1069 0 obj << /S /TD /A [ 1070 0 R 1071 0 R ] /P 1056 0 R /K 252 0 R >> endobj 1070 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1071 0 obj << /O /Layout /BlockAlign /Before >> endobj 1072 0 obj << /S /TD /A [ 1073 0 R 1074 0 R ] /P 1056 0 R /K 253 0 R >> endobj 1073 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1074 0 obj << /O /Layout /BlockAlign /Before >> endobj 1075 0 obj << /S /TD /A [ 1076 0 R 1077 0 R ] /P 1056 0 R /K 254 0 R >> endobj 1076 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1077 0 obj << /O /Layout /BlockAlign /Before >> endobj 1078 0 obj << /S /TD /A [ 1079 0 R 1080 0 R ] /P 1056 0 R /K 255 0 R >> endobj 1079 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1080 0 obj << /O /Layout /BlockAlign /Before >> endobj 1081 0 obj << /S /TR /P 1020 0 R /K [ 1082 0 R 1085 0 R 1088 0 R 1091 0 R ] >> endobj 1082 0 obj << /S /TD /A [ 1083 0 R 1084 0 R ] /P 1081 0 R /K 256 0 R >> endobj 1083 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1084 0 obj << /O /Layout /BlockAlign /Before >> endobj 1085 0 obj << /S /TD /A [ 1086 0 R 1087 0 R ] /P 1081 0 R /K 257 0 R >> endobj 1086 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1087 0 obj << /O /Layout /BlockAlign /Before >> endobj 1088 0 obj << /S /TD /A [ 1089 0 R 1090 0 R ] /P 1081 0 R /K 258 0 R >> endobj 1089 0 obj << /O /Table /ColSpan 2 /RowSpan 1 >> endobj 1090 0 obj << /O /Layout /BlockAlign /Before >> endobj 1091 0 obj << /S /TD /A [ 1092 0 R 1093 0 R ] /P 1081 0 R /K 259 0 R >> endobj 1092 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1093 0 obj << /O /Layout /BlockAlign /Before >> endobj 1094 0 obj << /S /TR /P 1020 0 R /K [ 1095 0 R 1098 0 R ] >> endobj 1095 0 obj << /S /TD /A [ 1096 0 R 1097 0 R ] /P 1094 0 R /K 260 0 R >> endobj 1096 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1097 0 obj << /O /Layout /BlockAlign /Before >> endobj 1098 0 obj << /S /TD /A [ 1099 0 R 1100 0 R ] /P 1094 0 R /K 261 0 R >> endobj 1099 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1100 0 obj << /O /Layout /BlockAlign /Before >> endobj 1101 0 obj << /S /TR /P 1020 0 R /K [ 1102 0 R 1105 0 R 1108 0 R ] >> endobj 1102 0 obj << /S /TD /A [ 1103 0 R 1104 0 R ] /P 1101 0 R /K 262 0 R >> endobj 1103 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1104 0 obj << /O /Layout /BlockAlign /Before >> endobj 1105 0 obj << /S /TD /A [ 1106 0 R 1107 0 R ] /P 1101 0 R /K 263 0 R >> endobj 1106 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 1107 0 obj << /O /Layout /BlockAlign /Before >> endobj 1108 0 obj << /S /TD /A [ 1109 0 R 1110 0 R ] /P 1101 0 R /K 264 0 R >> endobj 1109 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 1110 0 obj << /O /Layout /BlockAlign /Before >> endobj 1111 0 obj << /S /TR /P 1020 0 R /K [ 1112 0 R 1115 0 R ] >> endobj 1112 0 obj << /S /TD /A [ 1113 0 R 1114 0 R ] /P 1111 0 R /K 265 0 R >> endobj 1113 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1114 0 obj << /O /Layout /BlockAlign /Before >> endobj 1115 0 obj << /S /TD /A [ 1116 0 R 1117 0 R ] /P 1111 0 R /K 266 0 R >> endobj 1116 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1117 0 obj << /O /Layout /BlockAlign /Before >> endobj 1118 0 obj << /S /TR /P 1020 0 R /K [ 1119 0 R 1122 0 R ] >> endobj 1119 0 obj << /S /TD /A [ 1120 0 R 1121 0 R ] /P 1118 0 R /K 267 0 R >> endobj 1120 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1121 0 obj << /O /Layout /BlockAlign /Before >> endobj 1122 0 obj << /S /TD /A [ 1123 0 R 1124 0 R ] /P 1118 0 R /K 268 0 R >> endobj 1123 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1124 0 obj << /O /Layout /BlockAlign /Before >> endobj 1125 0 obj << /S /TR /P 1020 0 R /K [ 1126 0 R 1129 0 R ] >> endobj 1126 0 obj << /S /TD /A [ 1127 0 R 1128 0 R ] /P 1125 0 R /K 269 0 R >> endobj 1127 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1128 0 obj << /O /Layout /BlockAlign /Before >> endobj 1129 0 obj << /S /TD /A [ 1130 0 R 1131 0 R ] /P 1125 0 R /K 270 0 R >> endobj 1130 0 obj << /O /Table /ColSpan 8 /RowSpan 1 >> endobj 1131 0 obj << /O /Layout /BlockAlign /Before >> endobj 1132 0 obj << /S /TR /P 1020 0 R /K [ 1133 0 R 1136 0 R ] >> endobj 1133 0 obj << /S /TD /A [ 1134 0 R 1135 0 R ] /P 1132 0 R /K 271 0 R >> endobj 1134 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1135 0 obj << /O /Layout /BlockAlign /Before >> endobj 1136 0 obj << /S /TD /A [ 1137 0 R 1138 0 R ] /P 1132 0 R /K 272 0 R >> endobj 1137 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1138 0 obj << /O /Layout /BlockAlign /Before >> endobj 1139 0 obj << /S /TR /P 1020 0 R /K [ 1140 0 R 1143 0 R ] >> endobj 1140 0 obj << /S /TD /A [ 1141 0 R 1142 0 R ] /P 1139 0 R /K 273 0 R >> endobj 1141 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1142 0 obj << /O /Layout /BlockAlign /Before >> endobj 1143 0 obj << /S /TD /A [ 1144 0 R 1145 0 R ] /P 1139 0 R /K 274 0 R >> endobj 1144 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1145 0 obj << /O /Layout /BlockAlign /Before >> endobj 1146 0 obj << /S /TR /P 1020 0 R /K [ 1147 0 R 1150 0 R 1153 0 R 1156 0 R 1159 0 R 1162 0 R 1165 0 R 1168 0 R 1171 0 R ] >> endobj 1147 0 obj << /S /TD /A [ 1148 0 R 1149 0 R ] /P 1146 0 R /K 275 0 R >> endobj 1148 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1149 0 obj << /O /Layout /BlockAlign /Before >> endobj 1150 0 obj << /S /TD /A [ 1151 0 R 1152 0 R ] /P 1146 0 R /K 276 0 R >> endobj 1151 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1152 0 obj << /O /Layout /BlockAlign /Before >> endobj 1153 0 obj << /S /TD /A [ 1154 0 R 1155 0 R ] /P 1146 0 R /K 277 0 R >> endobj 1154 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1155 0 obj << /O /Layout /BlockAlign /Before >> endobj 1156 0 obj << /S /TD /A [ 1157 0 R 1158 0 R ] /P 1146 0 R /K 278 0 R >> endobj 1157 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1158 0 obj << /O /Layout /BlockAlign /Before >> endobj 1159 0 obj << /S /TD /A [ 1160 0 R 1161 0 R ] /P 1146 0 R /K 279 0 R >> endobj 1160 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1161 0 obj << /O /Layout /BlockAlign /Before >> endobj 1162 0 obj << /S /TD /A [ 1163 0 R 1164 0 R ] /P 1146 0 R /K 280 0 R >> endobj 1163 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1164 0 obj << /O /Layout /BlockAlign /Before >> endobj 1165 0 obj << /S /TD /A [ 1166 0 R 1167 0 R ] /P 1146 0 R /K 281 0 R >> endobj 1166 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1167 0 obj << /O /Layout /BlockAlign /Before >> endobj 1168 0 obj << /S /TD /A [ 1169 0 R 1170 0 R ] /P 1146 0 R /K 282 0 R >> endobj 1169 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1170 0 obj << /O /Layout /BlockAlign /Before >> endobj 1171 0 obj << /S /TD /A [ 1172 0 R 1173 0 R ] /P 1146 0 R /K 283 0 R >> endobj 1172 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1173 0 obj << /O /Layout /BlockAlign /Before >> endobj 1174 0 obj << /S /TR /P 1020 0 R /K [ 1175 0 R 1178 0 R 1181 0 R 1184 0 R 1187 0 R 1190 0 R ] >> endobj 1175 0 obj << /S /TD /A [ 1176 0 R 1177 0 R ] /P 1174 0 R /K 284 0 R >> endobj 1176 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1177 0 obj << /O /Layout /BlockAlign /Before >> endobj 1178 0 obj << /S /TD /A [ 1179 0 R 1180 0 R ] /P 1174 0 R /K 285 0 R >> endobj 1179 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1180 0 obj << /O /Layout /BlockAlign /Before >> endobj 1181 0 obj << /S /TD /A [ 1182 0 R 1183 0 R ] /P 1174 0 R /K 286 0 R >> endobj 1182 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1183 0 obj << /O /Layout /BlockAlign /Before >> endobj 1184 0 obj << /S /TD /A [ 1185 0 R 1186 0 R ] /P 1174 0 R /K 287 0 R >> endobj 1185 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1186 0 obj << /O /Layout /BlockAlign /Before >> endobj 1187 0 obj << /S /TD /A [ 1188 0 R 1189 0 R ] /P 1174 0 R /K 288 0 R >> endobj 1188 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1189 0 obj << /O /Layout /BlockAlign /Before >> endobj 1190 0 obj << /S /TD /A [ 1191 0 R 1192 0 R ] /P 1174 0 R /K 289 0 R >> endobj 1191 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1192 0 obj << /O /Layout /BlockAlign /Before >> endobj 1193 0 obj << /S /TR /P 1020 0 R /K [ 1194 0 R 1197 0 R ] >> endobj 1194 0 obj << /S /TD /A [ 1195 0 R 1196 0 R ] /P 1193 0 R /K 290 0 R >> endobj 1195 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1196 0 obj << /O /Layout /BlockAlign /Before >> endobj 1197 0 obj << /S /TD /A [ 1198 0 R 1199 0 R ] /P 1193 0 R /K 291 0 R >> endobj 1198 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1199 0 obj << /O /Layout /BlockAlign /Before >> endobj 1200 0 obj << /S /TR /P 1020 0 R /K [ 1201 0 R 1204 0 R 1207 0 R 1210 0 R 1213 0 R 1216 0 R ] >> endobj 1201 0 obj << /S /TD /A [ 1202 0 R 1203 0 R ] /P 1200 0 R /K 292 0 R >> endobj 1202 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1203 0 obj << /O /Layout /BlockAlign /Before >> endobj 1204 0 obj << /S /TD /A [ 1205 0 R 1206 0 R ] /P 1200 0 R /K 293 0 R >> endobj 1205 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 1206 0 obj << /O /Layout /BlockAlign /Before >> endobj 1207 0 obj << /S /TD /A [ 1208 0 R 1209 0 R ] /P 1200 0 R /K 294 0 R >> endobj 1208 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1209 0 obj << /O /Layout /BlockAlign /Before >> endobj 1210 0 obj << /S /TD /A [ 1211 0 R 1212 0 R ] /P 1200 0 R /K 295 0 R >> endobj 1211 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1212 0 obj << /O /Layout /BlockAlign /Before >> endobj 1213 0 obj << /S /TD /A [ 1214 0 R 1215 0 R ] /P 1200 0 R /K 296 0 R >> endobj 1214 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1215 0 obj << /O /Layout /BlockAlign /Before >> endobj 1216 0 obj << /S /TD /A [ 1217 0 R 1218 0 R ] /P 1200 0 R /K 297 0 R >> endobj 1217 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1218 0 obj << /O /Layout /BlockAlign /Before >> endobj 1219 0 obj << /S /TR /P 1020 0 R /K [ 1220 0 R 1223 0 R ] >> endobj 1220 0 obj << /S /TD /A [ 1221 0 R 1222 0 R ] /P 1219 0 R /K 298 0 R >> endobj 1221 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1222 0 obj << /O /Layout /BlockAlign /Before >> endobj 1223 0 obj << /S /TD /A [ 1224 0 R 1225 0 R ] /P 1219 0 R /K 299 0 R >> endobj 1224 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1225 0 obj << /O /Layout /BlockAlign /Before >> endobj 1226 0 obj << /S /TR /P 1020 0 R /K [ 1227 0 R 1230 0 R ] >> endobj 1227 0 obj << /S /TD /A [ 1228 0 R 1229 0 R ] /P 1226 0 R /K 300 0 R >> endobj 1228 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1229 0 obj << /O /Layout /BlockAlign /Before >> endobj 1230 0 obj << /S /TD /A [ 1231 0 R 1232 0 R ] /P 1226 0 R /K 301 0 R >> endobj 1231 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1232 0 obj << /O /Layout /BlockAlign /Before >> endobj 1233 0 obj << /S /TR /P 1020 0 R /K [ 1234 0 R 1237 0 R 1240 0 R 1243 0 R 1246 0 R 1249 0 R ] >> endobj 1234 0 obj << /S /TD /A [ 1235 0 R 1236 0 R ] /P 1233 0 R /K 302 0 R >> endobj 1235 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1236 0 obj << /O /Layout /BlockAlign /Before >> endobj 1237 0 obj << /S /TD /A [ 1238 0 R 1239 0 R ] /P 1233 0 R /K 303 0 R >> endobj 1238 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 1239 0 obj << /O /Layout /BlockAlign /Before >> endobj 1240 0 obj << /S /TD /A [ 1241 0 R 1242 0 R ] /P 1233 0 R /K 304 0 R >> endobj 1241 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1242 0 obj << /O /Layout /BlockAlign /Before >> endobj 1243 0 obj << /S /TD /A [ 1244 0 R 1245 0 R ] /P 1233 0 R /K 305 0 R >> endobj 1244 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1245 0 obj << /O /Layout /BlockAlign /Before >> endobj 1246 0 obj << /S /TD /A [ 1247 0 R 1248 0 R ] /P 1233 0 R /K 306 0 R >> endobj 1247 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1248 0 obj << /O /Layout /BlockAlign /Before >> endobj 1249 0 obj << /S /TD /A [ 1250 0 R 1251 0 R ] /P 1233 0 R /K 307 0 R >> endobj 1250 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1251 0 obj << /O /Layout /BlockAlign /Before >> endobj 1252 0 obj << /S /TR /P 1020 0 R /K [ 1253 0 R 1256 0 R ] >> endobj 1253 0 obj << /S /TD /A [ 1254 0 R 1255 0 R ] /P 1252 0 R /K 308 0 R >> endobj 1254 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1255 0 obj << /O /Layout /BlockAlign /Before >> endobj 1256 0 obj << /S /TD /A [ 1257 0 R 1258 0 R ] /P 1252 0 R /K 309 0 R >> endobj 1257 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1258 0 obj << /O /Layout /BlockAlign /Before >> endobj 1259 0 obj << /S /Table /P 464 0 R /K [ 1260 0 R 1285 0 R 1292 0 R 1311 0 R 1318 0 R 1343 0 R 1368 0 R ] /A [ 1584 0 R ] >> endobj 1260 0 obj << /S /TR /P 1259 0 R /K [ 1261 0 R 1264 0 R 1267 0 R 1270 0 R 1273 0 R 1276 0 R 1279 0 R 1282 0 R ] >> endobj 1261 0 obj << /S /TD /A [ 1262 0 R 1263 0 R ] /P 1260 0 R /K 316 0 R >> endobj 1262 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1263 0 obj << /O /Layout /BlockAlign /After >> endobj 1264 0 obj << /S /TD /A [ 1265 0 R 1266 0 R ] /P 1260 0 R /K 317 0 R >> endobj 1265 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1266 0 obj << /O /Layout /BlockAlign /After >> endobj 1267 0 obj << /S /TD /A [ 1268 0 R 1269 0 R ] /P 1260 0 R /K 318 0 R >> endobj 1268 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1269 0 obj << /O /Layout /BlockAlign /After >> endobj 1270 0 obj << /S /TD /A [ 1271 0 R 1272 0 R ] /P 1260 0 R /K 319 0 R >> endobj 1271 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1272 0 obj << /O /Layout /BlockAlign /After >> endobj 1273 0 obj << /S /TD /A [ 1274 0 R 1275 0 R ] /P 1260 0 R /K 320 0 R >> endobj 1274 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1275 0 obj << /O /Layout /BlockAlign /After >> endobj 1276 0 obj << /S /TD /A [ 1277 0 R 1278 0 R ] /P 1260 0 R /K 321 0 R >> endobj 1277 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1278 0 obj << /O /Layout /BlockAlign /After >> endobj 1279 0 obj << /S /TD /A [ 1280 0 R 1281 0 R ] /P 1260 0 R /K 322 0 R >> endobj 1280 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1281 0 obj << /O /Layout /BlockAlign /After >> endobj 1282 0 obj << /S /TD /A [ 1283 0 R 1284 0 R ] /P 1260 0 R /K 323 0 R >> endobj 1283 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1284 0 obj << /O /Layout /BlockAlign /After >> endobj 1285 0 obj << /S /TR /P 1259 0 R /K [ 1286 0 R 1289 0 R ] >> endobj 1286 0 obj << /S /TD /A [ 1287 0 R 1288 0 R ] /P 1285 0 R /K 324 0 R >> endobj 1287 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1288 0 obj << /O /Layout /BlockAlign /Before >> endobj 1289 0 obj << /S /TD /A [ 1290 0 R 1291 0 R ] /P 1285 0 R /K 325 0 R >> endobj 1290 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1291 0 obj << /O /Layout /BlockAlign /Before >> endobj 1292 0 obj << /S /TR /P 1259 0 R /K [ 1293 0 R 1296 0 R 1299 0 R 1302 0 R 1305 0 R 1308 0 R ] >> endobj 1293 0 obj << /S /TD /A [ 1294 0 R 1295 0 R ] /P 1292 0 R /K 326 0 R >> endobj 1294 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1295 0 obj << /O /Layout /BlockAlign /Before >> endobj 1296 0 obj << /S /TD /A [ 1297 0 R 1298 0 R ] /P 1292 0 R /K 327 0 R >> endobj 1297 0 obj << /O /Table /ColSpan 3 /RowSpan 1 >> endobj 1298 0 obj << /O /Layout /BlockAlign /Before >> endobj 1299 0 obj << /S /TD /A [ 1300 0 R 1301 0 R ] /P 1292 0 R /K 328 0 R >> endobj 1300 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1301 0 obj << /O /Layout /BlockAlign /Before >> endobj 1302 0 obj << /S /TD /A [ 1303 0 R 1304 0 R ] /P 1292 0 R /K 329 0 R >> endobj 1303 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1304 0 obj << /O /Layout /BlockAlign /Before >> endobj 1305 0 obj << /S /TD /A [ 1306 0 R 1307 0 R ] /P 1292 0 R /K 330 0 R >> endobj 1306 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1307 0 obj << /O /Layout /BlockAlign /Before >> endobj 1308 0 obj << /S /TD /A [ 1309 0 R 1310 0 R ] /P 1292 0 R /K 331 0 R >> endobj 1309 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1310 0 obj << /O /Layout /BlockAlign /Before >> endobj 1311 0 obj << /S /TR /P 1259 0 R /K [ 1312 0 R 1315 0 R ] >> endobj 1312 0 obj << /S /TD /A [ 1313 0 R 1314 0 R ] /P 1311 0 R /K 332 0 R >> endobj 1313 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1314 0 obj << /O /Layout /BlockAlign /Before >> endobj 1315 0 obj << /S /TD /A [ 1316 0 R 1317 0 R ] /P 1311 0 R /K 333 0 R >> endobj 1316 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1317 0 obj << /O /Layout /BlockAlign /Before >> endobj 1318 0 obj << /S /TR /P 1259 0 R /K [ 1319 0 R 1322 0 R 1325 0 R 1328 0 R 1331 0 R 1334 0 R 1337 0 R 1340 0 R ] >> endobj 1319 0 obj << /S /TD /A [ 1320 0 R 1321 0 R ] /P 1318 0 R /K 334 0 R >> endobj 1320 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1321 0 obj << /O /Layout /BlockAlign /After >> endobj 1322 0 obj << /S /TD /A [ 1323 0 R 1324 0 R ] /P 1318 0 R /K 335 0 R >> endobj 1323 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1324 0 obj << /O /Layout /BlockAlign /After >> endobj 1325 0 obj << /S /TD /A [ 1326 0 R 1327 0 R ] /P 1318 0 R /K 336 0 R >> endobj 1326 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1327 0 obj << /O /Layout /BlockAlign /After >> endobj 1328 0 obj << /S /TD /A [ 1329 0 R 1330 0 R ] /P 1318 0 R /K 337 0 R >> endobj 1329 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1330 0 obj << /O /Layout /BlockAlign /After >> endobj 1331 0 obj << /S /TD /A [ 1332 0 R 1333 0 R ] /P 1318 0 R /K 338 0 R >> endobj 1332 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1333 0 obj << /O /Layout /BlockAlign /After >> endobj 1334 0 obj << /S /TD /A [ 1335 0 R 1336 0 R ] /P 1318 0 R /K 339 0 R >> endobj 1335 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1336 0 obj << /O /Layout /BlockAlign /After >> endobj 1337 0 obj << /S /TD /A [ 1338 0 R 1339 0 R ] /P 1318 0 R /K 340 0 R >> endobj 1338 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1339 0 obj << /O /Layout /BlockAlign /After >> endobj 1340 0 obj << /S /TD /A [ 1341 0 R 1342 0 R ] /P 1318 0 R /K 341 0 R >> endobj 1341 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1342 0 obj << /O /Layout /BlockAlign /After >> endobj 1343 0 obj << /S /TR /P 1259 0 R /K [ 1344 0 R 1347 0 R 1350 0 R 1353 0 R 1356 0 R 1359 0 R 1362 0 R 1365 0 R ] >> endobj 1344 0 obj << /S /TD /A [ 1345 0 R 1346 0 R ] /P 1343 0 R /K 342 0 R >> endobj 1345 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1346 0 obj << /O /Layout /BlockAlign /Before >> endobj 1347 0 obj << /S /TD /A [ 1348 0 R 1349 0 R ] /P 1343 0 R /K 343 0 R >> endobj 1348 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1349 0 obj << /O /Layout /BlockAlign /Before >> endobj 1350 0 obj << /S /TD /A [ 1351 0 R 1352 0 R ] /P 1343 0 R /K 344 0 R >> endobj 1351 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1352 0 obj << /O /Layout /BlockAlign /Before >> endobj 1353 0 obj << /S /TD /A [ 1354 0 R 1355 0 R ] /P 1343 0 R /K 345 0 R >> endobj 1354 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1355 0 obj << /O /Layout /BlockAlign /Before >> endobj 1356 0 obj << /S /TD /A [ 1357 0 R 1358 0 R ] /P 1343 0 R /K 346 0 R >> endobj 1357 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1358 0 obj << /O /Layout /BlockAlign /Before >> endobj 1359 0 obj << /S /TD /A [ 1360 0 R 1361 0 R ] /P 1343 0 R /K 347 0 R >> endobj 1360 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1361 0 obj << /O /Layout /BlockAlign /Before >> endobj 1362 0 obj << /S /TD /A [ 1363 0 R 1364 0 R ] /P 1343 0 R /K 348 0 R >> endobj 1363 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1364 0 obj << /O /Layout /BlockAlign /Before >> endobj 1365 0 obj << /S /TD /A [ 1366 0 R 1367 0 R ] /P 1343 0 R /K 349 0 R >> endobj 1366 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1367 0 obj << /O /Layout /BlockAlign /Before >> endobj 1368 0 obj << /S /TR /P 1259 0 R /K [ 1369 0 R 1372 0 R 1375 0 R ] >> endobj 1369 0 obj << /S /TD /A [ 1370 0 R 1371 0 R ] /P 1368 0 R /K 350 0 R >> endobj 1370 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1371 0 obj << /O /Layout /BlockAlign /Before >> endobj 1372 0 obj << /S /TD /A [ 1373 0 R 1374 0 R ] /P 1368 0 R /K 351 0 R >> endobj 1373 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1374 0 obj << /O /Layout /BlockAlign /Before >> endobj 1375 0 obj << /S /TD /A [ 1376 0 R 1377 0 R ] /P 1368 0 R /K 352 0 R >> endobj 1376 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1377 0 obj << /O /Layout /BlockAlign /Before >> endobj 1378 0 obj << /S /Table /P 464 0 R /K [ 1379 0 R 1404 0 R 1429 0 R 1439 0 R 1464 0 R 1471 0 R 1487 0 R 1494 0 R 1519 0 R 1544 0 R ] /A [ 1585 0 R ] >> endobj 1379 0 obj << /S /TR /P 1378 0 R /K [ 1380 0 R 1383 0 R 1386 0 R 1389 0 R 1392 0 R 1395 0 R 1398 0 R 1401 0 R ] >> endobj 1380 0 obj << /S /TD /A [ 1381 0 R 1382 0 R ] /P 1379 0 R /K 368 0 R >> endobj 1381 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1382 0 obj << /O /Layout /BlockAlign /After >> endobj 1383 0 obj << /S /TD /A [ 1384 0 R 1385 0 R ] /P 1379 0 R /K 369 0 R >> endobj 1384 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1385 0 obj << /O /Layout /BlockAlign /After >> endobj 1386 0 obj << /S /TD /A [ 1387 0 R 1388 0 R ] /P 1379 0 R /K 370 0 R >> endobj 1387 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1388 0 obj << /O /Layout /BlockAlign /After >> endobj 1389 0 obj << /S /TD /A [ 1390 0 R 1391 0 R ] /P 1379 0 R /K 371 0 R >> endobj 1390 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1391 0 obj << /O /Layout /BlockAlign /After >> endobj 1392 0 obj << /S /TD /A [ 1393 0 R 1394 0 R ] /P 1379 0 R /K 372 0 R >> endobj 1393 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1394 0 obj << /O /Layout /BlockAlign /After >> endobj 1395 0 obj << /S /TD /A [ 1396 0 R 1397 0 R ] /P 1379 0 R /K 373 0 R >> endobj 1396 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1397 0 obj << /O /Layout /BlockAlign /After >> endobj 1398 0 obj << /S /TD /A [ 1399 0 R 1400 0 R ] /P 1379 0 R /K 374 0 R >> endobj 1399 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1400 0 obj << /O /Layout /BlockAlign /After >> endobj 1401 0 obj << /S /TD /A [ 1402 0 R 1403 0 R ] /P 1379 0 R /K 375 0 R >> endobj 1402 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1403 0 obj << /O /Layout /BlockAlign /After >> endobj 1404 0 obj << /S /TR /P 1378 0 R /K [ 1405 0 R 1408 0 R 1411 0 R 1414 0 R 1417 0 R 1420 0 R 1423 0 R 1426 0 R ] >> endobj 1405 0 obj << /S /TD /A [ 1406 0 R 1407 0 R ] /P 1404 0 R /K 376 0 R >> endobj 1406 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1407 0 obj << /O /Layout /BlockAlign /Before >> endobj 1408 0 obj << /S /TD /A [ 1409 0 R 1410 0 R ] /P 1404 0 R /K 377 0 R >> endobj 1409 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1410 0 obj << /O /Layout /BlockAlign /Before >> endobj 1411 0 obj << /S /TD /A [ 1412 0 R 1413 0 R ] /P 1404 0 R /K 378 0 R >> endobj 1412 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1413 0 obj << /O /Layout /BlockAlign /Before >> endobj 1414 0 obj << /S /TD /A [ 1415 0 R 1416 0 R ] /P 1404 0 R /K 379 0 R >> endobj 1415 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1416 0 obj << /O /Layout /BlockAlign /Before >> endobj 1417 0 obj << /S /TD /A [ 1418 0 R 1419 0 R ] /P 1404 0 R /K 380 0 R >> endobj 1418 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1419 0 obj << /O /Layout /BlockAlign /Before >> endobj 1420 0 obj << /S /TD /A [ 1421 0 R 1422 0 R ] /P 1404 0 R /K 381 0 R >> endobj 1421 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1422 0 obj << /O /Layout /BlockAlign /Before >> endobj 1423 0 obj << /S /TD /A [ 1424 0 R 1425 0 R ] /P 1404 0 R /K 382 0 R >> endobj 1424 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1425 0 obj << /O /Layout /BlockAlign /Before >> endobj 1426 0 obj << /S /TD /A [ 1427 0 R 1428 0 R ] /P 1404 0 R /K 383 0 R >> endobj 1427 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1428 0 obj << /O /Layout /BlockAlign /Before >> endobj 1429 0 obj << /S /TR /P 1378 0 R /K [ 1430 0 R 1433 0 R 1436 0 R ] >> endobj 1430 0 obj << /S /TD /A [ 1431 0 R 1432 0 R ] /P 1429 0 R /K 384 0 R >> endobj 1431 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1432 0 obj << /O /Layout /BlockAlign /Before >> endobj 1433 0 obj << /S /TD /A [ 1434 0 R 1435 0 R ] /P 1429 0 R /K 385 0 R >> endobj 1434 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1435 0 obj << /O /Layout /BlockAlign /Before >> endobj 1436 0 obj << /S /TD /A [ 1437 0 R 1438 0 R ] /P 1429 0 R /K 386 0 R >> endobj 1437 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1438 0 obj << /O /Layout /BlockAlign /Before >> endobj 1439 0 obj << /S /TR /P 1378 0 R /K [ 1440 0 R 1443 0 R 1446 0 R 1449 0 R 1452 0 R 1455 0 R 1458 0 R 1461 0 R ] >> endobj 1440 0 obj << /S /TD /A [ 1441 0 R 1442 0 R ] /P 1439 0 R /K 387 0 R >> endobj 1441 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1442 0 obj << /O /Layout /BlockAlign /After >> endobj 1443 0 obj << /S /TD /A [ 1444 0 R 1445 0 R ] /P 1439 0 R /K 388 0 R >> endobj 1444 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1445 0 obj << /O /Layout /BlockAlign /After >> endobj 1446 0 obj << /S /TD /A [ 1447 0 R 1448 0 R ] /P 1439 0 R /K 389 0 R >> endobj 1447 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1448 0 obj << /O /Layout /BlockAlign /After >> endobj 1449 0 obj << /S /TD /A [ 1450 0 R 1451 0 R ] /P 1439 0 R /K 390 0 R >> endobj 1450 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1451 0 obj << /O /Layout /BlockAlign /After >> endobj 1452 0 obj << /S /TD /A [ 1453 0 R 1454 0 R ] /P 1439 0 R /K 391 0 R >> endobj 1453 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1454 0 obj << /O /Layout /BlockAlign /After >> endobj 1455 0 obj << /S /TD /A [ 1456 0 R 1457 0 R ] /P 1439 0 R /K 392 0 R >> endobj 1456 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1457 0 obj << /O /Layout /BlockAlign /After >> endobj 1458 0 obj << /S /TD /A [ 1459 0 R 1460 0 R ] /P 1439 0 R /K 393 0 R >> endobj 1459 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1460 0 obj << /O /Layout /BlockAlign /After >> endobj 1461 0 obj << /S /TD /A [ 1462 0 R 1463 0 R ] /P 1439 0 R /K 394 0 R >> endobj 1462 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1463 0 obj << /O /Layout /BlockAlign /After >> endobj 1464 0 obj << /S /TR /P 1378 0 R /K [ 1465 0 R 1468 0 R ] >> endobj 1465 0 obj << /S /TD /A [ 1466 0 R 1467 0 R ] /P 1464 0 R /K 395 0 R >> endobj 1466 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1467 0 obj << /O /Layout /BlockAlign /Before >> endobj 1468 0 obj << /S /TD /A [ 1469 0 R 1470 0 R ] /P 1464 0 R /K 396 0 R >> endobj 1469 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1470 0 obj << /O /Layout /BlockAlign /Before >> endobj 1471 0 obj << /S /TR /P 1378 0 R /K [ 1472 0 R 1475 0 R 1478 0 R 1481 0 R 1484 0 R ] >> endobj 1472 0 obj << /S /TD /A [ 1473 0 R 1474 0 R ] /P 1471 0 R /K 397 0 R >> endobj 1473 0 obj << /O /Table /ColSpan 4 /RowSpan 1 >> endobj 1474 0 obj << /O /Layout /BlockAlign /Before >> endobj 1475 0 obj << /S /TD /A [ 1476 0 R 1477 0 R ] /P 1471 0 R /K 398 0 R >> endobj 1476 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1477 0 obj << /O /Layout /BlockAlign /Before >> endobj 1478 0 obj << /S /TD /A [ 1479 0 R 1480 0 R ] /P 1471 0 R /K 399 0 R >> endobj 1479 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1480 0 obj << /O /Layout /BlockAlign /Before >> endobj 1481 0 obj << /S /TD /A [ 1482 0 R 1483 0 R ] /P 1471 0 R /K 400 0 R >> endobj 1482 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1483 0 obj << /O /Layout /BlockAlign /Before >> endobj 1484 0 obj << /S /TD /A [ 1485 0 R 1486 0 R ] /P 1471 0 R /K 401 0 R >> endobj 1485 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1486 0 obj << /O /Layout /BlockAlign /Before >> endobj 1487 0 obj << /S /TR /P 1378 0 R /K [ 1488 0 R 1491 0 R ] >> endobj 1488 0 obj << /S /TD /A [ 1489 0 R 1490 0 R ] /P 1487 0 R /K 402 0 R >> endobj 1489 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1490 0 obj << /O /Layout /BlockAlign /Before >> endobj 1491 0 obj << /S /TD /A [ 1492 0 R 1493 0 R ] /P 1487 0 R /K 403 0 R >> endobj 1492 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1493 0 obj << /O /Layout /BlockAlign /Before >> endobj 1494 0 obj << /S /TR /P 1378 0 R /K [ 1495 0 R 1498 0 R 1501 0 R 1504 0 R 1507 0 R 1510 0 R 1513 0 R 1516 0 R ] >> endobj 1495 0 obj << /S /TD /A [ 1496 0 R 1497 0 R ] /P 1494 0 R /K 404 0 R >> endobj 1496 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1497 0 obj << /O /Layout /BlockAlign /After >> endobj 1498 0 obj << /S /TD /A [ 1499 0 R 1500 0 R ] /P 1494 0 R /K 405 0 R >> endobj 1499 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1500 0 obj << /O /Layout /BlockAlign /After >> endobj 1501 0 obj << /S /TD /A [ 1502 0 R 1503 0 R ] /P 1494 0 R /K 406 0 R >> endobj 1502 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1503 0 obj << /O /Layout /BlockAlign /After >> endobj 1504 0 obj << /S /TD /A [ 1505 0 R 1506 0 R ] /P 1494 0 R /K 407 0 R >> endobj 1505 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1506 0 obj << /O /Layout /BlockAlign /After >> endobj 1507 0 obj << /S /TD /A [ 1508 0 R 1509 0 R ] /P 1494 0 R /K 408 0 R >> endobj 1508 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1509 0 obj << /O /Layout /BlockAlign /After >> endobj 1510 0 obj << /S /TD /A [ 1511 0 R 1512 0 R ] /P 1494 0 R /K 409 0 R >> endobj 1511 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1512 0 obj << /O /Layout /BlockAlign /After >> endobj 1513 0 obj << /S /TD /A [ 1514 0 R 1515 0 R ] /P 1494 0 R /K 410 0 R >> endobj 1514 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1515 0 obj << /O /Layout /BlockAlign /After >> endobj 1516 0 obj << /S /TD /A [ 1517 0 R 1518 0 R ] /P 1494 0 R /K 411 0 R >> endobj 1517 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1518 0 obj << /O /Layout /BlockAlign /After >> endobj 1519 0 obj << /S /TR /P 1378 0 R /K [ 1520 0 R 1523 0 R 1526 0 R 1529 0 R 1532 0 R 1535 0 R 1538 0 R 1541 0 R ] >> endobj 1520 0 obj << /S /TD /A [ 1521 0 R 1522 0 R ] /P 1519 0 R /K 412 0 R >> endobj 1521 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1522 0 obj << /O /Layout /BlockAlign /Before >> endobj 1523 0 obj << /S /TD /A [ 1524 0 R 1525 0 R ] /P 1519 0 R /K 413 0 R >> endobj 1524 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1525 0 obj << /O /Layout /BlockAlign /Before >> endobj 1526 0 obj << /S /TD /A [ 1527 0 R 1528 0 R ] /P 1519 0 R /K 414 0 R >> endobj 1527 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1528 0 obj << /O /Layout /BlockAlign /Before >> endobj 1529 0 obj << /S /TD /A [ 1530 0 R 1531 0 R ] /P 1519 0 R /K 415 0 R >> endobj 1530 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1531 0 obj << /O /Layout /BlockAlign /Before >> endobj 1532 0 obj << /S /TD /A [ 1533 0 R 1534 0 R ] /P 1519 0 R /K 416 0 R >> endobj 1533 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1534 0 obj << /O /Layout /BlockAlign /Before >> endobj 1535 0 obj << /S /TD /A [ 1536 0 R 1537 0 R ] /P 1519 0 R /K 417 0 R >> endobj 1536 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1537 0 obj << /O /Layout /BlockAlign /Before >> endobj 1538 0 obj << /S /TD /A [ 1539 0 R 1540 0 R ] /P 1519 0 R /K 418 0 R >> endobj 1539 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1540 0 obj << /O /Layout /BlockAlign /Before >> endobj 1541 0 obj << /S /TD /A [ 1542 0 R 1543 0 R ] /P 1519 0 R /K 419 0 R >> endobj 1542 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1543 0 obj << /O /Layout /BlockAlign /Before >> endobj 1544 0 obj << /S /TR /P 1378 0 R /K [ 1545 0 R 1548 0 R 1551 0 R ] >> endobj 1545 0 obj << /S /TD /A [ 1546 0 R 1547 0 R ] /P 1544 0 R /K 420 0 R >> endobj 1546 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1547 0 obj << /O /Layout /BlockAlign /Before >> endobj 1548 0 obj << /S /TD /A [ 1549 0 R 1550 0 R ] /P 1544 0 R /K 421 0 R >> endobj 1549 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1550 0 obj << /O /Layout /BlockAlign /Before >> endobj 1551 0 obj << /S /TD /A [ 1552 0 R 1553 0 R ] /P 1544 0 R /K 422 0 R >> endobj 1552 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1553 0 obj << /O /Layout /BlockAlign /Before >> endobj 1554 0 obj << /S /Table /P 464 0 R /K [ 1555 0 R 1559 0 R ] /A [ 1586 0 R ] >> endobj 1555 0 obj << /S /TR /K 1556 0 R /P 1554 0 R >> endobj 1556 0 obj << /S /TD /A [ 1557 0 R 1558 0 R ] /P 1555 0 R /K [ 451 0 R 454 0 R 457 0 R 459 0 R ] >> endobj 1557 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1558 0 obj << /O /Layout /BlockAlign /Before >> endobj 1559 0 obj << /S /TR /K 1560 0 R /P 1554 0 R >> endobj 1560 0 obj << /S /TD /A [ 1561 0 R 1562 0 R ] /P 1559 0 R /K 460 0 R >> endobj 1561 0 obj << /O /Table /ColSpan 1 /RowSpan 1 >> endobj 1562 0 obj << /O /Layout /BlockAlign /Before >> endobj 1563 0 obj << /S /L /P 464 0 R /K [ 1564 0 R 1565 0 R ] >> endobj 1564 0 obj << /S /LI /P 1563 0 R /K 50 0 R >> endobj 1565 0 obj << /S /LI /P 1563 0 R /K 51 0 R >> endobj 1566 0 obj << /S /L /P 464 0 R /K [ 1567 0 R 1568 0 R 1569 0 R 1570 0 R ] >> endobj 1567 0 obj << /S /LI /P 1566 0 R /K 441 0 R >> endobj 1568 0 obj << /S /LI /P 1566 0 R /K 442 0 R >> endobj 1569 0 obj << /S /LI /P 1566 0 R /K 443 0 R >> endobj 1570 0 obj << /S /LI /P 1566 0 R /K 444 0 R >> endobj 1571 0 obj << /Nums [ 0 1572 0 R 1 1574 0 R 2 1575 0 R 3 1576 0 R 4 1577 0 R 5 1578 0 R ] >> endobj 1572 0 obj [ 35 0 R 39 0 R 40 0 R 42 0 R 44 0 R 42 0 R 46 0 R 47 0 R 49 0 R 50 0 R 51 0 R 53 0 R 54 0 R 55 0 R 56 0 R ] endobj 1573 0 obj << /O /Layout /BaselineShift 5 >> endobj 1574 0 obj [ 57 0 R 58 0 R 59 0 R 60 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 71 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 111 0 R 119 0 R 120 0 R 121 0 R 114 0 R 115 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 140 0 R 149 0 R 150 0 R 151 0 R 144 0 R 145 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 180 0 R 188 0 R 189 0 R 190 0 R 183 0 R 184 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 209 0 R 218 0 R 219 0 R 220 0 R 213 0 R 214 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R ] endobj 1575 0 obj [ 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 276 0 R 285 0 R 286 0 R 287 0 R 280 0 R 281 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 326 0 R 324 0 R 327 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 326 0 R 332 0 R 327 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 342 0 R 350 0 R 344 0 R 351 0 R 346 0 R 352 0 R 348 0 R 349 0 R 353 0 R 354 0 R ] endobj 1576 0 obj [ 355 0 R 356 0 R 358 0 R 359 0 R 360 0 R 362 0 R 363 0 R 364 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 376 0 R 384 0 R 378 0 R 385 0 R 380 0 R 386 0 R 382 0 R 383 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 412 0 R 420 0 R 414 0 R 421 0 R 416 0 R 422 0 R 418 0 R 419 0 R 423 0 R 424 0 R 425 0 R 427 0 R 429 0 R 431 0 R 431 0 R 433 0 R ] endobj 1577 0 obj [ 435 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R ] endobj 1578 0 obj [ 449 0 R 450 0 R 451 0 R 454 0 R 457 0 R 459 0 R 460 0 R 462 0 R 460 0 R ] endobj 1579 0 obj << /O /Layout /BBox [ 260 463 354 536 ] /Placement /Inline >> endobj 1580 0 obj << /O /Layout /BBox [ 79.8 594.83215 533.99921 663.62695 ] /Placement /Block /StartIndent 7.8 /EndIndent 6.00079 >> endobj 1581 0 obj << /O /Layout /BBox [ 79.8 373.79214 590.81828 496.88695 ] /Placement /Block /StartIndent 7.8 /EndIndent -50.81828 >> endobj 1582 0 obj << /O /Layout /BBox [ 79.8 140.15225 590.81828 263.24706 ] /Placement /Block /StartIndent 7.8 /EndIndent -50.81828 >> endobj 1583 0 obj << /O /Layout /BBox [ 79.8 606.59215 590.81828 729.68695 ] /Placement /Block /StartIndent 7.8 /EndIndent -50.81828 >> endobj 1584 0 obj << /O /Layout /BBox [ 73.2 158.75215 537.90001 223.28696 ] /Placement /Block /StartIndent 1.2 /EndIndent 2.09999 >> endobj 1585 0 obj << /O /Layout /BBox [ 83.39999 377.21216 537.89989 477.26695 ] /Placement /Block /StartIndent 11.39999 /EndIndent 2.10011 >> endobj 1586 0 obj << /O /Layout /BBox [ 257.7597 460.42923 372.94318 679.00188 ] /Placement /Block /StartIndent 185.7597 /EndIndent 167.05682 >> endobj 1587 0 obj << /S /D >> endobj 1588 0 obj << /Nums [ 0 1587 0 R ] >> endobj 1589 0 obj << /Producer (Acrobat Distiller 5.0 \(Windows\)) /Creator (Acrobat PDFMaker 5.0 for Word) /ModDate (D:20040412103007-08'00') /Title (Application Note / White Paper Style Guide) /CreationDate (D:20040412102813-08'00') >> endobj 1591 0 obj << /Type /Pages /Kids [ 1595 0 R 1 0 R 9 0 R 12 0 R 18 0 R 21 0 R ] /Count 6 >> endobj 1593 0 obj << /Type /Catalog /Pages 1591 0 R /Metadata 1639 0 R /Outlines 24 0 R /OpenAction [ 1595 0 R /XYZ null null null ] /PageMode /UseNone /PageLabels 1588 0 R /StructTreeRoot 1594 0 R /PieceInfo << /MarkedPDF << /LastModified (D:20040412102826)>> >> /LastModified (D:20040412102826) /MarkInfo << /Marked true /LetterspaceFlags 0 >> >> endobj 1594 0 obj << /Type /StructTreeRoot /ClassMap 37 0 R /RoleMap 36 0 R /K 464 0 R /ParentTree 1571 0 R /ParentTreeNextKey 6 >> endobj 1595 0 obj << /Type /Page /Parent 1591 0 R /Resources << /ColorSpace << /CS2 1605 0 R /CS3 1604 0 R >> /XObject << /Im1 1622 0 R >> /ExtGState << /GS3 1626 0 R /GS4 1628 0 R >> /Font << /TT4 1601 0 R /TT5 1599 0 R /TT6 1597 0 R /TT7 1603 0 R /C2_1 1611 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> /Contents [ 1607 0 R 1609 0 R 1613 0 R 1615 0 R 1617 0 R 1619 0 R 1621 0 R 1624 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 /StructParents 0 >> endobj 1596 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 718 /Descent -211 /Flags 96 /FontBBox [ -517 -325 1082 998 ] /FontName /ECMIDH+Arial,Italic /ItalicAngle -15 /StemV 93.856 /XHeight 515 /FontFile2 1630 0 R >> endobj 1597 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 120 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 278 556 556 556 0 556 556 0 0 0 0 0 0 0 0 0 0 0 667 667 722 722 667 0 0 722 278 0 0 0 833 722 778 667 778 722 667 611 722 0 0 0 667 0 0 0 0 0 0 0 0 0 500 556 556 0 0 0 222 0 0 222 0 556 556 0 0 0 0 278 556 500 0 500 ] /Encoding /WinAnsiEncoding /BaseFont /ECMIDH+Arial,Italic /FontDescriptor 1596 0 R >> endobj 1598 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 98 /FontBBox [ -498 -307 1120 1023 ] /FontName /ECMIJG+TimesNewRoman,Italic /ItalicAngle -15 /StemV 83.31799 /XHeight 0 /FontFile2 1632 0 R >> endobj 1599 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 169 /Widths [ 278 0 0 0 0 0 0 0 333 333 0 584 278 333 278 278 556 556 556 556 556 556 556 0 556 556 278 278 0 584 0 0 1015 667 667 722 722 667 611 778 722 278 500 0 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 737 ] /Encoding /WinAnsiEncoding /BaseFont /ECMIDF+Arial /FontDescriptor 1602 0 R >> endobj 1600 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 656 /Descent -216 /Flags 34 /FontBBox [ -568 -307 2028 1007 ] /FontName /ECMHLG+TimesNewRoman /ItalicAngle 0 /StemV 94 /XHeight 0 /FontFile2 1629 0 R >> endobj 1601 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 174 /Widths [ 250 0 0 0 500 0 0 0 333 333 0 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 564 564 0 0 722 667 667 722 611 556 0 722 333 0 0 611 889 722 722 556 722 667 556 611 722 0 944 722 722 611 333 0 333 469 0 0 444 500 444 500 444 333 500 500 278 0 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 333 444 444 0 0 0 0 980 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 760 ] /Encoding /WinAnsiEncoding /BaseFont /ECMHLG+TimesNewRoman /FontDescriptor 1600 0 R >> endobj 1602 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 718 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2028 1006 ] /FontName /ECMIDF+Arial /ItalicAngle 0 /StemV 94 /XHeight 515 /FontFile2 1625 0 R >> endobj 1603 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 250 0 500 500 500 500 500 500 500 500 500 500 0 0 0 0 0 0 0 0 611 0 0 611 611 722 0 333 0 0 0 833 0 0 611 722 0 500 556 0 0 0 0 0 0 389 0 389 0 0 0 500 500 444 500 444 278 500 500 278 0 444 278 0 500 500 500 0 389 389 278 500 0 0 444 444 ] /Encoding /WinAnsiEncoding /BaseFont /ECMIJG+TimesNewRoman,Italic /FontDescriptor 1598 0 R >> endobj 1604 0 obj /DeviceGray endobj 1605 0 obj [ /ICCBased 1634 0 R ] endobj 1606 0 obj 744 endobj 1607 0 obj << /Filter /FlateDecode /Length 1606 0 R >> stream H‰”UMo›@˝ó+ćŘźě7KEŠ(Ę!•sKr €c*(Ióď; ŘY,r¨|`…ç͛yofńŻę6ßĆI ~ôQeŕŻăןˆŰź,ŔżjŰ8Ůe)<úQYÁłż\–á1ࠃĄ0mˆ’( ϗ—Ëë•÷Ç …}Eńp" Řxƒď8$Ďż;0¸.˝_žżÚŕ›Ś¤MRx rđü‡lźeŤr_Öů!kë<:÷üۍ€×Ć[FžED[ńŽŚ•劢ƒ÷ žGż˝›Čťš_yţÚöxżşťĆčĄRJ¨M‚0 RŤ!5ţO)žXŘ#˝3Ÿ&51´ä$ř"Ëç(…"pCĘ.Ů­ăîŠ6ŤQůźx…Ű.O3˜bJjşŘŤ4͊´;üčcŠ-Ě%3İűçœPnëFČ}ˇoójŸ-–]ۢĽ›ŽŞĘş…Í›„2LÁU–äŰ<é‡ÁĆŁ2zTfŞ„T‚0Ş)ü őŮQýOŰŐÇÜ˝ÖTŘî쉫žëä2‚`—ĘÔ§çYű?A1ś@ĺrěفŤ/řů¸Ď†2ú vl¸?Ą' ý岯íŹË´KÚźö,–ńhځfĚ×'žŇG:S){ó鉆Kš ęGťa¤8 ńŁŽ”÷]Ľ1 üĚłů(âŞÍ“žŻłčžŻP'źč4âłôMHÉH1‡—ˆŃ“ÔîÂĚA¸ ŃJ!îŐ¨+^pŇ ˜Ó€ă2p†NHł&Šó—ʁ9fA‘™k°+ߥ-Ą×­}/PÖ°-ťzń2Ź˘Ői.™D…Ę\z+çlŘ{[xxjAÍľ`' "帊‡9"C‰Ô\L#qˆ÷YC Úĺ Äă…3o$ŢK ¸#”•`Ö&eg´Ç)k`˝ńšť›*.Nť!Çݘ.ÄiGź|†ďŽ=ŕ¨!!r¸@Ÿ¸Ň˜űŸŹJž endstream endobj 1608 0 obj 609 endobj 1609 0 obj << /Filter /FlateDecode /Length 1608 0 R >> stream H‰Œ”ËnŰ0E÷úŠYś‹0|?Š ‹<Y¤Pý€#É5 GR)*i˙ž#š1D†‹ $;çޡşŻŤűÇŰęň ŽŽ.oî@ÁőőÍÝmuSW—u-A˝Ż(ĄoXn¨„ú %Îſӝŕœh Š "ĺżT_ žÖżŞ¨0DsjRxnOťŠÉaœĽ‚1 íÜÄ Śy,Š$ˇD3ç2Ő"ĚE^I˘ŒČŽUśÖ„*{Ü8@çÖemv–Cu‚0jłcDčţİ+ƃéĐĽ? żKů*xžcú‰ŔC,iÓD9+SŒĄc’R9žÂĂŤoť |żÂKQfąLg5vŃ=ŕ§$áX‰;™UЇŠYqéˆÓŇdŠ(v×rĽS4´oťĐÁŞX‡\œ§œ•Śœcs¨p™KßÂ4ěăjŐ`č˜KXsz÷ĽęěëJž’1B•Ëzť Ţşăqšúňr"ľvŠŹŘ iđÂóŽÇ2눒yăşň`K<ŃŸ9ăxq"síăi"Î-X“*…dqř:Kg łK˘(÷ýnżÎúâńqĽédĽŠÓJťHۍď2Vtk5‡őNŮťů>ÄîŰâ}ţ?_âj AHš˜š-P§:X•8ŕ”˙řŰďĆč›)qăT ,Řnƒíř B—°RĽdrţßł ƒë ‹'LמÇđ2َ°ŔđŠĆąÝŔÇîbA.Ţú†l›Ąŕř›ÜŞN+ ×ubŻ Ú žÇuI'”Ľ„af[ _ Ü?Mđ[Pâ^cÜ$š>ăł-Đ?=t‹6 endstream endobj 1610 0 obj << /Filter /FlateDecode /Length 235 >> stream H‰TPąnĂ ÝůŠ€\ŞŚ•,–tń´ŞÝîÎ.R ăÁ_ V˘€Ţť{wǏíkëlţ˝î(Á`‰4ű%j‚ ÖÁÁX6To=Š<‹ťuN4ľnđĐ4Œäâœâ w}˙ň ECŃş13řů•™n á‡&r H †Ə'Îj"ŕUx#ű5`ĹťíoohJSTn$h„{YžĂłrćí˙T—AŤČnÝ(dAxČQ> endobj 1612 0 obj 656 endobj 1613 0 obj << /Filter /FlateDecode /Length 1612 0 R >> stream H‰„UËnŰ0źë+öŘ͡H Đ8šCŃ¨’lŠu(A”ôďťRěDhžĐćĚîěÎ.X řą …":U¤ć$5˝&ßÜ÷ěwň ”¤Lč%†şń໪höM‘M@°–0kř’Đ:ć>Kîw ٚ(iJ´žŔ%Ň@_%űó’ÄŹŻśĎp}˝}Ü=ÜA 77ˇwť„ŞĹ”˜¤6đ…Knłd›e dűéž2<ˆÉށ bÍŹó㔢J.—łĘŸy_žç}Eëü\ÓĎ´%\˝d•U@Ʋ…Ts–:ÇYH”_Š%N'5뤟yéY'•„~dĚę 2Fńۏ—‡´ýŔ_fÁ+"3)z ŒގEýœ—đ#pĄ‰ą,$”ăąÚ@ă üšn¨LZ (¨"‚‡‚ü€‚šB1"(ţ5š_HN,Ĺi[ćwĐĺşü€ÚëÜ“đ°}‚ŽqžŔÓ>FN¸ŕAŠšC ďíěđŮĽ“_ö‚_Â2" esŒs^˜ŚkôU űś˙X Ż– endstream endobj 1614 0 obj 560 endobj 1615 0 obj << /Filter /FlateDecode /Length 1614 0 R >> stream H‰ŒTËnŰ0źë+öč.Í÷Ł0|ˆ“CZ˛EÇ*ɰč$Ÿ_Jnݐ]Ă/<ĚĚÎîYLvU 7ĺςJ‡rÍĆŰ0JœĎéf8­ ăTAůRL^b˛”HÍEŠěj˙<…°ó˝‡}Óö°ŠZX{¨L‚9F˜Ô:Őxmj_Cӌš#N˛ŒŇĄPĄ˘C–9„đ†‚Ľ‹V”ÍtaÓľŰć eXET ?ŞĐtm˙yœô}YÜŻ–ĹěćóŮjůĺ,ˇwËâś,fKţƒƒr[|áƕ`۰ącçb)Љś§RsJ,ąˆ…fe)OR”†›Âä5ƒ^"7ů~Üďť:q&91–É”w|đÖÇĐá3ljľ*cĹ@T=ôĄjëęPĂăäŤß†)ʚş~öÓżů”‡!8'ĚŮĚ~Ô̅”Ř!ä ú[ó´ 7S¸Hs‚P3ň?Ў8Ô%ó { *Š$T哇ĐÁśyőŕ߃GiJÁ”Č&9ź‘5jIĆW%ĽÍqOmO0źb1ȖŠĚaFŻeotĂ áňj|;ÇW\ŽŻľ‰ŢŐü:™žÝ=Ӓ[IŕcÎŃôžC4šgó 3ϝŠť´&˙“G4_<ţ/ÚfvbQ,á&ĂÖpÜ:[ńÓKńčsÚ+$ËlôÍ{ĚíĹwńĎƒ˙Ű€’ŇŁô˙’JÄVufJüՉŠę/莢 endstream endobj 1616 0 obj 593 endobj 1617 0 obj << /Filter /FlateDecode /Length 1616 0 R >> stream H‰Œ•ťnÜ0E{}Ŕ6pů~† ?  DĽíŠk)X‹‚De?ĂM° :Ô°83Ù{‡jnÖŰögĂ(q(~NRsâœT ¸!\RígsC ąĎmóüúŘěŢŕîn÷úřňŒÁýýĂÓcóĐ6ťś•Ŕ =6”PJ-´¸œ4´g(ë†eŹA-Q–˛K™—#ÄÁĂۏ‡šŤ] N˜¤2[×ďqXÂö1Ŕç|ÓÄhV °ßb ÓJ °ď˜4füŞ6˙—ÚÜ)âřß\}8lŐśeÄ*ÇrÜOzż–qďWÂů2şŹ–‚3I¨1EŠ/PG”Ó6Ga_eq),3:gˇ**ˆĹáUa)‘);Fş öí9‡ĺ:lvś¨ [0łeeßĂűMwŠC¨ŢW(‡b*ÂJŮâ֝ŞÖ– §x1žŠŽŹ† §xďýhŚŢĎ~ę“ĚŐ),„ö*f?UQ.ˆâź(ƒTa!‰ĽFnŤ6{őą„ëäuD‡néĎé!9„é8~lKÇ0˝ßâŽTÝí(ąZIŞ-3§‰°Fĺ(ÇŠ‡X÷'>2IŸ]°Ž˘nÚĺäUé/ôăV&Sł<*éŽ˙ý†ż˜ËzgIś/vCE”2EO¸ë6×ßZ\<%ŠĄáţ¤ H[ý[€Ę; endstream endobj 1618 0 obj 609 endobj 1619 0 obj << /Filter /FlateDecode /Length 1618 0 R >> stream H‰ŒUÉnŰ0źë+ŢąRšű˛r4úY˘aľŽ˜jąŃżďٜŸĐA„=oޛá*%ÎĹç¸ÎCnášr(_Šoż—żŠ%TRE872…BŻY4g„şo•G*â”K‘ýŘÖÓŽęĄ S˝}ŞxÉŐ*ډ°6­ ß]@„SB)uPÖ0Ż”XRFœł8¨ĄDkޏíýĆ÷0ˇžúĐLőĎŻžn7mnćašŠ”ĽŽĆ6t° HľÍjçí7ÜŚucŞ8ąBńšˇ…kI¨2.ĹF_>mąśčœ-Ü*bŘŇT2 ~vĺĎäűÖĐřĄîŰľo íđ ő”K"•V¤œžËę•5H.S0ÉC5ą”/fĽŢ—Ĺýămąz‚ËËŐăíĂ0WW7wˇŃ-" 1˜Sꎸ)‹UY*`Pnf—Œ.ýˆK)g›ÄGëyep?„A&ĘćŚĎa3O¸€9Ü;%Ř1‹ÔÄ(ÍRäĄę=ÔĄÚ\ ӂhFMZÓř~Žßđ•â݇™ęDżüÔ.%Q>3Äżţ<­ŮCžœ;-iüž­=lŤĆCř"ÍTTĽOë0Ë„ „×7™đÓďŞ÷t÷mž›çćÔâľG“éÇvďłs ncí)8;¨š(ŞřbP¨şŽ×CŘMcžƒÄk ł+ÎvŔó@ŒˆIO:xčfý_jÎDĎwPh6ž‹ĽŮ˙}qÄHÄ/…Śňh+ŢďąČŚBpLźciźcíˇŐˇz×ţFłŇ80? §QÜ?ÉŽí endstream endobj 1620 0 obj 571 endobj 1621 0 obj << /Filter /FlateDecode /Length 1620 0 R >> stream H‰t”ťnŰ@E{~ŔI‘ńž€a –]¤0‚@jФ#&2)ŤÎ×g¨DBv=›-îîÜ=3•úţž”čD „E儁úĽú0—šąƒţĺcýŁzcŠ­ô…iH pj-zBŽÖŸV­@!¤‚ş…ő$čt‚7~é1řhs˙–ý•ҨuŒšô•—Œ*ŚMűł§FŇŽIЏíÔőtŚ0Ř Œ ¨„6ezc‚é™5„ˆÎ¨" `‹[!08ëŠâźÔĄVí ÓĂ— Eźmš ˝ápńSßťi~OcjöÜĽVč}î:sóŤŸÓĐ6{膹oĎáI"üTˆ./ŃđR‹ŇĘBÚąR+ˆ¸RÚóRB9j[ô°}…ž‡ń{?CşćçŽůT‰Ţ ×šŽíŽ ):4B˝> # §H“’ ÉѲ/oŹG•É-|ug1ZS¤r`Ľ^˘ńŚŕĄI;u&V×Ţ÷pŇîÜ7çZióŁYa$ý’œfîřh¤t#›[ŘD¤˘6ăÚć˙Ň#ŻDëMQ•V_7Dđ:;iÇŠQMłœ{ř6ŒÝtZ€˝ŘJĽ6´,2›˙Jepş(?ÓH ż’ióŮ(s ťůˆ0Œş”.‰ßőZŇƒŃçjmŞ›Żp{{ó´ůňŇŔÝÝýĂŚşŻŤ›şŚ^Ą~Ž.#óoxÜ{ËÇIZBž˙đyťLű#mäwpPëebîy‡‡€VĺŇ? ˆ˙Šë endstream endobj 1622 0 obj << /Type /XObject /Subtype /Image /Width 851 /Height 655 /BitsPerComponent 8 /ColorSpace 1605 0 R /Length 74695 /Filter /FlateDecode >> stream H‰ěÖ[ˆ]gŔńľ÷œsćÜö>g& q$ŢښZĽ^(ĹbQˆĽHk %Q*¨TAjŔŇ*%ĽúPú ř  ˆÖ Ň(^^j)¤‚óŇF )­iMÔĆ4ɜłżus­oO¤3úŕLj\˙9gŸ}űžoďyúŠFQE˙ŐDYIUXΞ!?´?˙Ře˙´Ä~Q{˜ě6eűŚS‰ü‘~čFźú˝úž]Âvqnł´;> 5ś™çAâƒŘGűZÉ&O>]Bm׋˘(Š˘(Š6&V3™ŃKţqÝe€ mdTËPłK3ť(h9_s>ú¨îŮŤĂ­ 5ÁDĄâĺáĆÔGílލím€œb˛Ů|ÍľUš|—PhŔ/Š˘(Š˘hĂbšfĽÎÄZÔĄóNňa+˛LżšmýäsÇőŽ{őŇŤN—ľ[ŚZ şé]×éżnňĚdóĄĎčs6Hy:aÔcG›— “vޗĚËkžפEQEQmHÉđ…Ůw"yʔŰmV }ł gsýţş~—ŔPť5A_‹‘‚}ziŰńkßmĺÖbχđÚ$§őčńŠŤýţŤŽËŕ›sž+/awP^/Š˘(Š˘(ژ˛ů¨Ý˜90eţĄÄ-ćš;ň´îű"^˛ƒĄ7ëUZ.2t¨˜*Œu¸˛z÷]tć„Ý×HKÚřOăޓš2Ű)ť ÷}•Ęچ téáGě<™ůČ}čâűçcDQEQEК¸çšDÝ`kÔšýŚSúă´s—”ĄßtFşP7°¨°ŒEŝąîý żřWh84Áĺígf‚ĚóřwŽ¨ôӟ!,:ËaÚyĂY杖ö&_].Đż!Š˘(Š˘čâĎő%ć˛äîĘł—ČŞžř<}ażŽ\ŠĐ§˘§ĹXĄĆb$&ˇÎ˛@­×ďć'g¨Ąá”šČś;g/؄–%§ĺkŢŹP)Ll6}ü7yą9fřI;0Š˘(Š˘(Ú \\ě>#ǚo>’nů/TZĎŚ*k* ~C…‘mĺMďğ<äȓ EÉ|ká(í¤Lš’Ÿ5˘˛kŇ~lt÷—–Šč'›íŚŰlŐ¤™}Š˘3‘ ú݈˘(Š˘(úŸŠü늓ÖSfŮc†1ÎÇž1ăÍý&´CĘ×eő´~ă[ňŽwgÝŐKC.Z ¸´3żZú[䞯óęKYy<ó Ńץó?ˇœˇ{ňĚóXö”eeňąç ‡CťŠţ<ź)˙¤(Š˘(Š˘‹!"ç“CŽXD’&Ő$šuŁIë+ťž5čâ’9?Žwî×­— L´sgČ0žu† [˛÷FŠ íܰ'˝đ{ÖÓdůTYŒBI×a_ Q%ŚÉëĘÎb1˛BEŸý\ QťâO(›ň?Š˘(Š˘(şHBĚÜ2Ţů6›*Ł+SM°U9śVő‰§tĎíÚ]Ś˘×”/T \ÔC*úC- }ݕzŕn6ËfęůŹŽGś5đüOCyá :´­éżóm›ĄVX˘ń6=ń7żÁ´}Ň(Š˘(Š˘č?Œ\ešP‘ÎÚ,ťŰ‹lôRLúó‡qçn„I*§‹&1…:AO‹1ÁHKS™m+,‡ôéĎÓ˧”“ĎÇú|óźc{îşvĹóĺęs‚˘ÍĐž:!ăí Ëcˇĺý¸Ĺԗ֝(Š˘(Š˘(:§ĚąDF3“”‹ YS“OşWüćô-×ją(žéÎf[łŸ1ĎěGĹP‹ś?=sŮۛƒŠÓ.kĘółJ֟Ŕw[ţëěnnšvßĆŰséG>AĽŠo  őü oŐyĂU{ćő&Š˘(Š˘(ŠÎ-ÓɄ•2űüm/áÉżëWЕ =ěU &TÖ]ű¤Î’‘O`¨P9ůŠŠ`˘ˇďă՗|8ÖÔ]ÖĎ ‰6=çÓä”őGl”˘ێ?–ÍČşzđ—Y}CćHřů4˜Ö*Š˘(Š˘(zeIˇç/ŇÜ<őçtß=LÝţśUčÚ˘˛0ćkßďSęż1dEQEQtNf'jLgN˛cŔOÝ!‹+Xö¨č+Œ¤ŹćĹX âb<+vFaY Ôr1ď×úáëɓŚ5›)9™“ÎHóžˆ`^×Z[őźö§¨ý9öŘncŤ¤;îTSq CŸ{:ô¸]j6á˙EQEQôj-ľ?ÂIÖŹĹě;.-ÖL)?0zŮ^öX㗞~6}ô“˛¸Ź0œ/ŒÄQ×3×ůŒ[C„Ą]â˘f¨ Z VÇ+ú˝•Ä&ŐüÝКÿUŘŞPaןDöܖßĂ_1I~‘äL3wĽlôăDQEQ˝rŢĽvG𧂤Ťvܰ´ÉZó몇ĚoźUťľÂhV˜ôú†: ’”ÂË~ę,ęÂD`ę,ŤşňžĐŃgĐ}eţJ› -[EݏFܢC*ÇÚŰĆůŻ˝ý2’dÇâ\R¸/Š˘(Š˘˙‹9KčlvdöËpRdó‘*ą6vţw‡ôŚ˝Šœ*ŘglđËŰ ;˙TL ´°3cs`2ňc.~Ű˝÷Ď0YÉgK›ň^Ěi˙~SŸ”KćO‚.Ţ÷e{'n_ÍŃÇÉČn]ޔGŠ˘(Š˘(ş ™ň˙1%r.ƒÔ-$ů$““đĐ!Ý}ł8óęTt–ěƒ0¤…‘9‹ŠůJĄŸŐˇDPKgJĹĐř';Žiž<Œ:wO:ýlF›“_á̍ éČłŇTMYiYŃöËľń÷˘ö}ÉŢUŹŹ?ڄŠ˘(Š˘(şŔą*ĄyĚ”˙’JĘęË@zę0Ý|Ť@Ľ0™•Kl´+–yĹ@*„E‚ž;°[oĄr]uÇ×Ú3çĚmĎŢs’Sƒmc*(ZĽŠŘZkŠ(%˘‚ ­X/SQDP‹}(ŃŠ`mDE-}Şŕ‹‚6MąM[ôÁŞ´šˆŚ'çĚ^ëń÷_sźÓÔk˛Áoˆi&&šÄi|@ďúRćTÂSé ŢĂÄŘNJ_Y.…ű:ÓÖ~ů ë—VxŠąŢţqŐóeo"eťő<Ďó<Ď[ľ@5ÄeřŞŒ8źřŇâ!)Üŀ fúç?Î?ôą<žBűuŠçbLâéľęŽ{ŚšjoÂpT€ ę$Ô8ň‹ŻÓ‡€Ľ°ƒ´I‹ő–•YŽí%|ć‹Fë\­Ž´ď lSɤőöČ.?Ďó<ĎóV02ĺ‰} f$+'Ňld+ƒC ňđŚĎwôŽĎj{ˆŤW“&´~™„Œ´Đƒ. ĽWŤaŻ) i8ćÎ2ŽąÍG?˘çŸĆm‹5ł č§&Ť<_Ök(%“íéG5n`óÇŔކ}|÷=Ě:L3$;ű<Ďó<Ď[ÉśzĹ=Rč…HÓ7P}D]ÎŰúŐtĺó¤ÚČqBkĽßpiKŘĐŢž.Œ¸_k„—& Ÿ¸_ă.íúćsř÷i.˜d5đáţ6Đ´ťârÂs öÁjô|Ń Ć ŤŽaÂŻx ^‰˝Lœ—׳Ź}zžçyžçý÷ąĄO…Ô„W䕋í"~,ćÜďÝŤ/šq'L(5L‹ú&† ×EŠ.W†uś Hh4nä0ÖŢúö͇őwOą)J ĽRVűłeĘ*Ýň^ĂB~Ř$ʟřtŠ#ąÇ™âŃ \=ő€ĐâľpŢ}ežçyžçyŤ'ZH†íŤÓ, ’í”+2ÇáÁSzÓ5ś)Œ4Nľ‚债ý9NSŻ‘jcť‚ôÖ´ ‹GÜk96ĆŠ?ÂüÚkňÇ”Š%9jB˜TźeCâópŕágě]lE2Ÿ|ˆÖfʆ†{S†o|ÓĘqřyžçyžˇ‚‘IîŇbŕ'-(œůÉ'ôíG5Lšš@q8j€ëŔĄę›ÇZ#ŽŹk˜¤jł CŁac^„˜ś.=Ě&L¸ęĽÝOOâÎDia+ebÚugĂ ¸e^Ú{Țš°TuŽIäš/Ó8’0ÉöźÝ|>oľy˘ťjő<Ďó<Ď[ľL_ÄOń† ęům˝ăSytˆBŤaѝC…ôp Ó\ Š7`“Ţ”LţMËŻłóc+aúřľĽp żőÝ|îOĘIsGšM–]`1çBLÝQítɚ¾Čö¤;ÜŮŕ](—c# űřšm2+;ü<Ďó<Ď[É 3Y4™jŘ4Ś'îÎ_ŔՄLt“yohƋí<Ö]eĚ#0/4j(ŞťŘ–ÓIHiŢ/׍Iix•~ĺXAžQĘRe ʈel˝§6LRź™—ű´ŕł°N~t ľVS  ěhŤ?›ŰŤ˛]'wŸçyžçyĎč ivő•ílGˈp9íěç?›ßř:řĂŔű§Šc ­†ćh„ ‹úŞqWM)l„ÝZ+ĄŚŤŻ—GNŃrů? >5Îq–rBŹů˛C`-KöÔű4 ůńÇđSÂß =˜çyžçy˙eâ%#‹”S%ĐÚɂó§Îę;Žá\ä4{ÁcC6mŤýźěˇ ‹Ůęmď•n[)-VZŠřďáݪątçqœCŕ‡?‰ËIťœĺyžçyž÷L‹Xü˛pgçTŒýĺm>ö…4;¨ąžWS¨´Ţö‚_ސŚÍ(5ڕyľ&ńYz°ŸÖň=ß°{Ë\tĽÜg{ĺl‡2Äżď~›ě=€˛ÓňěSžü…ş˝Ex‡š—ź[Ďó<Ďóź $&"Y„ l¤Ë?ţ‰^óŞšáůžqÎéŞ1…v/ři5žÇşX¨Öj ŐPC“Ă˜â>žćZ=ý¸ŘBI̴͗ě§ţ÷üuƒŸŕ1Îţ'ĎVƒnŤa,ŐŽúĂűÄ&¤eo×ó<Ďó^9 ĺ…úTˆ$Ű3|ţ. “Z]kR˜tŐD×/—3gdŠťô<Ďó<ĎűIŽĐÉ庛SSŐp˜ŠŠo„Ójľ+# )4´‡úđáĐp\wąÍ âŐŻěűź2eŔKdc "FŠUŠěy÷XĚjƒGMՌÂłnMa@Ǐ§ĺnŐó<Ďó<ď‚ŃÖšż°[/ą’TuÇOUÝۡťşŞťďa˘<ĆŕBÔ°@6şP4łP$Á(1D"‘Ä…˘qAâJĂ]Á@”jŒ‰ƒ‰‰ŕ‚˜h‚h”Dđ1>éŞsţ˙Sl¸1é™ë˙;5ÝUŐuűTý{ó‘[oÓr!ĹHC ňq9MĹ4ażh`šćRÎÍ~xÓî?ŞŚjšÚ÷Üđ)úçÉN_‘v8*g2 ř$k~ę=$vßbbęĂať~óey ňs[näďąK<Ďó<ĎóÎT‚t%.ҤY)Ý /;†MHĂh×}ď!=|$m."fš §ĄÁśđ˛îfŔa cpŃ@XÎ(ŒaE ›R˘{î×hËőĘ´îiœžä3Ÿ%|a ÚćA}Ũƒú¸h(ďě? ­âŐ´%ŽĽ‚áútíőúˇżŞŠŇlŮcAźenîĎ^\jłújšĹaŽŐ6ÁĎ]Ś)‚ź žže˜79ü<Ďó<Ď;‘Aƒ•ŮČaô:’ę)LřԟúŤŻŃr$PJ1çbfę ł,şÉ?fŠf7řĹr.Şůp.›mÂĹřŤ/݁oŹťZŐ¨Ůë~vfŞď{żMŹÜ cÔ>˘=ćÍŻ2ü÷<Ďó<ĎűŸG&YIƒ!Ŕˆý•qŻwޓf‡ľ„OT,ş°06ś…š ~+ÚiŢvƒ•łü)ź7KaÁ‡/ڇżéE[tžLO’i­Ł8Í%şýľiĚ`żĽM˛IeM7ŢýöůóŒíh$vůyžçyžw’á?C ˝°˙ԟő辊hľlc˜pXhؑ xŤ%“‹[V_ƒMňů×Üú˛Ľ°Á¸lĄW^%O×äąęËxI*yEܰÉűÚ;‰~ţË<Ŕ6áľÜ> “tŢzé¤ HĚáÉŚÁëžYĎó<Ďóöc˘K1„‰h2xEĽc_Óć [LwÉ|ţŐËŞŐ0ÎĚËöĂů~Fť×V_–áT‹ƒšî–[úŢTÓŰ"v—Y8ŹŇă¤ŕh˙Š'?iwč—<鉶„ ć#ßůöp‰‘ßżsđ<Ďó•ÍnđŁb̛ôŘ1skú8™mxľ8NŰĄD‡ű8Ŕű‘OüB ź.şjšÂ\?üqLßȧiđĄMÉó<Ďó<ďu'Ś,eř*;KHtЈ Ło}SŰ ´˜H ݍwƒÜn (›`ĚŚ†mÂVádcJźđ­ňăGzľ%†Őěd˝łXG†^ćcˆ)şŐ0ÇNŹ ´užđ,悩Äá×}ˇžçyžçÓ Ü'+Tôƒř§’âsĎÓÇnŚ0âÍóbŘéÂH˃{…Ÿ†ó8mlŠ ádUóťŻÖ¤ź8ԃľ4{SešîqŹĽÄOţ&V u *k˜ňFĂa&÷?0˜ÔĽĚp‡Ÿçyžçy˙MĆźĚ ĆŽ˝‰ŕŒ2=ô°žń-j)LnZlqy@Ă|Żđłż xßl3ŃO.Ćk^{Mw ĆOgłXW1‰ţM˜vƒ‰ĹjŚĄś‰…:ý`Ć^ÄtV?çyžçyŢë.IĘśXšş:%âĺRn˝­Żv´˜SC#ŠÚÖ0î6F˛wřiŃôaK˝fş5çc÷Ůj2 &˛öJź:„md˝łXKlţÝđIĚ*…&VynĄ•ŞćŃ6?űFdƒîÖ}ŻžçyžçëüH$óCý¸^~Ľ†CjöhfŤfŃögd Š÷ żĐrŐÂ3|ţĽüŁGm)M”—ːąă(`gŻŇÓşGqćłç‡ę˘ę}ßĐŸĽr BÝl§ťëî„ëČ|.źîŰő<Ďó<ďœ–0o_ĘÇîÓŃHŻ++Ŕc&ąšöĽá Ěi÷ żĺFMŕßď¤gN˜pČÖI“Řâ4hÓ칌5ă̇1Á6Œß=ͥѰĐPçi7icŸĆ÷~@óO$lB÷<Ďó<Ď{Ý<4ň?ţŽ×ݠńŤ9‡‘„M)çšFĘ:@Čă˝ÂĎĐxýÍŠ{Q´7Ýĺőţ˝í‰TsJ3úhÝă8ó FŇę⑷qűÍ4Ď đÎ?Á\OgÎćcYóÝzžçyžwN†=úşôr *Těd°M“ŒŠ– •0Éöžáwű—Ít §Ś˰˝‹ üłĎîK}žŕ˙+ó.źłÜt#‡-Ě?Ă;˙YݧîźSęě§Jëž]Ďó<Ďó΢’F8ŠT‰Tڂ2Ž 2Ŕ+ĺĂᏯ|‘Ę7p˜I×M_Úh5@“]!Zu ”H+œÔvR8HĹHË-\@E­ĹDŚŚżťîyœíĽüăŕ÷üřî{c5ËäĆë<…żcČGâӕž=Ďó<Ďó^ D ƒžůNDˆňž f`í´ˇ8{ň¤^s…äVĚÖtř7Ó˛Ý ~ŒË6pM6I1KĹ4C‡fÂŽ˜°}ĂB.y;=ö˜Cĺ?'L6$śO>>¨/Ďöł9ÇÍśŤĆżˇYŠĎÓó<ĎóźWŁ,>“žH„üŔh;HÎŕŃ/~%—\žŮ6çŞĺ0˘bÜľsŔŁ“Ýŕ÷ňic˜âoš„'Z4ąŘäАŮďžAŢuU|ćyƒ ­{glä#î$Äó/˛°k­0çQćߜ†‹=Ďó<Ďó^‰xĽ>óŸ0ź‡÷ŢÎ08Ä_˝WţĹný…Ęq–qçÝ=;ł3űçœ$z‘‚ĆÜT ˘‚hąĐ ‰­bUE´bĹ -âß kn´P¤ˆ˙ZDđB)*hĄ…Ş`ąę… Ú S(ľÔh,iΙyß÷yĎť[E0‘=4ÝääůîěœŮÍŮ̞÷˜ĎxGÜ4uôľŞŻŹÂ°ÉŠ›üV´ƒÔÇnŕA&яť˛f×B&2ŔűSýŢs'íR/ARTcZ—Lç’$âÁ*tyŰ;ÉmÁŇTäqřZňšËÉ7+á7ým-˲,Ëş˘RD ÂAż|7)]/ď˙0\!Žî eždćő~ČeÔAq ťęâđŤ{ŐźWłŸ{ Ÿň‹ŕĆ}9–{ďA1“áiRů˙ĔńİňëűžËLŽ +ŒŃׄr*~;œ˙§ [˲,Ë˛Ž¨‚$ć¤ôę%k"ę1~Ň3OÉ+^'~NnLĺL @ŽŮNƒrn R1í\%ĺ4˙[}ykĽŘŇ­œ'7ӗ%>>ŕę:yđ;*=Öóá[ŕÔýŚWăĘo5šÂcżaˇ•áˇPZëňÎ3ČëđÍo™Ł-˲,ËúŻX’îi…„HIb’]ůéŁ|ä%qĐ$7wˆ|E0\ĄękU}ŽlEÓ5öƒ_đ‡ÄŐťĺ)Nf2Č˙ĎÎ yě—ůęš3˘ř YƒŤ(Ŕ"ăG•ĂĎ ťir]ÂÜ4C*ć _~•źőÝm=-˲,ËúO̊ IÜăERW¨úžú].áşíäfŘءŞ5ŻŔ#řMř§ŘÓwđźü’*ąJżśŕ˛&çӉצ§ž„ňÔ0zîὸÔmz=ŽôkĹĘĺ(šnő-âFoĹŘ5ÝPÔű W×Éî…M_˲,˲6‘ę.ExKô@–Ő}KmQśßîłňťä"ŠťÄýXԁłÎMĹMWäÓmBEӕŠC„׿QΝÝŕ2\ýŃŇ{A÷ƒŒ?ĹŽšŽ|×|ťŒn?}:H—•b'ý \ŻÚŽţ#,˲,ËşŹąŢďq×O;Y:Đ"‘˜ţú§p󭽇ëÂꈎf×$ßDˇ‡č6ŔqMĹ\Ü,#yű1ŕä1mr!ŽňXĹÎĚş†u¨~Ouí'Kf'Ýfя|ď‡Oyşďăˆ0uě7üWX–eY–u9# ;Z ÝôERŕ)?NÇn8(äĘuá§Ěp‡BٰR}#ƒ6ş1‡H9ĄOÜÝŤ9(ŃňÄÖžRöeś˙űř€ŽE×Yá×ű:ŒuŰ9.{vX}€IŻÎO˲,˲t$Iď÷ú )Q€…Ő˙XÚŁ{eťç&âwčևߌ<ö[âćAˇš]%n äaK_üFVJ§Î”Lké2Đ˜ňœćŁ×ë:cE=Č77Me†_üJ(F‘źäDK0˛Áϲ,˲v¤w˙ˇ˙Nń /2ů€Ŕž3$߈k¤˜ąvĺáuá†->H~ÁP‡łoĄžčśŇxNß˙ÎÖ íŞ:b>ŠÁoŸeˇaGz@şézŢv{*jĚ.Áíş~‹ŢOúA•>ywZ~*ŻyZŽ<Űú[–eYցŽ(‘rŠ_™%Ćóň‘SĄl 4)Ú¤„+ĽX¤5Շ-š‡ŕ˝ÁHü\ü;pIÁ ďSüÝ9||iśä돕v qňUW4RlǢ%PP˙iĘe#7ßvĎw’đˆ›^ŠkŚ[ߒG0[ŠégK“÷Ցřě?ő"čšÇoR0[–eYÖÁ(ßŮY•Ç!éq~rŇž?ůyˇ8Şr+ƒfęcˇ ľ_Ěhě čą§ĆHĹ<ÝöšpžĽ[ž—Čŕ÷buęsâˇ`żäuŹŘ“kDˇ6şJN?¸XG˛ź,˲,Ë:1‹z쇃D˛`Ŕă‡ńdFnš‘Ťh4 օ_ľ°_ÝťĄţŒŹ¨˜óťŢ—˜ÔKq˛ůâĹ+ýŕ!rCđ¤‡ú˘’oŠcŘ/úZîüŘjœ°ˇšX–eYÖ ÷wNQ2ž$”wúo?Her*n"E+n´WÎօ_-üœT#.ÇFr3x#|đ.JÎI$}ţ"Qżmp%Ž­žůłŽÓq“Ţă Uňš:•Y_z<ÎX˘^ bsą,˲ŹQ‚¸"ně‰ŕ>˘Ľýžň$Ü jvUr‹XL˛šuá'%D1Űó•xو‹›ÓG?Ci'7œˆ˛/˛ţŹ#ŹýěXJ  „_Ŕär[28Ü(9ƒKƒ(ćü,˲,ë@o%JEŘŻťďËĎ3o’ü ‚nAŞ‚ń>ŕŠęšޛƒŃÍČMéSŸÖ“R&)¨Bô‹„´éŸv‚ǛNbŹ˘cš‰ƒđ[Ńš×@ ňď ÷łčő€3oúűZ–eY–őóˇřDŠ1şçóК H]ő/öë-ԎŤŽăřš™}.sۗ“*†,EÁ>#ŠR)h)‚"‘J/jÁ/U“‹oDSABA[}ňÁ*i|ÓÁ ލ¨69{fý/ţţkvcԓÂ(fŸƒ˙o&;łĎ9űĚd˙ŹĎÖ0&:ć•l´4R}öŤhѰéqť/jýü)3§żĂYÔ^촗+ˇăýC÷ąMg;‡Ňʧ”UVöëßţnĐô‹J>Ďó<Ď;XĹŹÁVö(ƒžĹ0⇎‰múÔ7xZžŔŠšAvóBME őI>ëaŒĎ=Jƒído…§i ńK§5oěAúֆę.o“ŐŰX7zŠŁ´>ŘčyžçyŢÁŠlâ=űDˆě1qÖá߇‘0Ł|Ę9Ŕ֎†ß¤a€!o9l)¤fœMÉ@8Ő°#ž<™ĐI œźîˇĂS}ć,‡’ ŒŹH/”Ü Ŕ$öšżŽWƒňyyžçyށJt tiĎځb_`ă ˆ'˙4Ö§}Ÿ˛M?ĘśĹŔ°Ó‡™LŚĆ80Ě%Ÿü9™n"’D\ k~7<,†çţbƒË›4¸i4ąĎ @ŹÍ0ťV¨Üx3‡* kŞYIJ7 ŞipĄŻ“ĂĎó<ĎódÂ÷%€Ů–ßGƒiÔćöaŽaĄY-çťî›ő<Ďó|œC‰™Â{š5éƒ6âă–b‡.œ_÷ýzžçyžˇg‘ÖĂÎNPąL——鎝4T”m÷ůœĚo%×ăԇCĂlƒćŐĽIEŐËřěÄ.šZ‰×÷6x/š}:H řŤß”żښažu‚ß6ćŤvŇ–ÍSßY÷ýzžçyžˇWÜ{ŘŇ#/ _¤K}žďž—ÂŚf3ěďŘӓßZŮ(ţ„ߌ˛Šóz7ƒý*Íś4Ö3߀ôˆÄŽ‹3ř(ÚšˇO#ŒČĆĂÝÎŮóVŇdąBČŚ<,PЄŻ÷}tÝ÷ëyžçyŢ^‰ŠěSíąˇŰÓă_ÔŹÄöMa!ĄĽ筆9Ă~E5~”7”mƒ1,ş TPËń“‚ áО„‡Ë“ö° 5żŢ5ŁßRE~ő›řĆH_ÔfœMń•˜ŐœÍ#ž…•sä­ëž]Ďó<ĎűżNDŽýM ,Şt§O<ĽY{iŇţ'Ŕłěű5T@éŢëaČŹĺ°Óă[yËďű0lů"ˇâíĎ(IË$’Đćş“ĎĎ˙}%ŘÜóV˙ú7ÁO3źh(DŮVWôÉ{žçyŢu튇J{5őɏŞŐahMGŞĎŕ‡Ű}z-‡Š„FBKĄűւn;˘Ý.Ž*¸ w ![.iíČŤ^“ŕWa¸{Ă/kvxę3đ%řáĂ˝đrĎó<ĎóŽOWÔ÷Ř|•ţôg˝ńÖݢа‰{,üŔ€¤>{!g ŽěwHBŠĄężB/œ1.í>âţóŢ“Řg[)8yŰ ŸÚpŰŤąwőzˆ'Náb/1ń)ł$˙yžçyžw}ÚC}‹POQßr'ç[Ś0›ŽV_°:§t°QO§ W“I{5üţĹ~ú’— ™ú^ŕ"§?Ďó<ϝޭöß´+/qrć …-lٔoÍn^q>~É{őżd€™ŠĎΡôčĂźÚđ#™˘d đRŤ‚í8űňi WěW] żv`ŠĎ>›Ôgëm5qwŸçyžç]ŻVŢ[=ąCట˙ý˛ •ëŞâř:çĚÜ;s>ćĚ˝IŽ‘ĽZ* ZŠ%ŐR ‚~AĽőE¤ŐŠŹZ-ˆâ‹ ECüęCž|.h4V­ĄĹ‚JJQӍВŢ9{ﵖkŸs}™‘Á“;0ů˙ćÜ}öýسŕ˙Ű˜•;~`y=Qš†lÓFM–ż.ńŁű™ ġ2ë+ýpŢü6˝,>Vtţ?ĽĂJ>đb-ÄŹáěŮv—§&~óűaŹß?Óî{ťPm@ü€ŐĐZ_ł;“ŁÇş˜ö´ĽI¨2gŞ—?*íj'Ek}…YŸžQ.^Pőmŕ3‹šđyuĘŤ~|°,ŃŰ´9÷ť§}żL›WľżťŽöƒOsůč#ńŽĎ0?`?ęهvćü^ł|ŕeoŢĹI¨Žę˜˜LŮęžDi?°?ˆĹ/śüeulQ̏=Śt /ńS2ß+%˜ňyÚrŮDżwFŐ­úąAo°őPŰEÖCRíĺ ú!PáÇ/×fWŐÇ&ˆ¨"aŐ\xÖřr^c„ťgŻŐŚq_âg˛ąOŠŮpŹ´­XC@ĚŻ Ň]QÝbɍG=9)ç’’ŠÖóOńmˉ­˛.\ńc× žą!XňrŘe=vOC#MŤžÄOł‰Đd–Ůź–ă÷¨s˘łč `]č6Ós°™źţ.łžEâGšK§ň­Ó*Qř‚bcłÚGŽ,śĹwwţôg”JĽičÉúěb2Č}śĽ;ˇčŸŸ÷ębAĺU?6č ŮE$îëťîŐůÖg—§ąŇÄčcęƒtŤ!~ŔžÁʖźAůOh6Ž’FyČzż˜ňéH‡[ţçOh—ôrĹŔ ru[ůĄB•.ż¤Đ´Ň×÷qYk}vě€ýŔŠ‹î˝ČŻ<Ş1˛74Šú?ś1­ő+_ m!mźoýi%Îđó_ T->44ŇńĄŕw…˝)_ě 4°O°Š×Déŕn:véT(÷ƒş/ńsYéŢ{ż¨oľU}ˆęçWýÔ ¸•śNćăŸü:guX$~§6Ůôż}VŎ&đ> oÄ^.ŽÜˆňl/mىńٟĆDN7msR6in韏ŕitź‰RŢdِL5)ă“Jnž]_üť)ŐŐBW˜Wüi€>á ,­üəÍ2k†Éź> mŤř¤ŇďţPڅń `~@Ż4Ý+&Ź%-_Ö6tm.—/š›n TE[Ks!łžIX^üź­JrNǝśďsp–ż,<óŤhÁ šlšüi€ő­äŠřéă?ńIąŕŕ`'‚Ř!TęÏZ÷ŮBnĎ$čŢKWqęÚš vâŃ@&{Ń÷˛ą)Ÿ&&oő˛â§I͔3 •śƒŮ!K=}*Vm,ß}P/Ѣ0ĂýÖ鎹ľô7Ośj7_ü¨ T°ýÍ]ďč’Ą}@ßł- XáĐú^¨^üä/9™„ÁAM Ś Ą*¤–ÚŁÁ=ďjhŹ™Ĺú– &f.ęűhÔY5íŹ/Ř˙ĐĆ<+˘~mˆ˛g›j˝%ą­řO4ľ“EâWxkś´W]m´Đ/ÂŃŔ¤°xł—S˝íNĽS­IŠI-6Ą‘§şIóeĹOłĘĹľSŸT’坡ܪ—^˛RŃ2ՅĹ ŠŸ×Ýřř•~ _8Ş[Ť~réLůbńłf Inú'ţŞÜ-@Żsk^헏ˇ“ßlhŹI1ÖJێ&QüŇ<¤“ĽĹrŸmqV3•2Źôü3­\ ˇÂ×%{ŕËŚ|­óAüևîLÁÖie˜/~mŤ”Ńýh$ç~vĹĐ'˘QÁÔŮ­ą9?˙W‡9)• oÎ6¨_JLkŸšlzZZü8™°i$mĹd˙öŠY,U`ÖJ^LöX߉z6ë„ŰiŽ{ěm—ýôPXÔ*vÄ0÷›˜űéÉoŔú€kE˛°F ÎYLß÷ĺoHFŃÓ¨3˝ŹdX"{ÚR-+~žj[ËŮPß~݊ ^+ć~Śy­4ÚVľŁ ‚ő@Äԍ÷ÜŢv×öř7„´œ×'šŘX)Ĺn‘OX78ČĐ;Śb–ËŃýœž;§´m)ź  ç]!3Qœ*Už†šŒ…jĄRc ŰXé‘Wë óQí|hˁu'ććâ7˘îÖ;ôOŰ'E“Ml”;ßŘś%Äč›ŕZósÜ~ˇĐMKŚ|Yń‹š—šVf€L“`8̕jťœM˙qßć?łUD Ż?QüBœDńł ç;Ž›ÝýńK+ąŢ;|wKŃ'@݈şĐôéh6 T8kR-/~?(]˛Éé–Đ´I ?¨˜ĆžJůħŹĚĚJ rܑčkĎń/†MŢô–âg§vv ’“‰ő\üK\Š6z†MÚÝYsäfŚQV.łü͗?MŤYfŮ=ň4Ꮰ‰˝ĂM7äč1i̸ÓKé*†U?4¸ćDńëś{OüŢúÎâç“ÂŽjçŽl˘TëšsWşýÁbůęžôUNĚ÷6,s…rS¸ĽĹŠ@cM-ľ N OcŸmép‡Ÿúľł3mŹ–Ӂ&–×qŁŰÝś/~Ď} ÄĎ~eSî¨äŹÖďœň? ¸yá×7(偊YÔżÚćˋßԔĎR[“MŽßN$+ő _6ÓSÍl&šĹ9۝WüĐ`ß`ąíś=÷P¨šß?g֗L&‡š>ňYôp `ůäç”Fœ.Ý Ő!-—ż`Ť’\Mü¨đSÇÚżön§3aK}Ö XlvâˇţČÍÚíf~đÄBńŤź5OZś'ˆ‘žű}qaěô†żoí=ůϤ;7“ĂźĎŮg͚93kŸĹźđ>k¨ř‰]ĺl¤óý”­‡|ż<÷çT˙!ˆ4úH¤m%Úk|“˙ ěvôfćî‹NŢOň…‡egń ^˙TĽMâh,wž/vŔp8‰WŁ?ÖĹě•`…|b‹ýArůlOaâ—Ő6úĄâÜD\oâöĹo|óŠŢ‚ˇÂô_>'ëc™}é”,:8T1+ŁĎu]EăMáZÜAZëâ´‹űɅmÉ”ľŠÝXľ-ú)ůşëßA—¸Ćoś#kđđŢÉěŐ$–(îŐenýÄę~,ńáÓé\°S~ęŕ Ɗ$‡UXŤâ…“4`8VĂmęQs2ťÚż,nŇîŠÄĺ’Ę—]-v ł>+nż\­îÇëÓđüsBűű€…zőëĹONEüBńÓú˘ËatEüíďçŕ–°&ićmŹU,/JńĆŮZŮúą‰Ÿ/[WŠ›śŁšÜx¨řą[ˇŮş yäëÜßO4÷ŞŇ€š?{öčÚYüŘU”B8żŠ~řăŢ0"–h:#ŔGżŚśĆÚść{eđ٤žů\FC­Ż°ÖÖɝď‘+3Ą6ˆ´ń z{uš^üě2ń‹ #¤!Œ6ć:_əÇćÜD!=˛=štŠ9üÖvm̮ҞmÜg•ŒęTÁcѧĹOÜ´u9ýćœÄFoťŽç¸ÜMƒĽqMŮćâ÷ČW_‡řU*~z‰Y-ŸýŇÜ"lł:ŸÖi 'ž$ź˘•äKí\›ť\ŤYőoćóĄâ׺ZśNę}ސ‰ŸĚâˇâĚՏěbżů‰>×’ŻUüb–&ž‡Ž€˜iůjsŁ*™ä-ďˇŸ]žŽB|ŐŞú*éŸJŕćPń“ƒw4ŻüGb ˝c‚U‡ú &~gė;Šß¨ĐěŠďą“˝­”w˝ş†AQË×zTÍ왧ƒŰÓfűÄUC/řŠý^ŠV3+ë2š7Žĺɧˆ/GmůVšÎýúˇş¤X䒻‘NÂɇä\nYňšĹÉÍZ!ĺ!¸5´ľƒŁ˜•ľť/fjnľdƒĹĎ>ĺň֏ľ ŁŰd7–Ń´y˙G"˝6S§ ŠâÓݘQŰŤ ĎŇÄRÁ'TüęĹĎkŽ’ţyMfaŰ3•—/-sŔŽ…“űŠ‹…ţMüDÜŚÖkpăĄâתřů*u´´¸)ů)ýéQË]­OK&ť—Šf\öžÁRašf˙ÇO°Űń ‘Ä/ŸŸ,Jră {ţďKü߀]NPńkNŸb—kˇ6keČňĄâ3żRW Ń$döâ精[kyľ>3>?Ž:^×ú`Ő ćâgś‚Ű1oŃŮi"EK'ĽNôÍň‹_/u ŔnĹú7DšÜśo:݄\]|5TüÄĺ­+ۑNjmj:p˜_ş¤K7ú+ܚěYăŰ$J¤eo, Ó~V’Úx˙§â˘hUvń%9;Vh2ƒ/ř?Zö.€]Iď`?}F•ź:ŰT܆ŽƒĹOëX ÚćS‡ď|ۜ’ƒ‰ĽU=1Gľ>ő@ëýĽn,•0@2@ÝGقEMn]őOĂŠoSń‹Y)kŮťv%}ßű ł>_‰›°[W żŕJmdéËđŽŁr% ˇł´<+Öň$ŃîB°;‚ĺńłńŽcéÔ°ŁřąŰ WŠßL~8Ń7˃§–ť`—˘Ý_ž(ë‡Ůd/#­Ú2důPńWDˇ_W =ŁöПéşŃ䎸ť ĹńĽ]â–ÁR œRǚ5@ŽôŽ˛ď­ eúW=’LÉŢV‹ŚôÓǗ˝ ŕś&čOÔ˝B#ŠzUŔ:/űî3??^ë5׆j}ř‰_o˛"ÜýqîÖĽî.\Ů?őň×h ĺČŰdqŽ\3ó˝m¤| Ţ“>N­ 4ĆnuHfË´cgbŹ%ɒş2Ř#‘Ü}oRžJź–lŠUŤ=;Ěú|ł’ÜXÜ>:÷ť¤™üšI&Š܀ĺÓŔ~[?>üćâ—ÜŻNâWDoâÇn“Ž~ ­ŐŒŽ.ńzČşQ"[9Şěq¤ą—śˇUŰÄoŠÓk/ť*¸qtŐ ëłK˝Ń•áţćý›ŹR›€ëč݌;_k5ŽíƁ…â—ŤřéÁ¤Ÿ{'täíą[¤[Sé—FŢ#v=É6 ęŇ E}Âßű~t>iŰTĹŻQĚLä^żřu×eýÔhSţú‚Žҍ$ÄŢ6˜sUüŘŇřżŻˇ(oŃçv 0ńӈIü Žń|9ąçÉĹöí?QüF˜ř†aĆâ IYg!×^ř9‰é\Ž7_šuü‡§9ő7ĺڌľ‚ÚöeQŰaŁX…řĹÝűLü Ă0 ă´DMJ?†ďÝĂŽĂŽœ4pŮőŘŤř‘ëň{ˇpâdkœ=tCüŸĂ˛ŞfžŠuťöŠĺ ŏVzžVI†a†ń cšüŘÍěňčňI7ş.šYvsƒŹwţJť‹b’¸ĆYĄŽ&ޗd Ÿyž}ŤŸ­ćŮSwBŁ [‡†a†1$‘4p1ňúËEüX-n˛ŔĹŹEŽWÍäŐë߁ĐרհÓ* Y…HJJáŸ@Šu]­uhâ8şBUĄn'uĽç× tĘĄ“ďÉ1Őa˜<şĘ8:Gą~ źóar-lvVąů‘Ý´Ň#fßÄĎ0 Ă0ľŕJrRüďŸ˙FŸsě'\m%¸ëHJQ;Măó qú!Ś*ľ /™îPĘ´ OˆŠhz¤ ňŇżÚ&NňA^ĽÝŚŁƒäŸLƒ PńšćMĂřÝŕ;äDüz&~†a†qŃX3Jţ@׍œ\1šřu١šu1żüŻ”ľHÓż˜î. ĹŔÔGUcd éÍ_ť‹¸˙ü/”[xŔiől˜xœ¨gLěoóVö]töš‰Ÿa†aœCDTX3—IügۧBC˘śĂޜ\üJvłƒ'ŸފV”N§W—(—Şß2Cżś€,0•@O!ţń/|ďşîŁŐâ%qFŞî¤ň -Çϓ+1šť<5ŮŃbAwÔٟƒĆ5rtmşÎo˝Žwü>Fkí3ń83ÉËcZ°~Ł<™ę´Mü Ă0 ăÜ!nF\iNžâ*1Ɗä?Ž´ ďŽâ2ŤďiÜŞřM1p%ďAî´.†ćż|‚x†ŁËîćíˇÁâ†äubt‹Éu δ‰×׊˛"4JĚć†6č‡;ŇŔwŔéŃACĎ<Á ‹t¨Ë­KůÖ/ĂáWäÎŔą?ľYX;$ńӇöę!Ë)‰_Ő4ń3 Ă0Œs‹f˘†ă`™›óQ5ڜ4mĽ‰,ńÝßO‰"WQ{ŽS­JÔ+F/ë–<ġ~aia#g%kĽş2ŹËąąŽÝ‚îť2ú‚}ž\ރޭ.—e]ôĺp? ^’=U>š|´.4Ú˛eő–™pńŰčĐÁ ˇLq*Ö”‘,ÄgŸ7‹ú:úbâg†açŽ(™(Ů(éř×ÁͰ/˘ĘL>iŕ†f—_~I ´3M[‚QřNƒTS=„>ďüżoŤh­8›ř›[•u؋źIÉ]9ݟKBŘZ„Ť pĽLtľďÍŐSÄ'4Ěd´[lŠ1–U3gßÂ÷ß s ӛ‡5Śwćý24ęé]Í;ˆ‰Ÿa†aœ-á$Hť#ÂF÷´Ů:ËŽ+‰\'6 r-ĚÚ!ëńľ7hWŞ[MpUÁżˆŤ„;Ćú;DŐqΔř+úńĎńM›Č71kÉČÇ ƒ4ŸkKڧf¨űd …Ô+>,Ćb‰ž-ŒŽ’ِÉŃnteš™úPÁ‹—>q3>ýT-×ƙHŻ xǝé1͂ëĘ#˜Tüâ#{ëő^=ؔĎ0 Ă0ND˘śVżę÷‹Řˆç€zÎŘŔMVÓ žÍľůdrŚ´?ř@ł‘+ \¨•’Îűř#nBĄ–=ŞŸz˜ŢúŽĽÎÍ÷ľşąÂ Ž!j' Y*GőŻ×w ěŰ Ž+s2Ď^DwťöséUD(×óŐ[řö;ńÁâďË˙x‰Ř×DŐ_Ş'Ů8-:EišđC—™—iÇlž\{Rńƒ]ű˜Lü Ă0 cˇ¸áKwˆüˆŰ`ҞqÁšä°W5f“MI“zT^†ÇŽhւ„mäœ\ç¤.BR+HÎëN؇ż˝Ŕ×~„ܢŒ2ěÎ +Đç§?r-ÎJr%úžœ™”ŁOfŁšóË~&f3”‰ď•UV Ţ~5ĺüťßŔґĄŢEdŠŞ/"žiPúŃ9‰Tťľ1™5JϏ/˝B—Y6ž'“?ąříŮ_‹ßJdža†a‡ÔM!ß´] ˛ň´v$MĚP¨jŠuٍ‘ĎaŰ-ľă(¨ćSąj`’żó=|d\†dzëĐçťżĂn14Űŕg“źĺœőŇP /UÖÝÍý+¨Y\ łvp é—vX§6ČÝ7ÂWżÎŸcu9aĽáhVNX™c,ľ<ĂáWäak‹{WŽ`?ödŹří}<-i?Ă0 Ăx-@…řĘŠŘTžË.ŹŹ'¨ő3Ů΃=‰ęI7"^*b42:ďćrż(ۨ đůĽ+?|‹ý|peRžŽ|:ŕŽü¨F7Ž.דmt-őX`7Ď٢\…ÍœÓQx×fřéϸż”JŠœT3•‰iWÝ’~ĘdĘaJżÔ?â0ŕ5NzM€ęŠ'eŞ`g…žbd“YŸ4Üŕ5ÄĎÄŰ0 Ă0F$kA~Ýh́ëŞËů|l°ŠDů]‰ľMe9—o cGS´Fâ@˙cżnCĺ¸Ę8€Ÿ™š/;ťó˛{“ŚM+ZE‹_đ"j_úAúÁ*VJ("‚_ýTĐV[jlƒHŞSAđS¨PŠML ąâ Ւ”DŠP"Ô˘ŇĆJąÉݝ9ç9˙çœÝ›P2+{÷ŢÂóżłsçŢݙ=gžĎoĒĚSűŮ­<žĽŤđëŕCźź HŁdéšTüšzSpV:ł‚=wƒAt—`v9ÎőiíĚ@N!Meoř8ýň_ĐětvÓ-Ďbx‘h”`Gź˘éˆÜ["˙÷y (â#F›ä— ?÷Ťăr5żQ+…ŸFŁŃh4E CžmĐg)…Öż9Ő&čČ%Œ1|h}ţKNźCąŰĆVŽœßzń€\vň*ÝzűzŇłIé1*LÄä‚ŇDüć9Óo—‹ąYeů@üŇ~krZ][OŁl{mşĆ×Ŕ?v”ýyá[ ÄZbˇŚH"źéŚÓ— ÷QŢđ'îőŘZN5shF|Ëm.ĹşŠ…ťLőɃÉńßr„~ü ~*oFŁŃhbœ4Ç楗Y€´ę͈Ń=M§ýż€ŤŐ&Cƒ^iMá9&źqŇgCŽaOVÂ~ŤsćoôŽađ’7=˜ÁĘ1ŕˇ2Éú” Ů ˝)YhNđ“ĎějƒqîúڛřCc?ąÁsěD&€â<ţ Ź ŒHěń^8˘pCĎŢÓtÇG<_÷6#)S ˘ŁŐ叟üÝĆ~FŁŃź6"âS§ŮÎԜ@}ůœ†‹ Ž0ŠGf­Y˝’_=żŘ~ÚČ* ´"Ÿü#Ţŕ–‡NŘVˆî )éžĂ–Čç˝YĆ)p,%•Ër–Sú”ŽpÖ?ˇ˙ůÂŚ¤ŮˆőĹłaáŐXZ°:JĂs€'Ľ,ĂŞ&nÇ).-Üéçđ"WsÂ>'WVvk4F3‹‡Śýţ,^B}đ-ő’™>źd…ƒŠ?ő&Ç´ĺ˝U¤‡nîqв|%óÇšz3Ô× Yăđdl œ› Âg ąbĎfťłÂŚž*b´‡?,“Ą fEdˇz^šLŽ=aQÁ¤ö&‡Ć[‘|'ŕă[ëâ|YŠŘpđ÷aąŘ°T"üź÷J?FŁŃhŚ!iŽíąÇY T~œ ćŔoÚjĂXęů‡~ÔÂb[ßX=jƒű¤›=ň(çť1N'ۀłjŠŇ¤ˆ#œ3~—ô،Ćđ€łr6kœŽ8ŘďŁ7ńó/b6L÷šEĺÎť[Ą{VÖrü’ ÂćÝĆ?Ď­ŁpR9üDń‰iťçŚŃh4ÍÎHhŽÍᇡ Ą~€S'ü,>–‡ŁfŠđgţę$˛0‘|Ő/ç´˘Ź§ý×Ř ŞoŽýġIMöťÂš‚Ç'ĂWżIžXR0œşoqÁÓâf‘›éá””`Av>nÁ{đaé˛PÜŢŽéĺBĺČo+ü4FŁ ÍŃ˙ř'čžԇýřVŐâCłćßţ^Đ` $/ÝźUśŚÇfÄ_ůşŔČŮ´W^ţ™S~í †oOňq*6ŕ0ŕ9cžxsŮj#>ěűĺ3šŻöňožr°+ ç§f˜Ŕ -fÖný´4łœ´GŸ–ęi1đŁěÇf͛Ąß{-Ÿz7@řęÁJ+ ÷“Â˙ŰŕMÍ"rß÷9Yłę…ń8ČĽŽŚę†ß°üä¸ĆŠ%ƒšÖöć[{SúqüĽ%Ôh4f#>P‡ďš×˘á.ĄöŃRšSMNKoŞ6+ěRÁŻźú+E+mičÜy~÷‡Ůô8đ J*—`¨5%…Űŕ_đę\ő W¸.Ń5×Ű3ĎAw\˝• 8f­i”Oߎg ťÜ ŘŤ›uŹ ŽŤŽő$ĂčŞ)ÔÇóČ.÷…/FěYŹj”ÖÍŕGŰ=;FŁŃhvFĐ"ßúŽů’3e誝vÂ[hľ°}đ“žˆ6Hr)ˇa°VTćDa´ďV2ť˝)֗1tüK!˝~×8]ŇĂ+J„âçĹ´imwż•O?#H ŕ^ŻÄ[X‚ąĺeÝGŠ-[ÇĺĘJ7üœGŮ&ĽˇŚ‚˝<`ßww|{ťg§Ńh4͎Ž ŔüBŤíGřÍo¸h˛Öäüľ;jbňŽ6s@¸^‘Ür8j|ę#SrVžÚ6)]ZŮnřą˛ŠšŹň´6[˘€ú{íS’KűĆĘwŠh)n|ڈˇÝcýůi¨Ż•ĺkö`2çDR(ʂĉiŐ.ĺ|đĐöÎMŁŃh4š đsw퇦B­ćtŰYĂ@_ţč9ßOmśi‘áˆÇŕ\Őşą˙Ëł6żŇ›ękRŒpäY0hŞŽq6f7'9<ąĘrĐűĽkăG†icsř6˛‚_ˇyă×ĚOX*0Ÿ {)ţsĎ~֕`/ŹĂXD7oB‰5@x¨&I!đűůcŰ<;FŁŃhv~ˆíß ˆBĂ-Cc-ç؏ҁÍFţĽ˝ĐŹ•NžyđóŢÁ“ˆ1 đÜéń&__„/6p^ZcíL—dRůH,1šQ¸´hÜ­!/AŤˇ*üœ‡>–šńŚř¸ÁâůAŹr(t÷"”Ĺ0$<Ş$r őMňöéŰ95FŁŃh^!oďÚς˝)ü;{ŽËr~ËűgÖk=m˘ű$–Ű&ü’íwŁĄc`,š{íÂ89)´ţ …Kn6Ĺç‡8ך~“înĺ"…˙ě>nĽ÷c!+9çăWiY-cËQ€‚?úĎŮfpU$_(´”/şëëŠoX š3ľMJ\Áž=ť˝“Óh4fçÇ;r÷ů(ü_řĄQ|ۗ/]ŰůFöÓ.ž q2 0Ăĺ݉Íňäk3QšťŢŇęóËY¤Ú9N6=š˜U.đľďâ—˙/ˆcśsÉ׆oŐ,$íVîwÄţ4 ~d×Ĺr5[ü$Žů×'}­|Áϡž89xř‘€bŇÁZ2a3`“9ř›Yą8Ä}6•űJS6Zî$ޘńŃcPyVâ5śĐËřľb¸+ńœŸA™‰l8 Ńś‘ăWÝ<Ý0=ĂGË6ţ„ą7‹ß¤ęőƒÉźł´;ăÂüΊ˘(Šň˙I€ú0=ú˜Ř‘äiéĚ0ş_SŕfŽw}X˝mB„W2­Űc(Tb^ňEć@ĘďPOD|ń_îúlH ôÚxÁ˝)}"ąnz‹wkSD›ę“ÉŹÉÂű?ľŽsŽďN邃éÇsĂTzž{›A—ţšœ’ŘŽ›$ş_<šŮŚ(Š˘([¸P`ËĎ˝ĺŤz­\k–ř™ÂŢwĚą¤wˆƒť‰Ÿ•q1˙Ľ˛Ń|ý˙ĂG+)Łđ˝Ą7cQř[K1€ő…tĚů6˙üsX&VëYĹoÓq~CŔŸ~śęzÝÄĎËš ˆž?tgĎnöł)Š˘(ĘV'F°ĺ‹—ŘŒ‘¤l2„ŠŸ¸î‡?ŽÚ÷_•ęčS"ŒĐÂ'2Wě^<ĂKŰ)]F OÓĹĐCŹŁ°ÖbŕHlŸÁĚkĚĎHę}[€.La÷ŢďĚ"NŘxÄO6j:Ş#aô ŽÚ?EQĺÚ#@Š™Ĺd2d¨OaYeŁP™a8ýWF!şôŻ[ŕb<$€Č[5˙˜â?w™Ĺ<3ż(ţ 1ˆ ×A VxtC8ÎçŘË-°§šž8Ľ=A$ýđň°ëmœń¸Ń¸ßšű›…(~>ÁŚš˝ˇŤŘ+Š˘(ĘU â\Ns÷>Ÿ Ą”ć3ÄŻŒůÂĺŃ„° žËşë)ČŐ{7ťtÁOvřdĹ.–d†Ô_vfŘÁ pYS𥣘¸Ůs\‚ߪřmzM|úY‡S†ÉIZÜZěC?J 6Ř´ăęŸ–ÓCˇ#ˆ˘(Š˘\K@üÄÂö‹CoĆÁ,šż|ŕňŽ1aqƒE‘ă;ތŔ@ĹĎáłMůá@>c "„LOnP¸dŘV ¸?ŞţvVĘ dšVTśó~uJ[¤#ÎŁáöó÷łÉ§˝Ü÷†ŽŁř9ÉŁřMě߈SŤŮ+Š˘(ĘLDű až?uĚ"*_ɒŞ/¸kď|;BŔĘŃ?$l;Žĺ ✫23$ň–ŰÚ €í\›^şÄf›O2—H2űÁ$)Ę@Ô?ŠŃŠúm6žeóóţľo˛f“• Ö7h/~šƒő%co–Ş^?<ů{lHżŮO§(Š˘([‘7šÓ׏‡Ę7bŃżFńăƒ—qT Zšƒřmxc­fDČě§ţ´ÚßÖ6ýáxA Î]šą(ôoÂp×'~VËdŹP Ĺ"aÎďNi÷˛cNţ†’'C2+8eŹőZ[ŸOEř=Ěąŕ¤äó˙”.{í°˘(Š˘Ě˘ś>\ÓÇ^űbtFŕň—žâŁHy‘7ń)Ž-ŽăÚ$Nœ8ŮgŽZ3h+‡`–!ŤŢŒ}oČf@ż×íľ\IiRĄe!PíŰ XŽâ÷‘;Čô!ęKŃŘŰőݙ UÄŻWđotąËŹ-VEQ”™ˆą‘č›=s&F*ň´ŕ™űČw"Z7Ć(~÷6~֓:°ăĘňö›yaŘVČ,Aůؔl–E!Ň̊~ľÂź Ŕ+×k ŃT•ÍEŹďâšl§œ2иĚ%9ÇG;á7%%™Œ’˝÷ L|§ă‡˘(Š˘\C@Œjńcëiy''y âćĚýéăľ´ :ˆŸHŸ q"G'O9SÓZüP* ˆřM(Z봗Ń_žŁ Tq…Ä|đőă*› Úđ˝ÇČôŤ-+°ŮBZ†.â7"5ädĚ_;ŽÎúz3+Š˘(Š2“P`oűö#R˝¤jѸöĎOA¨^*~AîĹŻśNő;ôŰÍXˇůĚAůÄĆ⁝ö`Úu— >ŕb•ŹęćőҔnČfyë;`kąÝ›Ž°É˘şˇëťOeˇpŠÖçţÄď\˝ ŐűEQĺjˆôřÓáωA!O›ƒŘžűLe@ô˝é°nl= ‡Š_+™‚ŇśÖ—×ŐÂđ…’$ÜƒjŚěŰuĄËDýóóziJGžţ#›?2}îĄeEáâ—W˝/lŤ.]ŒŰwłMQEQś>˘l؉}űťŢ”œ”ĐżĆĚľ•Dl”*šŞĹąő˛X˛Â<$iížÁ''ă`m JsŠYä!÷=|Ďů‰Şč{ňAĄřTđžNu*óĹ~ňNNrJ—ŘŒ!ęœô*s54š.—”QźgݓӇ˜˝Ó+Š˘(ĘL”^ӉĆ=ó4›B˜JŞ–”ćlFP˛ f5 fÉ^÷šůŽŽ5Ľ‚‡`3 ř´›äŃTĄŽËÔóĺ`Łí)› ‰ŘÇ­ĹÁŁÍ,’áß<ÜŇRü<)¸˝ď]š`}UZ„˙Đ]X §5ŽE_QEQ”F ]ěÉ"™ĺłęłWr:qfˆl…ňA˙ވ'C~őî9.e 8Ź˙Áƒ2żh/Ľĺ+Ä%LNűnŻç[J7ŕ{>‚„‹ű­Fˇ~ և~Ő-ŤĹŻ›şT6'Ăýý>‹aÖ[YűŽ(Š˘(3Ą ‰Ď<ĹŻw˝;˜Âö$Ž ‰lʀŒ6#2Hçœošm~뮋_Ŕú;vaš*-;›‚Ä"ĆQüöÎťdň0ˇ2•ŽD‹ŇçÄý`déV´ Ö×Ů÷Ž\8řT áüš5ŽÖOűŽ(Š˘(WĂÇO¨đžc>†r}G°ŠďAMüĎŰ÷ĎoŮ˙°_nĄv\e_kö>çě=gfĎ>'‰i$ Ö[ő͈Z¤äÁ>hI„\P’šBKkÄ4"xĽ*ąx)âƒ>/ÁKŐPPK 5ˆśŃŠ5/žäĽˆšŘěYk}ëó˙­9çh‹Iœq§;”ďwfĎŹł÷^kÍěoÁ˙ˇÄůd꿝çlĚfńJŻ„Ĺľ?Ü\¢oIýűÎđ$¤0{ȇ•=E ń LÇ—MDň˝•ŁŤőĽ#żŒŃ޸…eŠé"ťEQEQŽŠQ>´äúäi$r4…CŞż&ŹŁ)Úď}˙´ćmě Óşă'˘YyëWL XÜç¨Î ~#Â8ż}OŚu—JW z˘ö çăŚĐőďAţÓú¸Ů\¤ŁƒřqoÄ÷$J‹óȒŇĘ+Š˘(ĘľˆB@hJdú żp™6SyťŘˆ™aŒń ;÷LmޔÖp´př+6řܲƒřĄKÝ/|–'ń+řÂĽFa•ŮŇxX#áŔřÔo8+kťô˘ÚuTž$ü͚üń?Śľ+ÓĹY?ś˘(Š˘ÜüPŒěšQ’Ó‡­ŰȎœÉ“†•Ńä°˛$cžűŢiÍ›2{×ޔţ°ž˛ƒ 5šď׿.™ቦuŸJgb nô>Lüö]l‡i9-ŽÉ^Ó ,°â—uo™Ÿ˙ťř%Aű ~nÖOŹ(Š˘(7;)˜[mMčˏ XaS,Z5ŚlŃgřU´ďţiĎíé­ˇœÍŒbVuSÉ}ÚČ*ošÝs¨×žI™!Ԝ¤ţěłp<­„¸ßKĹE§ŐwÚÁďxWłU‘­‹çš]Ôş+Š˘(ĘupąN*řß?ě š1ízHŘ*fKŢĚÁ̓ŸšćźéDĹ2Ű$ofäMkđb¤š.Ň]ť‰ŇăLď.•nČZŠ—ÖÎ}>°č}Ţ^đFÎ.¤ľ1âŢŔŰ”ĎےM=°ˆPěčI–/Š÷)Š˘(Ęő ‡ź$YJ'Ž_ŕÍoŽYŮÄtĘëq4.~Ď˙ĂÍ$ž's‘ľtńĂ˝Á>°OÌŹ0{ ôą);űÇh7°řšč}ń[•FtĎÓNdœś ăxćŠ:ÍԔ;F-ť˘(Š˘\ďq ě"qô¸\Áż{vâľ ŹŹb;Œf~bZłF˜^g˙âěP&˛Đżź­Źzi#¨ăřŔţ˜†V˜9ž}ŒAôo×Ţh†œĺ˛ŠLkąˇĎxăÜŢe؃$ńŰř†‚cÇědçÂ>ůÍřąEQĺ&'ŚŘ$„4Œ qMaý‹Íł%›uĄ‡đ-bVBüâONkZ‚kBüžü•XAߛœŰ[A4¸1t,ȎăGĆľá•CXQţ™?H}my1›ó}¸}kń iSŕPbYč>†şţh?'ߓE‹FŹqł~fEQEšéĄ5KŞYŇńI—.řĽÍdŃTb€Ś وž~zZłĆô˘ďð07o%ĺ˙ńófîŰOăĆëÎŻÜXV*pçŘgƒIÍKąÚŐÖ’ţŐY.Ca„^™Œ??É5J-ű”TđZËŽ(Š˘(×YIDé%G9†ćƒ{Ů.’EÔ.r6öŚż:05ń[™ű›˛-ńCÄw?ȀܘčAÉ;ďćUĽTf‹Tŕô)˛ăIś””oDĐ6;l_ßrbĽžÎI =”Yž†.] 웙˘œ|ZĂ3~jEQEšŮ‰HË ÚĽ…řtřúÓăŽWx“§đEŁČßű?6ĹyĹ žúuß…4K[+H‡)e°Ó‚ˇnKsTń›9t…ß~IMKß/'ŮB4ë;ˆ_4EâÚavéłyźĂťîó…f˂…ƒ]ŹOÍOQEQމXŐ?´}ó–“ÓĺK1_ĎYLÉ&głX÷´ďĂS›—ÄĐüĂGj3\żÖˇ"~u–ËMnŮÚ8€2süŃÇ\ż‚°%ąĎŮVl*(\‡úRŻ$3OvDfٛšh7ĐO~Či—‚5$kÖcç"čWW°˘(Š˘(­€>Ĺ=aŰs&÷ ^ Äăś=,^Ĺĺo囒Âm‘T:ÂĘWF輸Ak1 Sp6NŢ8˘MˇČÝOwUnD_8 Ś(1 ÜS´ƒ ˝†uśoDĂ×.šH{Uşƒ5á#̏›ŸůĄĂ°žŐÁ~ÁkeĹżmëLzh`„‘H äďé´ŕEQEš*ˆÖŕŻÄÍo Ś f€ČöˆÝˇ˝[”Š$Ţ˝|…Dübç&~čH°żFŰZ[g†lË í‚í"˙ůšˇŚú[(× PÍ^vqe1řsçh°Ń5ÖgĄôŠR™ÔˆÚ‹ß$ů^ĚŞ´;(e)ţňÔŹŸYQEQ^i8ć—Ďb3ŚlČâWńĆ[ĺł$~+Yß\ۏn§Ď}ÉgIüRĘs{1MG9Ęş_đc?‹itĺĺ‚&¨dÚ8üáźmw’ů"‹đyřŽĐŠžQ|oTg%Ä>ô†ţŐˇq}ĽóNCQEQ”˙AüˆĎ=GŮg‚ ľš_Qp!’/^Iü¨S KoŒč?‹pĎeüöb@΢!3ô_< +uÓţ1”Ť‚%d#ŕQĐ@üŁc"xYŮ(ŸhľŚIÎ[×Wֆ-źEß›AřřgdN?EQE™.’ćrޡ;š!âÁí͐ϟÇűź$ęyséŇcřÚ7źůˇřQ{1 d}0fœp×nnOyYH[7‘ł—/đĆ[Ů,óZ˛˛?Š‘Tš]q››ŽŘkÜo™˙ô´zŸ˘(Š˘Ü"ď؝Ń’=‹Ű>K>÷,›°mH1Hą/a´ŒÄ ˘BërđPś˛)żˇr .~ËCfxIš…ď3`{—mƒ@9ŹúĹĂϢ#ńĺU1 OF¸iw"K,7ÇqÇq.C;Ř’öY~đá&ŹRŹčöˇšF‘,Z0›MąŠŔśŃnIo“ĂXb?…JBľ}1¨`˜ęd’PIoC^8eB˘ńŁp똤oáâˇ<˜ÓȬƟÚ;MëŐzýƒďóĘ$řÂČIŃĄřMšĐăx=?ŚŻ›pďsÇqœÎmôÚÔˇ˛85˛Ĺü†ýŞUP dvzŽĆ'”… ÔůćŰďĹöőFâof󽞄 |űb żHŘŁ#˜@šű­Ńw͚­’Ú\hŽââwckzI™łşeş˙—çeó5†\VjU5 ýîÄoŘŹŽĂÝ÷Ř\VS‚ĹŽĂqÇqœÎhr›Ő.o͖ŮÜéŃ#˘m=nČG“pŇÎoOX^˘SöJö˝XcěQŘXB ˛řĄčĺ;c\5ďֈˆlžŚő=W…Ť#W‹ó’hŻő h6ăwž'…žƒ\ť‘žX-bݙřUJxň)]‘ś1•v4Žă8ŽsÍa->YŁoΉß\˙]‡ćą’/ßg­—Ľ1ť0„e&@?ű%)jˆĂyQËöĹ )G+u?Š•‚ş‡ ŹOéřńĆŚĄ66\xŹűߒXUţČ<żHm.żđůŚTߞPї0Ĺ0Är˜Ěç]‰‡užó€.2XěCÜâÇq§s´š2f;#뚐ťíߎŃŢ[äśIţɒZ•˛#/#~ćŽBđŘăTŘęyTymW 0Ôűl˛1˘b(QíŃ’>÷E߂łĐńü„ÎrP‚…¤a6MČKâćwE8[< ł:™č™k‘mÚ ˛Ŕé3rűŰUÔ) :Ť—ÇŐ!nĐŁ. ŤüĐ–äÚR!ö":Žă8ÎŽC}ŹŃnNv">܄ž“ԝřQčÓ űĺĹӂ6‹ĚmR—†+3kľœěœóŸó-+šćń݇0Œ1ö$LşŞ—Ä1™ňUóXQ¨¤¨çĺPö3hÎgӛř1-˘rÇqg÷ÖĂs'×Ď7ž-ą‚PQu%X¨CöůޯͲö™ł¨ş1\4ĹKmŚ(űÚ Ű7é|âăXçĽZŸ–ŹłzĽl}ŤTLf+kb—#yŕáy[;Îâɨ‹Ć‚`Üá,9Žă8Žł˛X@âÜÖOœ„X[ëăŽD‚C…eŸ×§“ĎQŤ Ş~ÎĺafiłÄҊHŇOö.iîPB-AĹO‹ľ)k¨ćĄ>zk‰ëPôäuwBšKcaŘAŤHÄć~;š ÇqÇq–Ő0 ˇs°Nţ–`âWw'5…žÄ>~čŁŮÔ `‡_y7€­öQţŠř%ÍKŇżď~Ęƒůž¨W‡Aw˘Ţ—r¤ćŸŹjčń›ßj, „AżŮ˛PHƒqÇqgWÚĘőO›8ZWż÷+ÚôľÝw%ó˛'ŃŐR˙IV—šđNżő˙>Œ–$Ť čGsŚIÓ2ń?—•‰&Â:•c ƒłe!ŨŤzQÔĄV%L0ę,zÓ;$™„6“ú'1Łž,âqÇqg7Á ‚‘Řú¸0џ˙4 SXŤť ë&ieŹrBŻžţń< 0ťů˝ŘÄ$%=X€>ę}ÚU)úRާuféÜúyŹ œÚŕá:ţŃŐú o ˛é‘FH{é8Žă8Î.[Š míĘÜ đmďâ0čJ$$Œ¸¤0‚PIě7ďżG'Ěâŕ\˛ľŇĹYťŽ>-Ս’ł:_ľÄjVő =ntUŻ´˘žˇ)ĄĆ•U:x—F‘÷$í΀тYčžF˜v2GŽă8ŽłűaćKžżÜĂí3‰č˘;ó’‰Ş…vsʎaÍ<=ü‡u “ŹőŹ‹:[˜€jFě/ŁqEšşŹÔ*üú}Ůümz•f&ŸůJ¨ťDî,çY­˛bůžy•Ý“rÎŮúŐ3Xß"Ą×•ŕiq%ÖZYśâŽ´.ľžDUĘĹÉlu*żű˝Ĺ‚‚ ;œ&ÇqÇšŚQ+kýí2ČKMď"ÎßüO“<GO)‹‡=lšĄœúťôörKąŠa(q‡žÄ1˜$ ś+7’:F1š‡‰čečaąOžúŠęDÎĘCܐi_’+hîľëkgĺ6ß#ˈ‰žÝ\ÚRózć×2z•šwŹť?ľ>­KS ­Ä… +ç> •ŠëňąO Íłő5;$ÇqÇš–š¤ł˝ˆxáŻ.Tť‹4ď’SˆŮĆš0+GŁÂqř“jhę+ ľ„éA˜¤rۂ‘ě‡##(7I 0ŹŠlČôľň‡ă"łěœ9üp5y۝ŰËł˝~NƒÖ w“ĺăgOJď:‰}ˆeSt'~ĄŇB¤Őv@óů,ů•šËćÍxú¤y§­ ř?rÇqÇůoŁ_}ě•ČžœÓšóţvČýűňüP|ŽK ÂÖ֛ŹL ßj`đŰß@Ąâˇ‡ŠaÖĽAčKŘřűőÇQÇ|fÖçűˇˇwśŰ4¤PZEUÉKŤ FBNœ„(j!ŢQä,¨ź% x Š*…„? *V$)HśĎ‘PR‰‡FA"ިůŇ( *€“††&ĐŘť;~|gĆśŽ‘ÎĹĺlăzžŢ[ĎÎÎîÎüö$ŹxeąŔP.Ź*Q`dl,˙ŞůǞŇS7a??q=ËśĹƒD%*Ё‘ŢÉýŽnHŹ›>ţ ˝ń/ČG’rţ‘”żżâ­ć(ÔEG`>gďY˙NË~ä őŐÓ¨Şm {;?ź5Ż>b•œU4]ť¤ś=GJ)7=|'LŔ_HHHHHHG3999:::>>>6—sçÎa?Ţ&8ĺ/źuë'&&půůóçŠuĎďÓ4żÉĽK—ţŚ[pPnp•…ß}e H/˙J[ 4 XiH(+.5ĹjyätQˆ5+ŻŁ_‹˛duőä3tűޤĚ>2Çĺr×}Ĺc(5˝ĘžŠŇ: E7‰FĆę:ŞO aş͒NÁOĎ^EU¨ >—Si˝žňG|)4^ŠÂÇ~+ôüÔBBBBBBB:‘ýű÷ !cŘsÎŃđűvÁYrk6›­×Ž]CżRö/uŤçxćĚ?8Š˘ţţ~ŰëđgHŰżňĆú#'•’Ń;?­X=ău˜XBʚ‰E#uw-ÄR#¸‚ÇŠ•ÜafQ‰Ű,˙üc”›ßڃŸƒ÷ŒkY÷jŁß~ƒv|žŹÍĘ3¨ďEýľŔa‘آáÝ~ÜžPeß)xoŐŸOw5̡bř2ŕŘě[ÉÍÂ+ Yd[ąçž‚íŕç-766ÖÚřđáyăŃťÉç¸gϞůÁ;vě0Ö}dĹĺčĽ54 °_žl@>ѕEđFLŹ—xqąŔ ą@/uĂꊨe]čŠIVW"6Ź,EcÔşÇč׿Á<ŕžĺŽűJ'ĹÇŔ~9ŢB†Őżú }ř)É*Ę:š'ĺ _ĹwlŽK^ëü pr{ÉĘdďC}ôô'(3’ňű/Ínkńľ„„„„„„Ź@śoßî…văƍNyÎa?>>ŢJč7˘ÓŻu¤ĎÔÔT+&q˙śĎöôwŢËyD%ˇöH:+ÉŞć‰ENT6Ĺ ôł3Ú?“7:÷čĐł{|%bŐš:ˇ‡_%âœĄěh÷QW5?ú‚Zé"…„„„„„Źĺ, ?Ÿfł ËrǏŻVŤh ќô|ćۛ6mÂݎ;ćo;00ĐöŮJgŘk2_z>e%M‹)Jƒ nË˙ •ńîŽÁOÔ +jQÔV• ąö†U,EJĐ÷†=7ť›Ĺž#,ě'Iaű_+źlqkÁËPvĘO\ŤˇîŇŸ'V×<&T×$ë!Ń /5ü,śY"yÍüáGŐ­×maĽYx!!!!!!!K—÷„\711ánjŒŒ\¸pÁ#đěŮłócŒ CCC8ľwď^´ß~†tJĘ"E’~­ľ>tč …½{÷ütb?22‚1˝˝˝Y–Ą'Š" °żżżÝmť?`ŃF˙őő,ţ”Ň)xh70ńŞcOmł’auŮUŸćÝ&ЉŐr–Pă ó˝c&—ä°ç¸ŤífTťÉ˙FšBŇíŰňË_ÍŁX‹˘ÁęÄCЍ[űąF΋ëňz űądŠáçTÖ;÷šT[OKꐐĚÂđs˘fłéÇ ăđęŐŤÜĺäɓ4§>d÷îÝčA?8aŢůwć&‡r3\-1żCßř•×/çŇ{đłŇĂŇD Ewkid+°ÔđłöŰř¤š{ ˜v¤Nńe1+]Ľľœ…áç3>>Ţ ?d˖-8Üşu+Íáđć͛BtNNNúN ‡Űśmkűlmœú”˘. Ý§Ď )Ť$ЍAn`ĆJŕz–Z)ʂ0я<ŽŽ~WŢý›]•œ¤mˇšżdM ň'49äř“fî=ť™wÝg>Ę?‡ZKˇiănŹ|Că‘ěa(WÎS6S7ôÁďPą× hË"şÖMłJ&Ş9ž{%Ż“ḧŠŹŽWż}ĹŠŻĽ^´Š$ňËűƒß‰'|Ďőë×é?ě×mˆWđ33ťŮ˝ďť›5J¨´¤‰ľR­ąÄ"&aŁ[ú!ŚöK‘–băRQ°%ŕ׈D[ęB@A?DˇDę7_@˛´ń‹1ś†ÄlŠÍËśÍę6{Ç˙sνÓën7in˛{…}ţ9{÷̙3çĚĚsa :t褡}űö8#qÖ_iYßůĺ]}cČřˇfÝ÷zŐ  Ť‘Ľ¤ű‘jŹ6`ˆwŠP6ÂtŢLO>­Oœ$ká]ŕß-šœ(@,˘—†ĄƒÉ-ęčÎĹÉ<­ý˜žóÄžčrßš6ۗ:žKĺńšś ;ľmAyśĄ~ů%űäS48ŽwŐ†QRínŤţŢP)l¤đŢÝÔWnrŐ4ý+oăÓÇşâ]H$‰D"éOzƒßŋł,KÓôŕÁƒÖ˛Úśmۆ SSSčÇbÂîÝťWZ–`B–‰ř X˘—_ňĆ=$ŁJy6FjŹ•”‰ŐŒMĘVÁNŁ@ŚK+Œ@ľŃ~d‡ýîý쫆™E]x:ǎńŸ3fm˝yGÚ{KúöSň6_[†ž ťpčœëLuŹ;>ó5ańçůCó>6§ů7ô‘Ń'vQZsĚăŞˆę ŤvHśęęóźiͤø›VЃ5XÝ}ﰏôľAô\ZNŤÓ‘H$‰D˛öé ~ČŢ˝{1˛eËô?ŽţŕŕŕÜÜ\< Ć$I‚ÁëŔŽq‰Ź Ă#9”ŕ̏JÜUc˝¨1JnjZ}̓aLşÁŠ!8›ştˆTݨş˙łôÜaúŰߣń‚_ąĘšóá<Ó°-Řž8ÎC–Ľ‡MžlGqŞďřÎűHžbć$˜äŹŽąŽ{Îü|ZńńÖĐűő@Igu0ŐĽjE'Ľ(˝ľÁ^wŁdŕlń‹ÚČTN3úĘ7BEń¨Ě`~G&œ˛ÁqHźdbbbĽe= pmx‹CĆůčkĎş´bUĹ&ĂVŐ(YuŔ{”–˝*Az”@SŁźŻŞ’*ť¤ŢRPV ˇao˙°yú˙Ë_Ű˝I–oĘeԑłŹ8Ç0Ň@8 třgÝŢaWăóĚȀ#ďřRr źˆvů×Sfęˆ{čJ?`Uƒřn˸“Ĺl0Ü0\Šť­GřuylÍXuIľ Îˇń…ÇđáŃQÜÓ><¸÷ÁşöŚż˛‰D"‘HzMođCšÍćčč(÷ďß?66†ÎącNJłř+Y¸sçÎ÷v&o(ç~‹‡4™<ˆ!ˇÖ{ŚNm1Ůţ‘jŹ6`(i,ŚŐ<ŤŰˆ‚÷jyZiňl˜’î¤Ĺ¸jbţ°ÎŞvŰ=ôŘăôüč÷ts—˜pQ­8ô;[çĐĎą{ŮBq&˙Ś#ÜH—Ţ ?üĹžň˝Ű>ńu˙ÍoёŸŘcţtBżňŞ;.ϛϓcčęĹ}ĺMÖÝé×̟OŇoçö ˙çíWŸÍ?÷°˝í.?€‡-yވť‡7P ;ÖtgklÚä95ŁĘ6Üj˝5S_heĎwUĽ{haÁ[ć+×0ˆÖś̞ e•H$‰Dҡô?ŚŃĚ̌ęäŔݗ`Ó4Ĺú+îí¨ÉS!`ĎňHT‚Ăˆ]Dý×/ѝ5IćUcľÓĘ Š: PŮŹ˘“!p űBP6`ÖjĽC”95Ź3` Źť¤ĐĹ}lĆ` ô ˜ě´¤[˜•°r$SÓ˝3™;AUŤéŒÉç0’Ârč š´gbšËÁ¨őöĘ˰ˇüłÉ8Šażc]™łĄŹáSó§ŐŢăˇcö‚\ŇÖÍ|]%‰D"‘ô–ˆˇ‰‰ -I’~qźť?==]ŔŻűŹľvëÖ­ĐNŢ-ˇâs% şw˝°é…0_d,™<đĎP‹G^9EwÜC ¤W3j„íÇ ŮŘw­“ćTožšĄzŘO˜Gż´hŽF§çÎ[ގfŽť6Ü%‰D"‘ô+…Ä ›ŽĂ§ľś˜Ů=N],.,ÎvűđÖőĽ[8śV' F°SÍkłt÷}.5I…TÍö›Cë§Q l—Œ"5–§5űĚxŲÔâ˙Bđץ‰b™˘„‰D"‘Húu…ëčÝüVœ]Ňéţ\â˝â°ŰÝťźÇxŇph2 ië‚)Đľ—çi×6){U흈ÖIťŞ)Ť;U÷YŐŠ ë÷6 ľA‡Őç(÷:v%‰D"‘ô1ؖŤo‰Đ–Čpy ÝuóŻčk­—ŻůŢc˜Žyć_ –łQ€ţj‹ý2ĽĂ˙IĘ&흈ÖI#U&ľ‘*Ě_|ëĂw\ú>ÚG9Yęąđ‰D"‘Hn]ş9;Ë˝G˙kš8¸‡×¸vÉx/öóÜ i^8 Ě)ôiÓ^֚o?Gj„Ô†ž‹h4JJůݟ¤S'C¸::˜ľÂg3ȏ‹ĺůÉü$‰D"‘ÜD ‹ŕ@V”ŃBç…i7zťKK”4ZI™;ŞLގĆPQ ČĐ%8Ź:U˛iŐŤFú.¨˙“fC#] ď‡_]‚q~­ŻŻŤŠ—ćń2÷>EóŻűP Ž‚ą9ĽK$‰D"‘ÜúhŔĎłţň˙˛[żĄ˛UeÇ×Ú{Î93{öž?ç\üó&˝Ú%Łî2¨„ ًŠ"%˘KE…ZŚ”FI”E˝1é?‘ˆFaozQ$e‰Bţ`Ši™‚ÔM˝wö^k=ĎÓďY{Ž’ĹÚG{žw™5kćΙýĚyń‘”ÔBńż‘ĂçŠŰ!żnFކ•4p źW6+7–ž7Žĺ4şÁĹľO–čmÓ &U}ŕß,ş0ł‚ăHŠLnG'É>OôĎ(Äjoęx%}ŃägY–eYÖłsśžBƒŽ”X÷,ą}Œ/šL\Őú‰ř° ť­ ’[śÄmJŃD¨Ď͸˜§Ąšľ–ŹI<çb‰qą›ä‡NÄCÎxvޖżřlţ՝˜týŃńsőuý‰~–eY–eYĎv”ą&ąÝá^ ßýž,Š/ŁŇeőuEĘ• 4@ŕh\#n{pq퓕7Ĺd â8šcPN. Ŕitu`QÉE—śËĐVâeySRs‹>H’8řaY–eYÖóľ•Ä 3ő8Šąď%aŔAűŔýéMo“˘Ŕ^MŔž›‰[’‡ᜱ.ß .Ž}˛ŔcŒHüDô!fľ`żC˜˜ŸŚb֞vßňĂ<]%^Ť“×…‡1ŁwĚĆ>˲,˲ţ;|ÚŁÔď{Šô8 îprÓ7yűt¨F|™ą×`ɈŤ¤hN¸­ÁĹľO–ŔĆn®žü,áD¸ÉnG.žź}ôQ̔óH[ń N¤ĂVoçĄsÔ řç`Y–eYÖó9Rě# ěƖśąĎcľÇţ*ď¸DÜr50Cn+š&şet3ńÍŕâÚ'+ă઴š<ŕqľň 9üJšóś”Âzâ,‰ól%{„q§(P_\ ö×`Y–eYÖóšŒ:˝†őÝÂ0‰E"3U”…PJ¸ýGÝËÎׄŃť‰¸ĺŞoƃ‹kŸ,ƒÝv‹Í¨&7:qŕtůŇő-­Öƒ jź(A˝—ژmâƎýˇ€QgZ–eY–e ^‡ŸŘĘő7Ɠς÷ÄĂ~ÓčjPPşJü2čChĘ~¤'nJ~Ę:䋟Gˇ\h{\äśŮ5şńuôŘŕ2gIŻn”JÜ⤖˘†őĐץœĺkŻxó¤půGčô¨ú{ł,˲,ËzúQŽ+!~ü1ţäľíňÔvsƒĘ9Řy܁Ľ v‹ä*ź1€2Š N)烋nĎ —SőűľčÜ4šš¸%šIŐ0-ź—<|[uEŁÜus~×ĹrďýJ> QZ1÷Y–eY–őL-C L‰Iůť|řSR*nGsŠD EE`´ĹnĆJžiĆádhÎíuuŁ:ŕrŠ…čçŻ{˛Âx ˇ^/ŞőęX80şĽŕo˝P~{F”R`‰˜Wč‡fY–eY–ő\‹{Í%ŕ†ô‹¸űۃá×Čö!ЈʆÜ8”ľ¸@ĺ˜7Ł­¸1ć|"n1¸čö¸p ¸v0m“Š:lÔŃmQ1%ˇÝú›°5!7’íxáűůž{T|BQ¤Ă°ÓéX8ô×fY–eY–őô˄!5 pRţAđ/;Ć_ýşœyş[=đjru5XJ> NX4ƒ‹n+şŽBÜXFó䖭›KąAť‰+b×Ä/¤ŤŻ‘‡ţ’“˛‡ćÁƒĚƒ~g–eY–eYĎ,jŮ2 ţőäű'qÚIúÁ­é HšČü›čç찖z[4ÉWƒ‹nŻËď0řZLWn!˝Ń˘+Ŕ׆üL^užÜxłď˜{ŢQ'y(ýthwbœŸ´,˲,ËzŽľĆnXšÔă3pp†[‰ ˙ůúôg崗„ě Ŕ1źGş™Š ÝŢV*ĘÖWâw€=)'⦫ӎĐUăßý^$Á,A80§CĐA¨ű"KŰĎ+aNH;ŕWfY–eY–őĚRŃ=ą×­Ţ0é}’]ękpžô;šăšôŠö”3Ĺ׀S^łÁEˇWřšĽř†Ü˜O9$フoý wǟźę<Qěě‡Ă<ÝôŹČߔeY–eYÖ˙<臕C]G?űyúŔUrćań“äÇÉWIe5ĽÄK^äjńsČňłäšč*ˆń)ˆ|rí"-ż[~ą¸Š]…}ę_ż~eĎN=‰^^€ß}“ÖŻ™ö´hđ1â‹Î‘^É?˝MV­ú Ě㔀:˲,˲,ë)áˆM‚˜D7ąKü“\÷eyýŰe~ŻšŐ°›wĺB÷ YQa‘›ä‡uVYŐ?Ő? Ž‚ÖBŠfËlkŕˇ^ŒXů=›üžý9tWƒy+7á|¨Ďę‹kĘ>ĚœŠÁQřó”Crţ;ŰoÜﻛDšÇů.0EĄ4đ@-˲,˲öią0'Ö{ Ő)žbD8!żźKŽű T!7OEv˝ˇ‹˝9Ah~ڎ˝čÖŔË~ë_ł^ؖ|ĹeÝ$•Sźç§X7•rĆ~Ĺ,ŽľŠĎŚţüěWČ{.‰7Üîž@MůcK^J>‰ůĂÇ5ičąZ–eY–eíĂzîéMSˆcÂ&éăţ‰ťŚ˘–~ˆż _÷59ú>9|n;;yULčШPźí2Ż"¸ÎW4ŞŠl˘Ţz+őĚޛč˙Ęçy:zŮl茳âßBW~œŽż1ýâ×Ô>JŚÚÚ{„Ď%„O$ßéSPl¤ÝK˛,˲,˲ţ=V)őčăL§¤Ô Š]öÔÚ˝‹*A…aţß?ČwÜżýůĚç⇮>~ô˘öľoNçźZžT–/ŕńŤôŕşťypłŽ\HsŞœt˝\Îyźî‚tô˝Ý]]űĹř­›ĺ–Ë}ňăÇc˙ëŇúˇ÷ˇŠ˙¨ř{)ÚÝOľëÁ~1˙‡Ťľ,˲,ËúżâKBę9éHBXNV"A•X˘*P˙ý‹Ýzj 0œ¸ AíEA,­ƒX"ˆ ¤ˇľ#‚m ÁNT°°TDÄH [A°Đ.……)4A]Ď#wΙÍ8žOâ}pżĺdvvÎ̐ę/óÄjÚ0FVÝů”á­śÓŞ0¨Š˛Y÷UĄ…ś,Şđ\^Ö^ci°Y]í­âëeŹŇđůÜlRśˇj„K55v?|nŢhß/˙‰#Ŕż]›TM)…0+šQüŰhű-ĆŕRŰdM\ "­üTĆd‹‹b76Ůöe˙6ŘęvŞl?E“mu]}‰ÄÁ˛ö6EŞĂfeťŃ`Q?ńu[{ŮŻÍÔ ›™âořĎüˇ¤vJ>e荺\ŽŻ6óšş[*ž~ąhâol1ËĘA!ڜ+ťXľ'ĹCÚ~kĎ\>žTb•ĺ_|ŽßŞ/%Ů~)ę‰1aŤćKů'ţSŔ*ŠëşóLʲě,ëŒÓ ŞŞá×Óüˇ^LżÖ­Î[ĂťđŰB\}ŤÍŇ|gAňć͛'OžÜż˙ŇĽKçϟ?{öěšsçÂŕâŋ7nÜxřđáÜÜ\żßŽÄ\Ř|Ťüáéü’c,˙5.ˆő5??őęŐăǏďŢ˝{Æ ###ŁŁŁ#™Î×`lllóćÍű÷™yđŕÁű÷ďÓĄeYŽxVQq&,P}Ť(ľ_ŹŹÔZqžßďß˝{÷ȑ#[ˇnÍť.Œ×ŹYůsĹümĽ Ńxá…—/_ć‡v.“Žôý.ŕ' ÷Ułłł‡Zż~}ęşŘoaÜIť\*ŔT†y öz˝4łoߞۡo‡óö‹ˆ3Ş`u•eš”UÖâââéÓ§ˇlŮ+.ˇŘoyőĽńpćşňg\ĐynŰśíňĺËý~?žžG üXE1Ťâs~~ţčŃŁk׎ÖëőRČĽ¨K!—˙:ÜuĹĂűt˘qűöí÷î݋WŠ˝Ÿ1JX-‹‹‹ÓÓÓăăăN‹Š–:prrňĉ׎]{ôčQ¨Äˇoßž~ýúŮłgwîÜ9uęԞ={&&&Fž–ď–—^gY ÂŠŠŠ………tŤŘ~ü†şŽÓ3úôéә3gÖ­[c,oł4łwďŢ+WŽ„Ěűáć?~ź~ýúž•|1đňÉÎsăƍˇnÝž3ż*ď¨ÇďŘą#öŘp§MOOĎÍÍ-ýD}Ľuëŋǎ›˜˜č¤]:Ť3™ Nž>CŤ“|ÁÔÔÔóçĎC}u6ůÎţéˆřV˜|őęŐáÇ{˝^žyéˆ0Ÿ§`çüđáĂú‡ü„[XXŘľkWLŹźúâxÓŚM7oŢL‹ăó;՗TÜ~ůú§OŸNNNćQ—c|ćóAl;wž{÷îgŽţbżŢB˘úž8€ë9ăĎîi=TtŁ´^˘ťĐčEdő"dvĄÂ—‚Šz°Č —Ą‚ţvƒŇ }ŠěĄzčb‚ŃC„ŃŻDťç4˙Ĺ,ZŹ˙>ăüőÇů~6űœ93Ž‘˝g}7“üFăÓ§O'L˜`0Zdá…>|ŕw.A3^â7ęKzŕÜšsC‡ĺżČ Sç@ş#÷—Dőtttôé?`ă0VWW7bÄ ]´$nmܸńű÷ďŃxaĎČr=qGćü^[[[çΝ›ŚđŸ–ŘÉBĄ~uٲe}ůÔ8w]šr…3•$=móć͑HÄůŒIđ'zJ‰|Ÿ3á?ĘĘĘ8v2=÷^R&;vlýRBmm-ĺ˝ôŻ8.Y˛äçϟœĐtŔKöźtä“((y5˙óĎ?ޘg ÔGăŇĽK˙˙Ż0Čx3=­ńăǡľľoéoTŇȑ#%…JaşBž—••ůPŔß0ş¤nŽëöô@?ń†ˇÖÖÖQŁFY–ĽĂžZőőőŃ˙]Žţůâŋ1cĆčJźń&UUUž€Ń+ů’Fiť4їýJ§>ÇqhěěěĚËËÓQŠ ĎyRXX¨Ď)>Çż—/_Ž=Z—gĚÉÝťw}+  W팾ŮÝÝ- řAPŠŠŠ$AQŇ3ÂU(z˙ţ}Ô÷Ô§wDSS•7řńäíۡţTĐ+‰|ĆMÇŃ/!ţAű#—7nÜH‘EŮOGŹ;w{Bá rúôi#őI‘™™™‘HÄçŞâ’FIO.š—/ř†V -żoßžĺääp‚˛m[Fąš››ĺ-Q߃Ÿœh2gΜ¸ÁoÚ´i~–Đ+nšęeÜučorШ¨¨ŕřdY–ÎT˙x2oŢź¨ {<‘ë[ŹŽŽN)ó 6ŕčľ¤ŽŽŽŻ_żţC“/_žđH—‘HŠüGŤŽ­­mȐ!:G!œł˛˛šԧĄ×Ż_óŢ …B˛§nŢź‰…{Đď?rrr¨7Y–%ýT&sçÎĺˇH{őFG€žĹëłŞŞŠ#ŻLN}z‰Ňýŋ[§çxwL™2EŠä:?~Pş$ďéËĆĆFÝUuoĽńȑ#ÔËřIÉ~>ČËËÓŮIŻOšÜľkW°'ŮMRMŠ‹‹­ôéÓ§ŕj€T§ ľNîMşŸĘ¤ŠŠ‰ß‚Ô~jnn–ÔħYĽ:PUVVX¤¤>㲺şZoĽĚĚLďĂţĐŠ/‰Œ3Ć{"++Ëu]iXč\ŕ›ŁGrޓ˜'ÁOŸS.^źHK4Ŕ:őn’ÍňôéS˝§ŚOŸŽ˝ţ3"őőőF?ĽV%Mś  @şŞnpý-??Ÿ×¤>čČǓk׎['oß1|‡&]]]şÚUŤVɓţ“ˇ}űö´x¸g…Ăa÷úŔœBĄwAňDćśmßşu+Ŕ:u–3vǤI“¸N*˛¸¸ŘďĘbt{úőëרQŁźíUĆwďŢEUęCüÜż_ҝ—eY2żyófĐĹĆA{díÚľ˛§>tE˘\×ĺ‘zÓ­[ˇâF>6cÌ ‹…uöěYceö´PŻ_ż>0O"ĺĺĺRd8şHEÜ"ĽQnٲ%Í#ýÝťwZ,¤Ž;vđ"4–ĽD>˲řţŋfđkhhءoߞ={öďßßŇŇ20‹€ÁMşă8]]]C‡ՍU÷Sşź}űv°ŐBĘZľj•^–zbDÁS§N]l:ćšŽë˝ ŕę>܉jjj¨{ÚśćAń/##Łłł3čb!Eĺććęźg¤>9ž]l|óx¤sVĐĺ@JŁ~´aĂÝUš™J\ąbEĐ5BęĘÎÎN‰˙tÜşu+‡Ťk€—ƒu˘ŽŽŽĚĚLÝ@ĽĎZ1•••hX”IOŻUgϞtąqđŢĄŃu]}ŔO҆.\¸ ;)%=cňâŋ`K…T–ć!+Ó0dČÇq‚Ž7Izˆ| nCkÖŹĄŚ™žžŽ{(_Ň8nܸŮLa°úMž}ű&+ÓX˘qožzőJ>DF9ăÄĹý"ęiúžĚőý$Â5üřŃ˛Ź¸Š])¤„¸›ˆś^ÜČg¤Aš ‡Ă:ňŔ+nË QâŸLÇń>™\ŞŤŤmŰööVšź|ůrT}e胕7őéUŞ_ …BŰśm“éîîŽţYşÉ¸7Ŕ˝ŁĄ$QáÔZ[[{ěŘąC‡í‹)---)))..Ţ´iÓƍׯ_ßŢŢtĽ*tޓ×ȑ#9×Y–Őkü;v,íY^Űň!r `ĐI/qę3:T4 ű AůšÜvom<Đźç&ş3yňdÎu’'—|çÁƒúíIˇ+ŔOFŠă,ÔÝÝMsßźysçÎŞŞŞ˛˛˛•+WNœ8ńŢ˝{ü|2$Ýgőœż…ˇ řCŻ˝ůóçKę“t'ŠĎ˛,˙h,//wczú@ĆÝAZĹźp8|ŕŔ‚‚‚ŠS§†B!ÝzÝéě씞’ŒÍ…“-Ď)ëßEţÉřŐ ščľ§×[aaĄíâÎecfggG"‘€ž$É9@č3kÖŹ¸EîP2ä'“ąłčŕ—ŕ>Ot$đÓĽK—dÇIäónI˝7óóóő'$ăö€ţfDÎÎNi.ŇhŒvsţüů(Ú @zöě™>mŮśÝSäÓ=zděh5×uyŢĐĐ@íò,öŒř×ÚÚú;&زą_ż~ >\ďDcWĆľnÝş("ôL"ĎOœ8ĄĂő˙HVVV$áÎÂď՟}eůňĺůç=˝g>|([{â’ązőjoŁáČÇsz€ăŕÇ#ô9Ú\Ǐˇműo"Ÿ¤>,XŔŸ€Ôqqƒp‡&Æ ăÔ'aO"ß9räH4֕8őĄšô“'OžČîÓ;1qöŁý{ĺĘĘ ÎoMMM=un(4Ţ˝{W÷š#űô9Ţe'N¤ hŰvâȧf4™0aÂׯ_ƒţ0@uwwóäčŃŁ:ěIĄ‘S_ž|‘ŕǓß1U0ńž:xđŕßD>ďI­ŹŹ ťzÂáméŇĽq›”úf̘at×uƒŞ`ĐkiiĄ­g۶ޏ˝âç>|Č"4žÄž€ÁD˙Äɝń‹Ç!' ŽĎŸ?S´óöI}4–””]&@ qgѢEö˜ŢÂSŚLéęęâß:ţéŁOĂO &ú7~âx"Ç[™ŕ§Ď‹ţ9˙ů/űŐSEׄ1€"Š/öŒXK¨DcIŹQä‡Ć[,QÔţ1¨Qƒ%;ÔX[Ńj,Ř0*‰‰Š5 ‚˘˘ˆ˘Rýžý&LžÉźçěî˝\ńî^ŘçÇćěŢ˝{fćĚ<óLR’ ů°‰Đww÷„„Ł-ľ`ĄaáŘącP}\×É :ĺď̟?ŸžCcŻqŽX°`ÁBÝCieŐG  Wxx8śŽýpMOž>}jŹľ,4(@yeuéŇEKď ÚO–ŠŠŠXăD}–öł`ÁBýH>ŐçœĺpmńžŒââbOOO’yrű€'>>>•••F[jÁBĂđŐţýűů Ś#üŕęîîÎo[´hQPP@ÔgąŸ ę¸öĆŰĚĚ̘˜˜¨¨¨´´4ĹŇ~ Š={ö ĆŁŽ!t¸Ž1Âhc-Xh(ŕSjEEE׎]u$Ÿ\­\†††âȆŹhąŸ ę8§Ą„uuuő‘#GúőëÇőLbb˘Áśš %ś *@şĽĹŞUŤŒśÔ‚…>˝ž8q‚Ł=’˙MzĎ~,X¨OŕT™’’Ň˝{wYĎ4kÖŹ´´ÔX;Íԕ+W¨Gޏ?źpá‚ŃĆZ°ĐP€ňŒD0ŰŔľTŻSa^#)˜œœ,ւ ę€!Ÿ?>bÄNzCŚŚŚmŚY- 88XčŞřřńŁŃĆZ°Đŕ@ĂlVV/RZËü&_đňňzôčI>Aűšş üo ř­üPřŐÉŔs„­i!˙ä|Ťl‚Â9gřOô~nÍ!ŰŁjĆÚ`ZđÜV€jô´*BţŽKKKŻŽŽ^ťv­§§''ĂF5ŕ šcÇ­ď 5(¤>×Ii3đ§°ťŞ ´8pŕ€jă"ćďďos_^‰fˆA? Š­rp hŃ/_¨f‚?ȟ5ÜrU ő˙kżý<†{M6üţý›Ž€ĺ˗sŐ×č˙°Šúđ/~~~ĹĹĹră6ƒżĂŚń>|¨ŹŹNÖi^ŤžăjŸŸ_^^Î;ŽiBh‹ŞlCďԕŚŐâmXhĽ.œő§OŸ„÷ë%t&­NĎy0qÉůţýűëׯďÜšxfÔ¨Q:urwwę˜8q˘Š2“‘D‡ŹčááĄE†ńńń:Ÿľ‡óňň***řűŠ™2MËb!\ź~ýşE‹ÔA0n‚ęĂëôéÓÝú•ƒV'CßBëńáˇoßrssKJJřóÚŞ óŚEűčéů—/_rrr ĄĚËĘĘ[ÝĐđCÄvŠÓtäŚÉGč÷ďßOKKKNN>\ƒC‡]¸páŐŤWô÷Ńp č8˝ż~ýęŐŤŻM}Ő'cذa˜'Š7’%Ž9]ůŮýřńcëÖ­;wŻ}}}áÜšqŚłt‚¸ő›7o-ZÔ˛eK0ŹGŸ?V\jĐBJžŒŒŒ+V 4¨[ˇn+WŽüúőkŠXaÖÓá%(đ]ťv3z–Ă’%KҨŻŕXřI•'é!œă˗/Ϟ=;gÎ8AĄűˇlܸŃYiB•ŚŔýÄÄDooo’.¸ŕʈk|´oóűLuz~ńâĹŕŕ`řlůŻüťŃ¨~Äi é˘Zƒüč zöě)4TřrěĄJŐĄĎhɰđöíŰQQQ@š”Ţ .”Ľ¸oȖÓY1&%%͝;7 ŔÓÓS¨‹ţů§˙ţ“'OŢźyó;w¸Řžl„Ýĺc•óüńăÇŔč/°9K Ęm??żíۡWUU)ş-ƨ:ŽŮ‹#-qMPQăbÁ‚Â^.'ůČŐúđáCTČtô€-[ś(N?_Áś¸¸¸&Mšđ<œ5k–3íq”~˜›xlО€Q‹ŠŠľŚăŔŚ\Ť5N‹+WŽL˜0Ą™bĆ$…ü÷@”%p—ĐîńćÜÔÔÔuëÖM:ľwďŢŘˆC t|-,Ž]ťf„˙‚pš“?ţœ9s&OBtA‡srrěًř&ľńăÇó˜ŕăƍ{ń⅖…†€lŕ%C€‡wďŢő÷÷NYK6Ăí˝{÷lnŠ{ ‚ź.˝Ş%)Ž”Őˇo_Ż°!BQp!Ą˜ăkΐˆ3gΌ9˛qăĆä˛Püˆń§–-[‚ ~ö왢‘<·<ȆÁHŕäɓĐC[ˇnňŽœĘ„1–÷ß(iÍ#ä°S&ÇÄĐ (mcB^ďŢ˝›>+‡×ľ pŕôéÓ͛7'9ĹÁOÎKqť_ż~JÎRŽ&//O1SîqđX]ž|™řSľÉFEEÉ˙u8ÚBűŕőž’’$Ř@MŔöŽíë*ŕşN@eeĺ“'OöíۡxńâAƒyyyi>gBĚňňrĹčnް€JÉĎĎ ´‡úmÚ´Ń/1ŐFďíí-wdT,ź ˜gä9‹Ďđ$ߌ3ř|$č=ŢJđQŤŤŤ;¨‰ňĐ$$FA¸téRWěœ%–.]*ü×đ<Żđpq ‡•œœÜ­[77Śáů‰ $ g<ƀVE7Ę/^M˛f7n܀|nÚ´Šę Ž`…şI 5ŻÄÄDš^ĚĄu˘mpžaaaü4uŘ[ÖşČůééé| Ĺhâr|€|€Ě§—3!´Œ?$ ¤¤dŔ€Ä6BBĆĆĆr_Ěˆ-ŘSĺW\\nÁŒYZZިfŽm͇YźŢźysđŕÁ´ťpÖÜźśmۢ1őDS<ČEEE{÷î7nœ'|™ü… TţB§` xÍŢšs§UŤVŞě'xÄIoěŘą6żĎ×0Ž >œç˜V™3gNEEĹ_€múŮ˙ć͛ĚĚĚ'NŹ_ż~ňäÉ;vB$čXŐ<‘ׂ 0222Œ†ľ0eĘŮMa=sćLJo.˘\÷îÝĂQH`i75y  zôčŃĐIM (Ŕ$Ľű÷ďďŐŤ—VZji!9ŐáĉĹ$.S!#ř0¤ÔşukŮ-đNđőőÍÎÎćŞI1ăľ ›çΝ#q%ä3Ţzzz2ęZśřţý{hh¨Î‰@Áš9ňˇnÝęŇĽ‹`šaˇšNqőęŐşň…ň3˙ÝťwÓŚMĂMą%Ńž8ËČśĹÇÇ׉%ć5,ˆĎĽK—"""<<<´HłŸLňCZ/Y˛„ś3C–ž:u ć nśjfĘŹ¸mŰ6}ůĘÉ˙đáĂŢŢޜ0u Ŕȑ#ËĘƜ5pŒŒ”g^>u Â@v‡<%uŔ˙ Wˆ(OC€FĐž}{n•œđx={6ĹMX¸ Ú+WŽ”[źPÔňOŞGrôčQcă@ťWWWă-¸šcÇa´ć;ň›ËáČfř`+@'ÓÓÓŇ)L×?˙?Ę{š „ŕÜ˝{×ËËK5BKJJžđ÷é MA5Eůş°°Đ9öÔąąąŞmTî˜`¤ľţź”HőÁJžyóćZgJ'+6tčĐ?őß°@p<ŘťwoŐŃ—́Ďýřńă\ HY´hů%8ó‹ÍďCҖ””Lš4‰SŢKu˘tŤŃ~ŘD žQ‡´xFŤÝkÉ~›I"̘1F ŞŞ*::Z'=ŹYł†‡Î君›ĚOSĐꪴ ˆŢźyóŁĺěN̓’’âçç§:šPęÚ#˙ä7!€´Ł™s€“đŚM›ĺFŹ°°0$+Áeh(†xç0ňóóŰľk§sôüÄajřńăe5ú.Ü:ú#Ż—ČČH­âVßé$łę-ôp‡ďk— yN†B”222ÜjĘüÔWgHVa~żŚe´'ea ‹’ě+ČŃD˘%m‚˘˝× ŁAfE%-‚ś™…ś~´ ÚÚ^M¤MÓÔ~œď‡nnďç9Ç×W;ž]?ç=ď3î}_77‹đ…ˆ|ď[żB@@†)ëO`¸Ÿœ)‘§–,Y"Ô!ŔƁ—ë‹Ů_Á5RW`@ŔĚâP6uŤňëč҄„:O×X!66ÖcÓřœ‚Ńzvm—Ű-##ĂM•‘),qo“&MěÔZ"wďŢĽőîWÝůȑ#¨¤ r]‘äŽs ´ËĽ„ůO`1X(PÄúüŮ$á´iÓěʲ§ěělË4čůŚ2o"Ꙟž^šreÝFÓ˝{÷2ZĂi­âM–ţşvíZ:ux…ä˝UꈐKLLôMžw0ŕ‡z÷î-H˛„UIČ/^đ[üœň ż™ń3++kܸq<’=6UŚ0ö}eR/“eřđá.[€”ĽT/^L"Q¤9sŔüůóé >áŞ[233{őęĹŻ°ŁĐĆŚÉcŻRĽJ=˛*.ŇĐ(eŒIá@n=ĹyŹ:A/_v6ÁĘşuëşĂuEjœ8q˘ZľjÂFMšđůůů–F?üą;vě íţ[Ćm8m1šxúôŠkJa㞊ç Ţüř1fĚ=ËěbĎ!1Ÿđđpë_Ł|d¨7oŢ4jÔČ΃ΠĹűöíÓçĺË_3BYŕôéÓ<Ú Zá’%K蜞Ďzâ„ÜÜܰ°0iź~ęÜŻV­Ze5‡×r* šŔ$JJJPPqt…E78v;wNˇ‰7RqŮN:UťvmO)G}%~žzőʨŚß‚ł_ń׹cÇęŐŤg iÎĺ˙ĺ<+Š•qqqÔÝ7˘ČS]`˝¤sŐtқššĘůłĹ˜CZZĆŽľą_č]ŐSœ ŃKdd$'?ŽŮ ş`.€.!!!ŐŤWÇłF5kÖÄĺϐ" ťíœÎőĹ2ľĽAƒĄĄĄÍ›7oÚ´i‹-Đ+;věŘĄC<Ąi=Ŕ™{öě뎲˜wçΝB~ý]DĘH˛ËҖ  /×B¨Ś×LAůěŒCaÜŞU+˭Ʌ÷MJL b:uŇĺä#Œžűz Ô7rőaş3fč’ř3ĄróćM /z ;s!n$Îĺ˗-­?ú-V‚}ůň…ނ߆@%űüůł le‰vn¨ŠS§˝`Wˆ€>”Ń&^‚w@Hx烤Ç&ăœ#ęÝťwFƒ8@-SSž .äw‰T-ŃżBřěěl˙ `Nmrrr&Mšä)ŠŠéę{´ˆ—*UŞi‡+WސŽ™‚çŕęŐŤu˝ô鉿ë_>~ü¨ž——7sćLZll+ĆKi˝]KÝłgOE ˘‚‰˛†—C‡y9Ęőj#H‡Ջ;„ŻŰ_WLjɓ' ůůxÁ’““#›]mó‹ný'LŞ<îćĚBď÷îÝkÔ¨‘F岞z¨`j Ál"ô‚řz>‘Ńvúyţüya^wô- (D•ŃŽ?ţŸ?đ”Dů8ˆ-c¸{üř1ě˛ë}ĂĐĄCyl8@o¨źtéRKŤWžq]ş/^ÔďŽŃç2j˛vÎĹűš5ktC…††ÂJŃŃŃFÉEҁ„ű&•’çýű÷={ö䜨%BˆD=ËĎ#YÁŘaŸ>}n´ź]ž×Ž]ť[ˇnŁG‹NHH8|řđ… t_lß Ÿ={"'Z ˝@ńţýűoÚ´éć͛߾}Ł]ꉚpűö픔”+V 2„BZô `Ýşuî!Uúž?ŽXŸc9 ­!))‰Ö‹âF€Ś?~üHMM>}zÆ i;?ŠT޲e í˛Ř ôO@$őŒ3Ds†Č<ťt钗—Gçű­5ŕ_ňlŠčXœ˜˜¨´iK %q‘4¸ü=..ÎĺúC?mÚ4!aŤV­îŢ˝K+ßżď,źú‰Ş"†7aÍţýűŤTŠbôş?*ůŕÁƒ1Í9;Zˇ0&DŁĘ~ .ŢQĆU/ó°zEŔ—–-[.[ś œYX[¨ŠÇvxx¸]C$̞=ŰáĚż tä5jč"ľmŰöÚľkœŰ`ÖĐI—ˆ“íۡ“đč‰#FŒ° ¤˜˜ {*}_ż~]´h‘yŒÇż´iÓĆM‹‰ťô†¨^~˙ţ­3^S§NUęsS;Üë~ZőéfG A…äŤWŻÖğđ&ĚXęݧ=ŢýÁŻ„Wk4eʔWŻ^ŃbҋnVqg˝xńbďŢ˝cǎ§˘Ó0ňTˆ‚Ÿ? óh-ˆŠŠúôéS‰'ˆâ ?^ż~Œ¨~ýúzŞb´A.ˆ˝~ŢŒP2C—áÇ ĹĐX†Â(BĽÂőҝϏYł”Ŕźé­ßX¨9PŸĹÉ>ŤŒŕĚŐŤW7ęÖHQĘĘ×Ú"ř ńźŒ=š M3ŁÂ­[ˇ¸.vœöěŮłv¨yQ%¨Ť ôéÓçđáĂż~ýÂJ%vzzz‹-řĽ\lV4Ŕ Ęўĺc)VPfAóď2ęč)Şü#GŽź|ů˛ŃĹv  GčŃH. [’’’ź9ś,Ѩžh͚51 †çććŠęÔŠ#‚POąÇŤĹWŻ^ 5V Ä|FF†äQ_ŔŽÉ.+WŽT8‹ZŤËŠŰmϞ=óHv!ôeĺʕ$°ň>žŕEwîÜQëŠ Úy 8p`…w7;č͈kÄSńŒČ´˜‰źQŠ—l|öěŮĄC‡’““9úЋEWßž}ɕÜSŕ˘ůůů>!vĄ–ŚŚŚ:”ěÖ˛eKđ^]¤Ę8¨]ťvŐ˸sž‹‰ĺ'WlůŇ]sďŢ=Ő)H´€řřřăǏ÷ë×Ďc˘[vʞ;wŽěާ˝[ˇnUÇbüœ7oŢɓ'‘SŁF‚<:?á?1ľ•ÍNśĐ{™úŽŒˆ‰‰1gÎ|Ş7QmŃúÓŚŢĄ”´ˆRi𼤚x¤âBź Š(iH4M[­ˆD"(‘–Ňz|Đ Ş#‚ńŞŞˆĄ/ú î=w]+]YłöžÓ1=ÓÉ]NöœŮgďőř­ľ~k„vőĄ5œ(Ľ3Ń-Pą/]şÄ5ßÂb÷îݢ˜ Ĺ處•ĺŚď<&ܲ‘—bčы/ćŽ%ŔŒ5ŞŹŹŒę-\)Œ 3gÎäł)źŢ÷ďß_ô…ޤ†+ŢŔĹŽ]ťlŹ;âwďŢvťÝĐľ§sçÎáfm×ŔŚOŸ™ěNX ;l§N˘Í#ß ÜŚĽĽńťD:óěčۡŻIłëáh­ZľJ[|¸ţÁÁÁjšđ˘pNœ8!@ëç痙™‰ţý[ŞŤŤľnŚ5ą}Jpx–——ŁÚ(8ź€DGG×ŐŐŽţQ+§ů†#Úi@𜈢?aʀÉN-DY< ÍnĎ TÄP G÷>€pK­xýúuhh(VNîĎv‰•˛nÝş=~üŘŰÖüOxÄa]PPŔő‹üőëWƒE/ڙ3´‚Z!ĘűŸ*)zMMČGüü|1uňXXKü¨aýüůSŐ^R÷''œ9sĆ`ŢćNHLL|OĹĚöíŰŰőiUQQ1tčP‘ě˗/ohhžTłňáǜÝАŚő•+W:ěH‹EP5ńě]´hom´NJJ˘AU=ĐAgB|ĄĚjăČ˝ çvÄdgĘđZqíÚ5Q…ÂĂĂĄ”ŠŹ ?Č CÄ02räČŽ]ť KRSSl†ŽO QŮuNNŽ(Ax$Ož<ńaţ#áúGEE™iÓŚŽŽđ"}ĺĘíA+zőęURR"4„2Ť˘š‡  ëĆĆFo加É?~ü€qO ĐÜŤŞŞř~^*MâĹgLńĆŁDHŒx\Ă3fŘÚ: •t•+Wv\1ő:^p ů—¨Ž˝˙>T<3ćYĎÓdȐ!H¨ź(Ľ8´Í㉠őéÓ§â+0˙Ç0şśk2ţ›žžntđźÂs,qDĹĹĹŃՂą,[śŹ#ˇkőĄ5G;“„„hčƒŔ‘Áćç 6LŔă_Lđë,  ;;J=ňňň Ƥ<‡`žĺŔÖÂÖ˘6úˆ Ą5cá ŕŘŔdqaa!î1‰‘‹č˝yó&w '0\7OTEÁ~?}úĆs3""âýű÷†’˜h8¨ÄłI+Ü"˛tŢźy•••Bm‹Q#E{`Há}J-)(šššŢe}\çşş:swĄň)))ŢÖ×AЁP4 ÔsUĄ==ţœŸ6lĐƂGjҤIŢ5Ę\3;věPg4¨~@nůfÚOŠáâ-ęŞŢ*ŃÎn7nÜa˘˝xń‚ke‰JÂ3jËţKE0Ű . NlŚcКű´˜>}şÍAáI™™É•ŁŽ;ڞw”ÇŁííš -†žâýô”äŔVQ„Ą)((°ľľ!Ą´7î5ŃÇĐŐŚŚŚŮłgS§żż?d9YM„ĎŸ?‹Ö&Ђś@[qĽŕ\ż~=((ˆc X%ä¸6ď(Bąž={Š*ĄFȤ{Ąô¨¨ œ–””DA!ÓBCCĄĺŒ„NXąŃ^íÂ÷îÝ+řžˆ&Ţ[ZZŞɎŻS‰Ž…RCj€ ­#ë#úŔĎŔŔ@B-Łż"##÷*´đ Fcţ/řGuúsńâĹVřÉ}áQƒ4ƒ’VŠ‹‹ůˇžĐ+**BBBxvŒ=şşşšď!=ǎëĚ4‚÷śmŰ<1Ët\¸Vvť†>Ą?Ȝ9sh–M™œŻÎq˙iu›ľ"Ú"ę0uęTŢ h=nÜ8Ň wv°˜s0›áżNTęŽÖedd´›éÎĘâŔŢ3ËAzőęEBŘŕ_*c'@%**ĘEŤďÜšc Ú9>EVÂĎďßżc.Ťxăƍż]nԏ?őuéŇ/ .++›y š|ů˛Íq°ľ5Vz‚Ÿ]ń^aaĄŸŸŸőĺřřřÚÚZľ|iM ŇÄŻÝA&66ÖM—uŠpWĂ3;;› !Ӡٕ——Ě„.B”ë+~2eĘ5ߊ!bc hnnŚńR?T Ć7NŐÂÂÂŢźyC{ÔԆ'xF =ď˘0k@%üůó§đ‡şÚ:oäjţáۡoépňžęXŕ'rëBú§ĽĽ™ä IMMvtő–€>Çľœŕę &Ô××Ě4z~ůň…‚" Á+‘[L7xŽ?^Ŕ ęgUUŰÚڊűUܚÄNËÄ9¤XćÂ/}ýú5…FŔrÓŚM&Şş}ľ–ňš^B}V¸ ´^ˇn݇ސ@^Ç Ý€y×"|îۡWu˙wďŢŠT‡ďâŋí‹gŽ]ťÖpŹ$në)Đ%NƒYF۰RRRţôRWT2Xă^łf ą`}†Ž,€ěŘąƒjŠVsxŽ^˝ZľTœœ——'|ĺʕ*OÖvy.@_ůŐbTĄőŞUŤ|0‘NŒßťző*g)h°/ťÝŽ~ĹßĐÚĹÂŘŇŇhcŒ…;nŸ8q"î=ĹBňŁŢżLž×˝{÷G9ť‹Ţ?~\ĹĄœ ,řđá?Đ$Íľ ­'85dŞ2ŕm_!ę0kÖŹv‹DD„¨¨ŢŐ’}ňäɢ0š466JáţK—.ŮÚćQmxůúúőŤámÓĚ%++K ćőë×k'Ăes´ĺBt.Ëó]{řţýűmŽdƒĚLOOwŚŞ{bÎ,šÂ×ćÜiÓŚqŻŞS[9О 8°ĄĄÁpŢz<'t ¤ę?˙ü՟5Ôz‹/ŤŤŤ-ż]+---ááá¤%K–m čl Ăšoß0‹Í…b9`öԂ;¤¤¤ÄÚ{ݓsçÎ9ӓ›p˙ţ}^< ÇZęAî5ü˗/řLZń.\髉Ľđf Ă7¸„Şź)//ˇąFĚ;2ô㡼ž@\ÝÔ˙öíŰ&™ á†(ks˙˙âŠp_]ż~˝k׎Î*•xCDŘëÓ§Omm­Áúu§bϞ=¨>cbbˆĆĐBčĂŠHNNŽvÔ叞ݺuś`š]‚eeeКŔł˛˛ŇÂ{ľă¤PI]ŤnĚÎÎ&ćoSŚ|9wî\í]pÚącÇř'p”qÜă6ÁöbSxťŔđčŃŁÝ;źsë6RbáRťwďVVˆ‡¨5–Ň˝7hĐ ď5W)55•sÔ¨Q@ç„ŐÎ2˘´´T5D˘bŰB‰ŒŒT˝§b˛¸¸Řë HNNáś)‡˙ŮŻŇŞş.|űŇ^­| L,„ĘŤałMDő#iüŃ$I4׏&*Œˆ„,hđG…T4_mž,ł"0Œ l I’F55•÷;ߢE‹ĺÚű^óœs=×÷ëůqŘ÷Üł÷^ózÖ_UWWó]ĘL€văvť ÓăŔż€Ńyri ę;ޚvŽÁç˜1cT`ŃľkWŽťă„źĄ ÷áB´YYYĆÖg `mdk{öěq1ÎĂăJ° ľ‚ÁĎE‹‰ˆm”••…††r‘Ž]ťf°d!Ih- œ Ż~ź,¤ĽĽŮ.żf׎]ju ʍ¨°ýj/څ§/g͚ĽöţK‚FÚ`Řż?ß _ž8q‚ßn.„˘˘˘„ăÔ"żpáÂF‹Ď†­ýěŮ3質üsćĚńQ‰+,,ÉŽŚ?<§OŸî‹Ű@G yŔĎťtéŮ­[70ýEŁĽĄ ř`çΝ޻(2iŇ$ú^,lALLŒśZň:¸pႍ—šĆđáĂՊ'Ţ 8ĐřI´Ä^Ç{Žś@ńʏ?—/_.ŒŻr?đ}ßx č  33…Çđnö °NNN6~ií¸đ& œ¸eËďů;räHƒEż­ç~ Ńâ¸yUv'Ţđ$‚őƒŒF̸h÷îÝ\°aÆѿ ˘XŠâ-[śĚĽët¤#ŞďkŐśnÝŞV`č}öŢŤMm$ÓńŠ“6věŘ,#l%’ôţýűâŔ¸Ž;&8° ”––’<‚˝p ŸŔť´ó—Úšsg.LFFý‹ńŔŸB0úůôéSUGľ†„„@‘´ˇá ŠÖŻ_ŻVݸ¸8{­Ę3EŤ Ë şĺýű÷œöcpáa \,&n?~ü¸¨ZŠŠŠZ1ŠŹŹ,ŠFáAZŔżOž<1qxă‡îC)ĆuYšr%Ń!ŰkžšÎ*ĽÇÉÎ×Ó¨áa*á \{ö쩖/QŻnܸÁˇŰkO8sôčŃj"Ťo.^źčlۂŰsssyviéŻS§Nń~Ĺ+Dx¨nýúőŤ°żđţĨp<ćIľóçĎŤ’c!BČۜĄË §|¸HJJň’żhČČȲ˛2:Ą éë8Dž ŮóňňZślIGMm• ÷çΝ3Ť,…ŕR 4H¨†O¤.ôžËFŸŃ0Ľ-ôźv획ňŤ ždÉä`äUŤVŮx)|­ŇN.•QˇŒˆ/á/ˇŰ­ nŔ‘#G ƒCůÂbEŸíÚľ‹ną6[ślŃÖv.dŤV­üšJ<~üXş¨¨ČđL,bÔ¨QÚa‡óĎ   •Ćű˘—‰÷ZőáeII‰ZšT|˙ţ]s‘ßě\ş1qűömŰŻn(8 ş^-ƒŻ^˝2*îy$Ȟö}ZZšPG]TVVň˝ţ'&&F››đrďŢ˝†şŘ„ŔŰ͎;Ô)Iőŕźyóœ•ů_†Ă‡‹’U/čłččhN´l̸0`—H…éóSSSy6 Ľ¨P/^źŘPŇʖ,CŁM™2…_Â9rÄúůÖ!ú#ĐŃzƒ!11‘ž+effBuĺ4lÆ śX™Žqť͈‹‹sZL3 ĎÂ<ĺÝ )TúŢY ň„>|82pî ôŒ(-œ’Ü4¨"a•{ńâůE[Ď)ŻCBB^ž|I*ó\ţáF˜Ž¸¸XmŁŢ‹Պ˜˜{ )÷ůźyó¸x‡˛âbŘ;}útT"ŔčçŁGřFuşlÄĆđđpqĽęęjÇÇOŽ&ŘŞŞŞŞE‹őFII nţüyXXˇę´iÓ8™7!ßœůÇ.ĆŘyç⎟zőŞE—Ů‚~Âř5ŃŔäoÝşľśÖ?Ţ`‘oúRľĄŕ:55ŐS´s1ŇÓÓ-ëí[€.@Q´)̑’’"vŮÎýÚˇoŻ­œHć)JËËËmź´Ą€řţý;ÍZ§ă›äädĺ´Č,ď] ˙˝{÷.~o=ŃŹƒË““#¤Ľ˛Œ&­´M‹đůĄžCż đe\xX}EEUTDÓRßO€^€é%Y´éƒ‚hĚÎÎö÷Cź{÷.** ŤSťvíjjj¸đ&żtéĘŻ­„l›7oÂŘҋáLˆ^q) 66ÖâÖ!X<ďÝťWoÍý?,ĺkć̙4˘zĎjXřĺüůó}$˙ůĺ˗˜˜¸R+ކ?~ühŰś­—ĂÔ6l˜Q— Ů]=ö„çęŐŤÁśœo\AŹvěŘá%$đŻĹ‹Ă÷ĽĽĽ0‘ńÂŐ§OŸŻ_żňM‹Ä÷Ž]ťV JŘ˝{wUŁĆŻę¸@"Íņé eîÜš3 5źÂŰ">ťvíę%ľQž.]şXźŃ×]Ţž}Ťő;ošĐâ!ÓĹF{%)))Öăk*/8Ů{uƒˇoÝşU›/| ĄříŰ7ĺ4Šđ đ„ŃŁGÓFL.]ĂÓüőë× ź§&""B;útŽńDKÍÎÎŚ8äîkö ‰‰‰|ťZc˙ ^PŘţý÷ßj)đp ł6Š$¸˝,++›0a§OŸč9Gă™P"x,‰ĐB#Ŕş¸¸XP>+„“ö=z”ß‹OOO7w˛˝†:uŞ÷áAč°cǎĺďĂĂĂ ŕ„ÚÚZĂBR‰ß¨QŁ\Œ0kƒŚH`Ń~R H iđŕÁ˘š‘đXЄĄŹ°eŽ>Ź?~ü¨Mm!̀Ž Ţşœ>}ú??Ai+Č FEĂÇÍ=//Ď{v âââ|q{ƒ0mÚ4Áú8;EDEEMł˘Ě0îŐ다¤$ ^ĺçN(ŔŠ+Ԛ@΂‚Ć?&˜îƒÎBty¨ŠžbR˜˙:xđ 8}Ú¸J4mP‘ßśm›:ŞŔ˘Ę™š˝ŒEŒ‹m|"‘°r8¨œ••ĽŞ)˘~ŚĽĽiO0q/§ŽŤWŻV[˙çϟMŸoTÂ*ŇP5Z~~~BBôđáCŁ.a6ĄV9|b ‚÷[ˇn­-Ý0`šœ8q& ݛ>,ŸŸoqcˆƒxýú5ď"äĄ yyyÎňthÓÓ§OťĚTAAAíííz—K¨ŕáČ ‚˝ŸŒŚŚ&á]ąŢľ'° źhŃ"Ă@6óŐŕŕ`Hň´a/A5€tŕ~BĘ2´ż v •eWÓœUjjŞŮŃş}gÁ&Âś˙ţ‚źëÖ­Óíh<„ĐuœŔŤ \srrlgĽw‰sěŘ1 {! ˝wvvę čIŕZXXȍΠ1\łłłmü(y,w݉'Zë4P:]ŐţűŔĂĘÚÖŐŐŮř]Ž…ÉŽ;äNO (--ľ‘IĎŠŇâ… F'ĹjjjÔ4ş50Ä ŸËÉJ¸3kÖ,žThœĆ&ů’P…'L˜ŕ Cßŕíۡ!!!}úôьŚ'Cż khh{xuşze!¤ˆśśśđđp_HĄšÔx iöŃŁG†ŰŞ ¤wóćM ż"<{öŒżĺÉő_>ůđáC­{ÝӓЍ÷ăǏŒŒ —úIIIą—OÎĐ9ŻYłĆ%Ľ3fPzw\Ďş‰iMˆ ź nf;OŢ0üřŃĎĎĎZ7ŕ3eĘ]ŃĚ€Ź ?JĎE¸†ŮŠ:XżÎ•Err˛™˜ÜÖßž}ĂĄĎŰşSZlÝşUđ:ŕ*ƚŢœjDD„\LSťví˘U8)¨ŞŞ2$Lw6nܨ ëmœ>}ÚÂ?ŕc#FŒxýú5ßDJ+Ť Ą÷ËÍÍ呢u  "ž?Ž•*ş‰ś¸˙žŹƒçĹOŻ]ť–ť?.Ž\š˘÷Nťôč{)))Z÷ĄÉ,Ňiôƒ"ŐÜÜ,ŘŻ‚%UP¤Łhđóëׯ0úiF7W[¸™žžN˛+Ž6癜œlxRÄcRR’Ţ=?¸€ôÖ˛eË=gΜI”<<‡ŕâ€'ôíŰ×:yÂđőţý{Œ8o(}˙ţÝeN\ştI8Žƒ@›ĆĆĆZ”ÝŹŹ,xĚFś4ÝĐ555ŐB1"S\\LTA=C@ś‘çPA^hţm&9Ĺ 0ŔLIbľtéR+IvÇĚ­ÁÁÁ.Łz~{Đ7@………f.A÷A„öövzK‘“śśś8˜ÓHČ׍NÓô.АyÚÚÚƎŤ SfON›6 Jm…ŒZĎĽ2d˙_ž|š,ťá0E六 +BQ;sćŒK 6ńäh„CCC…uŕŔEü“ˇ ˇoßÖ,ťbţoPPĐÇů&v•ÁkYY™ć*'ŔżoßžÎâ,nÝşĽI-?EUU•÷žţólíçÚŻţ͛7şJeŃŃŃŃfŽH"_¸pÁŸćq Z 6⇔ýű÷ăó>Ôđ555šÔKČŇ]źxQ﵅j–uf€żâââtVÎşúůóç‘x‹`<4BŽ“ô(Ď?{ö :a—uYpă%K–tvv’÷ţÓGϤ4¨1ŚBYRR˘uuzšT§ř}RĘ ßSńěAţĐÜ܌ÉŮÚľŔéˇ} _ŹŽŽĆ=ůwëëëuVmwW$°sçΞDŞUî ň´çž}űŹí6l˜Ţĺ*č …fţüůB[Bőaaa}öŚ \ÜźyÓşG >œŢuÜ ÍĐŇŇâďď/D¨Ö˝ Ŕúŋ6~T."đ“OF<= dĘËËuߌDm^^ž°˛tď޽ÌHYÓ QŻI5‹[ ´{÷nţ–ƒœ @cá…‚ixa¤§§S ˙ƒŒůJłlă ;䌌 ˝+éńz­ˆ­ď“a ŇAË­™‡r;ßž}Óť—Zú7¸Î˜1Ă̝Ȋ š˙¸q.zeϞ=źúĂ:**JgŠă˘‘2óćÍëIăĎlŰśÍ{]9',–-[&;¤x†ŢÂBć,ž>}*đŔ?%%Ÿ´Q=Ú Ó`rr˛K;Ť¤¤$]ůŠ­ŹŹL -g¤!C†Řnz>—áâŔÖzÂľ_ż~¸ƒ…Ĺd‹ÔÔT3šhîůlëŕ8â0%XAű•Ś***T;Ú§OŸ€6‘ŚZœG@uuurpÉ?GýůógđkccŁđua^Z^^.żîmČŐmmmƒ ÂGř ™ŰTŠ„ ]._lÝşUëA¨ŹŹt›‰í8ĐĎÄÄD<‹ať…ë]ťvŮ{˛/7ttt´KIsrrl¤ńťláÚŇŇғž?77WľŚ¨‡ÚIIIrXq'ëÜšsfú_ngć̸čßżżü֟82¸"Ě#kę4Wy ž yňä‰ÎH§Ň›P[[+D&UĽĽĽřŽĘ^ĘšQ>|¸Ą;ńQ˘ššŮp“ßÂńăÇisě###uÉ9JF~~ž0x"a.”ŸŸ_}}˝ăţWŻ^5´ç١oßÎÎNG¤ţřńƒnYt)đט1cČÝĂϟ?9žüőáÇŕŕ`—ĽŕŇ9›0yă*0bS^ܸqC÷š[âś­­­Ö¨ŽŽö—ôčěwîÜą°>ýUVVŚ;mt÷œ‡ĘcJŽ2¸fgg;Íô@ŻnjjâI•ť4ńŸ3gËAÎ>ڞŽŽŽřřxCłš“j[[Ű%—]€’h–% ĆiÖ=&7^.ÓŇŇč€ÂŘH÷Ż_żîÉGŃ ´îEjűöíz÷ŮDw+WŽäÇç˛ĐzҤIzwÚ^*¸yffŚĄăńypňäÉÂ[žÔ“Ž˙÷/ŔböěٚI—‚„WŻ^ÍŮzňiĂĄfŊ= ^Ŕ”)S„S8îŠň@Dľ’ lđ@ccŁîţ\™ŠŠ k=Ř!CtŠ÷đŁ{÷îľć €žżĽĽEWŔânfO9ÄČçÉ=*++<O’D#//;0-ř0Ë Do´Žçřňĺ duBŰ:Qj]ľjíđgęć6˘ŁŁš+şĚwďŢŐ{•‹"I苋‹ “E ++ËĂoűůůŃśXżjkkĺ–ÉAőčÓQQQ<ńźJ^ą~ýzz‹óˇˇý#JóćÍ\™đŇżaĂާĎzięťřőŐŤWœ!\šáúěŮłž4ü˜şd˜ĹdŤ™%Ě͛7–'§@¸>%%%.3ҨQŁźŃkц¨RnnŽT;==Lßë‰_\źxą…ÝQɘ˜ţ˘—Ć7oÎxôčQîdHś¸€LÔŮŮé8UE(8Ƃ „aPö¨‹/:KŰY h0ÇA=&>—€\áxëXştŠĄ+šáŢ˝{şőÂź¨QNż"§’Ď‹w<|řŔť9)áúÜšsşT&źt 0Ö Aƒd" ł………œ*W†7\HFb˝î ĘĘʄwxm§QŞ˘˘&ŢűL+řđRxˇ=::Z°IĽŒooÝK…ć4°Í;—ĆnQUUĹGŹVSň,D€ĹĆĆŞ2ňážŢcNwĆnÝşh îîĐĄĂׯ_UCL˝ Ćc§Ł 999´ŃNo>€mXXőzŃŞčăŢ˝{5Ťď2\X¨ůyyyÂę-&$$ÄŐ x@>yň$44TM‘w¤'`ŰśmÚŠ[[°k×.Ý)Čž?..›V[ NŒ\zzş[3aÎŃZ[ŤŤŤŐÁéýű÷4–đůÄÂË)ZˇaĂ’§>ř}Ϟ=Ĺx€“—ˆ>}˜đÂŽ–zčĹDÉ| ňRYYIcłŤ š3gO™śźOŔÖëýű÷ •ÔśÂ#(Ÿ“­m‘šR=HěňČYĽq 7PoxŸĎŘPëŒơ̋7OŘbBIä) ĎsçΚ­Ű`HiiЎ‰y OŸ>ćřűűó`@ÜťwĎýˆsX´h‘SŔ¸qăx3ľƒ –€RďΝ;AAAn㙄íÔŠS]]Őô}  óáÇMŤq …E‰łm ŞÄŽ\šbl ütţüůÖM}¸rŇȄϸ¸8RŠíÝßł?~Ž?~ü8ęăęöç`łtDD„8Gřâ˙ČÉÉá yARŢVtë­oi;jÔ(Q1DĹĆĆ6ß"Ş3°¸wďžÔ°°0ź„Ú<ĐUŔŃtf¸sçŽ ţĹWüřńŁ]ťv˝ů“ÓťyóڎůƒœţůóçŔŔ@ăŞřřńŁşˇE@}hoEEE=xÂN›6Í żPséţӈV‹ŕ)üţý›“׏Yăʲ111ŐŔí‹|:wî,†jGÓşąbĹ ž×ä^C ńB­‹7j,„ěŕzÄ 0`;ô:_ĂĽF¤‰ĺŘťwŻn)üďŢ˝ËwŮÓ5^¸ŒűŽ<˜ššęďďď`-• źŁ¸¸ř”ŽŐČÎÎćAH*>"ć͛çëăô† ţj„Z:pÝ˝{wˇ‡pĂŠg-^źX4ˆôôt/ZŇ6}(YÚޒŔ555ýű÷çĘlßžý̙3¸Ć: k*•Ĥűňĺ‹0Gł4‹Ôg̘1ƒúůůeeeiĘ<ěAŔ™EEEjRˆh|řđĄf…€ü%%%nƒpńâEšiMfŰ[¸˘Ş^ Á€ďßżŻYm 0Čdʔ)*s`N͡\ăYŰéR3räHšôDb P$lÚ´Iby}ł3233oľźÖíŢ˝[ˆésŞ^şt‰ěÂ.)Š |Y[[Ť5Ă4^H?}úÔŠS'Q”ĘËËísý˜?žębąŽ‰‰ŃLq1žâŔü˘ĄR‚çŕÁƒ˝MŚ9@ˇÂ…T܌TÄÇÇóhИ”nł¨¨(q>”Çääd <1˝“€C† ŃôĆ$›¤0ƒgpp°žhÝŁGźDƒ†Éőë× IEUG¨bňÖďmŕ‹Ž;†Ăąhp_ †šmœŽ 1Ďgdd¸jLôeHH^Q-ˇ i744ŸŔŔ@ăŠĐłgOË9[“<§`ýîÝťĐĐPîk‘Œ˙úŁFÂ]X*5ƒmĘlٲET6Ý^†?]ťvűČ…­ŻŻ‡ŃĚ÷žĄ`f3O#˛˛˛p/8yňdńű(őéÓGND:Ź[ˇÎLJ .TĂO¤yRR’i” ¨âbčĐĄ͈÷P­ńęŞnoţ‹_ž|‰ŽŽć‡8âţó0O^•|łtéRőpkƒS-Ń%%%b"`2üw#<ÎOCgEFFŞňĹŠS§Tfę‰ę-Y˛Ä­b}űö5UŰÁ/;°€BŞë^Źf̘Á÷Z ŒŸ˘˘"6ş˜8q"î"ćv0Á|ť4ţÁ"77ץ´'ő.ÖącG^fńL3/b>ĐdٲeŽŇJÄm@@Ŕ§OŸÄvͧŠFEEqyđŕ:33ł™F‘ƒ úŤtHAAÄ!żżŘŐŐŐęxĎuŔ_ÁÍD˙öë×O\čT×dgg›CĆ->|ř|üüü Ş:ŞmiQ0pŮaýýű÷ącÇrABBBĘĘĘŕ׏?roęN}đSÁœ5kĎ>W¨ŹŹ´gĂľ!&L˜Ŕ%%a!ŃD­‹‰‰Á->­-OKK6â“:NbbbsŽ˘:sóćMŽ<#""°ĚšÖZ„źź<ák^EI˜(Ěń5HmÔU^Ŕ“'OLŕcŔ“ž—/_v[ՁpII Ő4Í]îđ˘G_œúČSp,ÄęĽK—đo………jUT•|üřąńK­ćKRR’[UW­Z%fĎÎÜşuŤŁé°'ŠáęŐŤŐ]gâ–'dÓétŤŘÁƒq‹Ú^mN ŠŢşu‹B•ŠčČ2:Á2ö˙ƒ3..ÎU&rdffęfýލŽnOŻ^˝ D§óÉD(\TT$6Ú6Ô-GŻ^˝T ĹˆŘ˝{ˇŞĄ/ŞzćĚľ’óŁG6>Aô億ĄUFF†fcq m麘#22ŇĚ Ÿć( ÄQN288˜:žĺŘźyłŰކüüůSkC$ŕÔ7~üxĄ ţaűöíşaĚ?ńů“?­…ŕ3tčP=gϞŐ\ Ém|˙ţýŐ÷RŃ¨ŞŞR•4_Ď7n¸• pűömKčľäXŔÎŻ˘ŽŚC8~ Á˙[n 'Źîęüzá­é|bš–@ üźXábĺʕB:őăůóçuĎüĂA EeŞśś–ç”h.Bá—/_ZJß3€Éá͛7Şu<şvíj|Wňőë×~~~\1h˛uuuôďÚÓ ˆœŒ1Š’ÇiA:,Y˛Dl÷*ĂmŰś &*Ť˜˜ˇdź]BéĚiÓŚWu@DDç :B|ŻÎ_ż~…ŠDŔ7.X°€˙męÔŠ˘Şů Ňy\ mcN§ą¤`NYY™G^§5u‰÷î]]%1 áËE‹ľ‘€§°gĎ]ž”;đSťví čľô§†˘iĽŒ7ýącÇPÚ •  ÍdŚÍ)•Ř€IŮ`H!Í4@‚Ňô#3ĽAšˆ"š4P+P ˛Đl€¨$ű‘ $biŠš•–YaŢď{ϡpÓbÝľĎ=Ţôœ{}ýz~ö=÷ě˝×~öž5dȝ|.ü§ć‰›OhfΜɮfÌ?ţ¤S<==eŽŘ ęÚ!0ÁóŃŁGJK…š2C˛:ŐZDEEa+GC¤÷íۡm<ľQŇŤg?á\śˆúç7ÔfN(ŤčœĆ‘X„™JpüC‡Ą…˛Wh*=łŰĂ˗/ËIU\SCCƒj퍦ζXdV­Z%{8Ö/?6Ýѡ3P, ţŒŽŽF™‹Růƒ“'O:ÉvS ĚĎǏëŻ 8„ŇěááA{@II‰ř†Šm§@Ţâčɓ'ŠľŢÓĚNĐ´:ŇTĄ^¨Ë)¤•SšľčĽK—ě$S0OsžQŔ{§‘b+ąoذAsş šČÖŐŐM›6í2věŘoßžŃöíýű÷ŠT÷ĺܘššj FčŁGÚbI Q­ëx[î—UřůăǏž}ű*’rF&WŹXA˝Ëš€VÓýhřčh~JjME¤#Ůű÷ďëǗřˇ  €ŠVÍ7t/c!öÎY j ž‘hj6ĘĘĘč(**Ňg•FşIŐYŹ˙ôéS|ŽHHH`ÉÇh˜Ś8ŻŻŻŸ2e Kq­ŐŐŐŹŠeffĘDąŽ žĹĹĹĆň`"##őŤ< ..ŽRÚş(cu’ .ČĄĄîC4D΍ną{ee%íŒčíÓAZZšÎR” xڧ§gdd°˝™ T˘ÓőŘľkW‹Ĺ‚žš*ǝf606Eˆf͚ĽX÷­šđ÷÷WuSÁ˙9ŘŐŔEĂu+ś ÄŐŤWńăż*ZŐ UŤxQ&Šö‹U;‡wîÜьGńvçΝ-.ŇŘŘčííͨƒöS“mgAöŚ:ą#F§› XE*X8?{őęoIě3Žň@n—d$''S3dKčKĚr555žžžčŠ‚„ţýűƒäψ’èÓÜ˝mĂ>T‡ŇěělŐFBűSÂYمZ œł7nT%ÝčŔî ĐXČĐ'zNiiŠÎ"tŸŸďęę !ETUUág˛Ś2 ěFćΝŤ_€   Ő:Ëąž@îXKhř=Âú-Z Ľ7Ø;ŘőÁuł  ţ¤I“ôĎŰÔÔäëëËËÍÍĹ,‹Ú>HŁ6”––Ҥ„%ƒ]ú˝{÷T‡/ÂsÌtw9˘áÓ˘I¨Sb‹7jĆ C~~ţ?żĄc$Ö)č°üüüÄ\”m...yyyň:ŕĆrď&átxmm=έ[ˇôÉŔaYqouíŚ[ăE„„„ȁâ*!!ÁÖ NApp0sEJeaaaö,őóçπ€š"""Ä_"ŠŽ:/ćgčtôA ##ƒĘ<S2ěׯ|ŻJŃXűsrrPŻęaŰśm´9m{#Ó!AcŞ%6>ĐŞ°´˙—IUrő¤¤$MW¤rž}úôŠŤŤë` ÷Xźxąć‘ĹËŢ˝{묄dee1ŢŚL™B?PIŸbňôědoŇŇŇXF’Ľ/ԑĆĆF–BÍłXęÖ­›fGqéŇĽíY;oŢź˘˘"ś… ZBCCiÎą…7oŢ´h ŹĘĘʑ#G*R#–’’B§Ó'´o”7f ü“ dŔX ›ĹÇǡXčQĐZЊűŐÔá?–wD“† ęż7Żł°`ŕî΢îۡO‡ükŊ”üŃŁG744Вá`ŐĎăǏë;ƒ@YY™*ů+v555ÇÇYťv-ä7y–Q8qâs[HLLdf8ׯÚä8]˝z5˛GÓP ™_ľv!y3 ÓůW6Ćš-ň؞~ęÜšsőĚ'÷ěŮĂü‡ăúúz6…Ţ ŸŸŸB,¤ C`XDEEé\ˇ`ŹyžĘÔ  °°PßAňëׯŮRŕh'Œáž|||ŕc77ˇ‹/˛č3“'OVěHěďŢ˝łU4) cŢž}ëĺĺĽHu|óćÍx@ŐşĂŕáÇĚúÉĎĎgźŠśscLLĚŽ]ťšššŒeĚ0Ť,X°@ŽAĆçÁƒUɅÚhŽ0gÎĘ57nÜhăFĆâŋrŻ$żÉËËÓq?1Ř˝{ˇBÚ Đ“Đ°P'qdĺÂ###ŮĄdčۡ/Ndĺ m†ćČßߟ.5ţ|GĆ!::ÚžÚ 8věËdŒŚČIOO///˙ÓĽÚĘ$l}úôiY0´Ú–Ź&NœHœň,’ƒc _™­:]5Qýśe˝z!6}útZXjž1 ˇsíÚ5Íd‚/_˝z%ŚČ ŻS§N”şńăÇ;ţ8öƒN‹éJ?ff˜AǧNŇ1FĐŰĽK‹Ĺ‚™U˙iFHHNT/ž‡÷ڏŒ9˛EĽĽĽÔfĆ*úŐ˗/===ŠĚƒ   °_ž|“œœ,ű-8*HbśľćE€=;věPš•ˆPÚmŠJv2‰(âôřŒ ńź˙>ľ]˘ŐWĎÜÜ\Ę!î.Dŕ’%KTëă;=ž9sF\ŽfźŕY@öŘ2XôMPŚŮŹĚĚLšËP.˙FŒ!;huý‚űýű÷ŔŔ@şÎŕÁƒëęęđ3cóƒ` źE')€|j­ Ű Ţ?~Ź_ż–:uęˇoß <—=&‰îŐŰŰrŁú›Ř˙6Ł-ËŞ„œ?2'§ăââbƒNóćUUU…‡‡űřř,_ž<;;[ľö(§g AăłgĎt ť]77ˇwďŢ1ć|CQRR"'LJČ͛7U˘çńa XW‡ŒŒ gĆ€CB”+ęʕ+Ş9×͏(=›6mŇ7I¤2U+ăáSd}>|ř ś§Çßźyłć˝SǎKgÉÂ5==],"ž01>>ž}ěřSÎľľľš'˘j ŕ˙xÚ"‰¤ťŮłgÓďĄ,((0ďPbY???JŠć ¤¤¤Đdh˙FŹ"ĂĎçϟ=OᘋĂ]ž|ů2jÔ(ą;(Ő:6[§H‹HPŹDßž}›fKxB¤Ťí•"*YAcčd!DEEŞóäŽ ĺɖ%Ý ëTëbD ‹‹‹ŁĂ™]ś@[ę§tëׯ‹ďiR€\˝zŐŐŐ–B'www-Jľ… ƌQĂ`Œ;˛tDŸT)ç...ššš2{†ó)LJKKSH$˛ô.žBĆ äŁŮŠu›Şż“””¤ŘМ`Rjj*ú[űI†&L`vR˙XšrĽč­Ä YYYBç#–-[ľL%ń%ƒ{÷îiŢ{söěYń=uaç˙¸ŻÎĐŞš&|>°$QťŘP,ąD,KŔXPđľÄˆŠ`ƂúCą+ą`/XcCÔ¨QXbKl`oXĐXc‹ K4ŃßůžĎ!ĂÜÝ=ç^“sŻ÷őůqŘ{îŮݙٙgŸÉËËCćÓg|ÇĽĽĽqČrđ*TЍ7bůňĺŇlĽŔPţ… ¨ˆĹ‹Ł`ĺŚřyýúő`xgĚHJJâPĂ/ýD Ž ´jŐŞJ`ůd9B ¸Š0Pˇnݗ/_څĽŚ`Ń4hÂl–/ťoŒ5Ę'Ë˝硔ë Ăŕ9}útŮRپٟys Ď:pŕ@8ÜN`Ÿ?žźŒ¨YłŚ­i -QĆoßžu7‰‚źzőjš%ŻlŠ+ä Ι3‡ľAđ…„Ÿß`ڤ¤° |Ľ˛mĐZ2ýxA <čdż|‰&NŠe=tC† QfQ|äĹ7wî\Ť€EɆĽK—:ů í7qâD˗ˆ,qŃł#2-ŮřÂŃ{qďŢ˝ˆˆ(ýű÷WŚ„CĽ˙ţ.z— „ 8Vž˘”ZŹ Ó´öőëWšKˆĹž4’KCĎgN 33S!çćć&&&ZżôMÁj“'OÖEŹçw\~~žŢż8aÚ´i\ŒCJž?~đŕAűöíšLh€śńčŃŁĄ9;ÚeŰśmě܏ˇ˝Ž;'<šIm Ć„¨ˆĐçjőęՍʡvíÚ999Ą4Ć T“ĺŰ7ń@VYťví~üřÁ5>Mގ€_čpe”C6l˜íŤ4đÜżżźń1a˛Ň7(ĆwďŢݝˆŕb˘đO0Žžš+##ĂÝ$˛ęäɓśĐNlRjjŞdƒ^˝zéž111zÂčhٲĽí+öč šB fl]e˖ąJđĺO8X˛dI%ă—‹Ó ôsҤIň{<‡î2ĹCđĘ J r@ˆŢ´-śďąÚ0^…3’ŰI&Ź_żţçϟőíţ8%^ştIO?śœ}IOOˇMéˇcÇŽ*-‚vďőë×ňš](ýĽ]PN5%é7;;[ˇóǸÂ,A @rr˛\ß?`qt˛zI:!))ÉöšťUŇx\:čyŃłđ^´ÔČĺ˗=wÍȜččh:6ƒlP. Âsoßž]˘D ZYj? Ţxň;€´ćT”ěM/›5k†6*¨wP€ŘşuŤŇCÉ0ň›ŘŘŘ÷ďßëÓ˙Já7{ölËtcҸk׎ü%š˙óçOČ<Ľx‘Ô˙`J)[śŹ’:ÖŹYc .ň#NcžţřńăFÉ/ńlßž=Z-š>ůâů!bń‡ZÚUâT›UŞTa˛ $źL/^‡Xž×7€—Ďž=ŁCp^´ĹŕÁƒuűőë§\"…¨Vš‚ćŤaÆ 30˜B 6~üx—ËŚśjŐęۡoöŐNiiiÜâS‘ű>ꡜäİŽú˜›6m*§ {ÓÓÓ%Ÿŕ™ćńaóîßżŻôJFŕ˛S$“‡ę Đ˝{w{ČŕňĺËŰZNB ĘĎ*VŹřôéSž— M5~AkR‡ë7˜Ö/^zńâ…]@€Ť$r,SÇŃĽKşËtËů Ž\š"ëWą‡nذAYĆ_ž|AkŁX ńüéÓ'[(Ł ŢĆóÖ­[l0sŠńş_ľj•S4~wS}< |ܤINiă^Ţş€˜+§ŕj ČD˘Dßž}sužĄź’ŔB˛×-Ôië@J4%ż<ßăǏÉ*Ř -ޤĽ’Ť:uÍÚ"يۙý”÷+WŽ´D'¨' E˛FčVŠhŇżä#ˆB–§Œ=ZŻ—ŢtčĐÁfđĘTćyyytůşcŔ€ěŠhŕŔĘaíÝť7HíÇłQŁFzÂ!‹N݈ś+;;;NŕżŇŇҜRW"%%Eał;wB‹Zâ&*UŞt÷î]ú€N'4Y Ž‚*Vît—xöéÓG†Â…ó.PÎfgddôďߍÉ{Š@9QAâ–5HŤä!ýěÝť7ŰCLbi,ˇhŃ"Ĺ$]ŽčƒłgĎÖŞUK×*üŚrĺĘ÷îÝsąPÂh€ţ˝QSéӁ pÖéY*‹ĆШOž|ŕÂT o42!đ…ˇ@uűeH|P˝zuôźÓ§O'¤dš:uj°­5llů“(lżţSNŒŠŠşpá‚lFŘ}Ŕ?‘˝ŤV­r˛Aá˘nÝş-^ź899šxńâúÇŃŃŃ/^´ *ÂiÓ`[|˙ţŹ Dő ێ?Ž/ĺ÷ç?ŚL™bäjBbb"Z<ťČü<ŔԂ.ăĎ*UŞč7& pۢĽęřł<†Ý÷ěŮc<c†˙Bł“- öŁ˔)ˆ> zőęAÄnŢźy˖-)))hĐbbb,_iaůŘÉÉgÇţIŔ+WĂŁGţ#`i*ˆ_Â/t+Š‘NiöńăÇńăÇKÚ”Ý ###ŃÔ¸,b4^œvAb8­ƒ/•ś‘0tčPă!ːĽqćĚ}Šß…r l8źe˖´ŁQěá% ŔŸ7n”–„ł€ńě)bĽóĄLđYNN2Mö•řůęŐ+Z„Ş,<ƒĆV>|XĎL…”ŕ ôĄœ(‹Ĺ[{(ĺöíŰgfC$ĂƎËznŞČrPn ĹÉv'"""##CŽ,ceôˆ_nÚ´Éď^’‘8zL ř÷äWwlŽßóŁT˜ľŐhb„Ř{Őˇą*$ť%F툽73DJP!j1BBJíQUĽ5‚˘˘ˆ˝<żOÜ89=÷>O_ĽďűŠóǓűŹ{ĎüœĎA“RŹĎ[ľöěY—{|ĎĹ8?ŘňŃŁGy7ˇó=ťŽWŻmEsrŽmÚ´QŹĎĘʁ˝^Ú\ŹSSSÉ]:Ż#ń(ťřť~˛>! Çr‰3ü’ÄÄÄëE<¤|ŚŞçőë×bÓnHOFg…„„¸ŸŇ2Ý@şęQŽPĄ‚`šÍú, ‘fΜ)tS-7 Ľwüřqő#יfÖŹYœ6sŰiç‚ b+ľ ż:D™2§Ljs'Č˝{÷ŕ@ăŘČ6k֌ §Ÿ1îJ0ŽĽK—ţŞpĘA&ÜźyłgϞůĂՑ’’ÂÍWŢó…Â÷˜ŔđN:‰xńt=tčž>|¸HiLd<ĺ,čÎ2{ölQDzqŐ¨QĂĘýfÇ÷ÇÜaÔGdŻĐS=ŒˆˆČśďçžÄĆĆڕšQľŞőţýűՆb|ŕxhń {÷îuö!’žęZ˛dÉëׯÓTŤ$[ýł˛|ůr1ŒdŰ1éËiÓŚŞ ÂLB~C‹ěÖ­›1X„ŢÝťw˙öí›řŃĂŽp0?LJJŇŒß҈jŹ÷%K–ˆý-ˇ¨g$::Zŕ­nŁ€t˝}űÖŇĆ(ť$ůł˘\^Í̝dvř^p?Hddä›7oŒd&—"HľŔÍTü–"Ľł vęÔŠ3wîÜS§N=yňD•‚ŇľjŐŞĐĐP???Ž“Ü3tJ‘"Eââ⸹\%w ą~˘kbbbTTTĺʕé U8 –]ťvÝľk—Ňиsšrĺ\Xq´weíVüŠóΝ;9NHÎúâăăĂÂÂr꾣ÖůňĺoÉĚĚţ-ćĎJ˙ţýíj˛uëVĐi‘Ćú‡ŹżÇQĐłC‡ŽŹS‰Ţa‡*f:úýĎęCč´bŊlQÔžŞÍAƒ ˆóL,č”ǏۍTBÄgT•XlŰśÍýC…Ľ0˙ęŐŤ:´u12@O‚‚‚îŢ˝keuĄŠÇŔđđp!łÍúŹhѢcÌ9räHzz:tV Äž˙ţÁƒǍW˝zuÝ?'L˜ Z›ŢL}¤Ćyô“““]&^Ç+šW:ˇtÓŚMŘDML^Š gQáŰźyłąˆœSÂősä,…ŠĹcú㚖–ćŚÚB=3…”-[Y­ÎóšĺŠźĽąrĺJaŚćźTš§Nœ‰RđUž|y$żPĂr;žę{ xWǎŐś a3fĚŘž}űţýűwîÜštéR Poƒƒƒ÷îÝkäEř‘Gʇ‚ŔÁƏ˙âŋœ…ŕŃŁG‹/ŽUŤ–ÝĄœ ŞuťvínܸÁMđA”ËUᜠt =ÍHVŻ^Ýšsgńp˖-–Śł Ő1Ĺˊ'‰j V.ƒ_cĐËśRôčŒ5J˝\U[?×Úľk;Ł´^•ô=Dą>˝ĹYF֧ޟ?öóó˖9“šëׯ˙ôéSążW@ Zľj.~:{R˘ůóç÷÷÷_róŨ `žQ1D˝šßşuËÁ.ťT @Іv˝Ň셞Ć(;^ĄZ>ËĄĄĄz8ěň™ˇiť°bőîÝ;>Đřă‡A(ŽÝ¤I=Óôfj|ëÎ-ŘśmŰçϟë&;¸B|ƒ6ˆőš4iRFF†(‚Ö˜˜˜ *ŕÜ|üřQěÓž}{…áv6 6ěňĺ˖ ÂóXc˜˝xńâźyó7nŹç†C0ůîۡO?â_aőäɓđ¤téŇŸ5ň–ć9elRR’C š}űśÇTR˛qăF1ęÚŐ}°`Á/ć­ŞAĽŔňĺˍ …żć`şÔ7́]!!!šl§G ĘźŽ@r˝3Š´Ôsƒ>Ërőů/¨e(_đƒű‚ć‹îď\Ł”/_>11‘6ńq{Ż]ťf2#)*Z´čĄC‡ŹŹŐ䥣OŸ>í~hlӐ¨çϟ÷–Q’žžvdG_fÚEÖá!ŹžÓNŃ%žŔ>ذAƒwîÜŃQWüűéÓ§!C†ŕű–-[ž˙žžŕŐ˙ýG6"ĘF,rÓđ   Ž[ˇîřńăčÂiii>źrĺʑ#GÖŹY3věŘ-Z`DUç͛WĎ#܃ž‚1*Í˝^^NϞ=Ű;ëţť\mŁŁŁyȟ”(QÂÊ!ăăă*Eŕ†ŸŸ_llʇ•´xő͛7ŋwžé”äɓ‡Ž… Ž‹‹ŁMŹ­<Çj`z5úĘ·¸Î™3G¨p@ źš*TwTA@6+#~Ň[źĘvLĐ=Ŕż§W X´h‘ňƒh ž/PťTŠR”˜,Uo›7ož‘‘aý4÷YK•bhUşFš„&ŽFéƒFőíۗçž*%j­L >. A-ŔŘŃťU˘ţPä’Ŕ犊Šŕ~dÎ@DéUüÂ×­[ˇžyóŚ›Á徏#Űúőëąahh(hۗ/_ŕŻ_żŁ{ýC0OáIff&߲jŐ*üŐĽK—ďßżóÝp;lŘ0ŁuÇtpv“’WiC:Ž´ŠbǎJaÎvţeîǘ7ožŃ˙"JúőëgyśWţžŔF¨­'•zŘľkW+7žzőŠRZ/ ^•+WNHH°|ŔůR6lŘ €‹4WeČI‹ëÇd—œœLűp dDŞl-˛RĽJ48ГŔŔŔcǎéŽgp€Œĺǁ…şLMÁŽ?u*âw¤}Ÿ>}ßoƒƒƒwďŢ­×fś!Öż‡Üşu+_ž|5úđáž={Eäç秔,SŚ ‚UŽ\9]łfÍľk×rdž>}:>[ślíOGěÜšS˜n‚;bG9űßqš1ęâŠy622ňâŋÜQ:ŕ˙›"ź1uęTçčĐt†!ôůóç^Ő=‡R­Z5ăŹÁ§ł… z@ĺvj:(ŸvíÚŤ€ß†‡‡ż}ű˙úNˇ˘,|Xäƒ óUŤVçżPMyՋ됒’R˘D Áxbó'‚•.]zńâĹŕ'žœËr&¤†‹ącÇş˛’A˙D:”míÚľ7mÚ¤Đ^¤kśPÉ˙ťŽM›6ůóçOKK#ŻB:věˆăęŐŤG;ŁdĐčĄITTý‹W͛7÷÷÷üř1íIů† öőźŐKUˆń­îFşsŽ ‰‰y˙ţ˝°š‹š|§‡zXŽ1Â!"Üá+WŽ´|ť ňěŮ3—ÖL9ě¨Ĺ™3g~‡~ü’đ>yň$ň֘á4Żč˙zKôé VLž<™Ă([ĺíiÓŚ}űöď 0ÇváÇččhC(Ä+VÜłg.÷ż‡ƒÎÍÄŃĽJ•r@?eZ cě!CŠ+Ć_š˛R\ą … 88xţüů>4zŔ*}G„†pH­ZľxQó B‡š8qâǏőtUâą çL”zUDUƢ}ٚ”uzśź VÖěş}űvőęŐuČĽ5†źyó6mÚtëÖ­ QÂąË(źŸ&&&śnÝZˇQDPg2ęŠČöęŐ+..N@6ÇÚÍM/j,Ν;‡#tFŽá\č̏=z´Ň4śMHH€ćăƍł˛rKRěţýű#GŽ,T¨@~cGŕ žŚ$ŃaMtpH```xxxllěŤWŻxţëľ@ŚŠŚă›‰äážéŮł§Ë Š[ˇ.ęŃۊ˙˛ŔR π"""pŒŒŒř!ýű÷4hPÄOÁŤĎŸ?{@`*ëÖ­č‰ń°Fxž™™ii…ď]!ÂF (váÂĚ\zŸ‚U’““ĘŇćŮˆúńŘąc ÉH+UŞ„iĺ˗/äv¨ž$:ńxđŕîŽ˙ł_Ž!Q=o˙ˇk*ŰĹLŠÔęE ‚¤B•ŮÍ.DZž“BąŇŒ şĐE#+˘‹`%Th ҅ŸF†Š•šYY‰Ö ľĽE)EXfîŻóŘĄa~sΞt˝Źć÷ób˜3;çěĚ9ó|ŸďŁښ~;é6U(iiióçĎ÷ôô'KëăăCޞ‘‘Án˙WÓő“Ó%aËšŐŐŐ¤üR^ 8˘§kk;âĄí˝eۍ¸ŞĎŸ?ϝ;WŒ)ggçuë։^QmDާúkźC‰cďŢ˝ŁFR§~ÖN›6 jÇŽÜ>ÔRFbďććĆŜűQäŮ uź˝˝)ĺç瓙çdߑľbvňÜJŤ˘őPh455)˙ČČH&Ńâ]ŮŮŮl‘´Q!èđdÖQą_꿣-uˆˆ9rä˙tËRi\<çŇ!"‘ŽŽÎĚ̤đ—LŹ~1ŤŁ$ƒÉAAAŇ×ŃĚAwîÜqÜŞťOÍěF}Q$űě0¨ 7ęÔ×דôQř'&&:tčɓ'škë?'Vłt"a!ůJMM]ťv-ĺß;vt(ŞLڹφ‰)ڤ¤dŰśmô×)))7oŢ˙EœĎ:}ěyÔ˙çŸ$1”Œ+ľĂ† Sť5žßćć檪Şââbzíššš—.]*++ŁĂCžAskú;í?§‹ckIlźąąqÆ ţţţ”Č#‘Ëýđტu¸ç×yfż‚ôŤWŻŇΜ9óńăGőâűĄ8hžęoßžíŢ˝›TŽ"”6Eߋ–ÎŞ­ŔeĄ/k´Ž"n“ #Ů]Jšűöí#ŁâççGu(ÔŠS§†‡‡Ż^˝š~*,,ä6^-ƒvXzéţ¨ącÇ.X°@­düHgČřqIĄ–Ćj(:oâ_Ó ¤ńňňr['^~˙ţýÁƒŒ‰‰ 4™LśźŸ-7čęęęëëK.•ăǏ›Í斖i_ŇŤÓ â!ŇöŠÓq} ’î¤f˘>!źăŔ@ü;[+TôC…×ĎË qƒR jţdÇÔ­­e¨]__"­sëÖ­’ú‰% Ó|ˆbCu57(žmÍăÔN”ŃŘëĚQTQ'Đ.Ů`‡ îT:˘üR]ô+OŤůśĽI• ú^Ľ켍ŘڗˆžŒó'HÓlIœÎ_đi/_ž$%Ůżżú§ˆˆId=zäîîNƒńńńŇ:ëęęh<==ÝžOCEŮăǏKKKŠJÍÉÉ!/GÎ˙čŃŁÔ;v,++ëěŮłä„+++Ÿ={F%í ÷i˝™ďŢ˝“,÷+bÇÓӓž›?ŕŒý 1Μ9S§Úb&pűöí>@—]SEE)I^^˙I2~žžžšššäÁ–/_n´’œœÜÚÚŞ¨ęG''§¤¤$ť—¤6´ŇjŐUÔŻG^cAAhů4łůp:Đ%XQk2™lš>Œ}/^ä7BúH–‰tڰ°ÄÄl6ŤUdd$ý4qâĕ+W2ĺ liiaOŕJĹoqss‹‹‹łCˆDË'­Sg Ül@úş{‡‹…:Űśm“Ň ˇ”t¨7o{ů4_ëŔ^xě°Nuuľ-×'VaďŢ˝S~Ç,ÔđG$Ą¸qăéɕ+W¤ ÔFDDČ„††’(­ZľŠiΑ#GÔĎaýáǓńëćÚ$kŞןěύSŚLáY†9=1é˜LŚúúzÇ.€ż n˙˛˛˛xÄŮÂŰŰ–ĐI$Ą`öŠśś–Ääĉ|W!2~”îgϞMýÖÖV___ŁŃH#fł™ĎáĎliiĄçěÚľŤŻvzţ›šš¸Ç“,ß+éééŇ-š—€ÎŔÇbą$%%éť>"**Šß‚ tfۘhüřńĂŮŮ9..Nůmů2~¤3łfÍb—d]\\¨ 3fĚۡoů¨Ľ_KJJhňŋIžě[š¸ ńRÓ¸JËöÁ|NN7{ô­%űÔŃŃĄX“›/ €Î#N@@€tš8pŔQŤ 8l¤ůóç7ŽKŸślŮ2ŁŃĘďĘÎÎfâ3}úôśś6E0cÉÉÉä šššşł<őĽzÁš#0݇yš… jŚú¸T TWW+Bá žvxoş„XŢRŰÚÚJzŤďú( oŢźŠ ÚtQ4Μ9C’RPP yżđđpo‰e´qăFţ/_žŒ1‚ć÷’Ů2śvěƒ|ťfę1 ÔŚĽĽ)ŞoљOř#•••äëôAţPŠ>ĐGŠż˙îíííççGƏ9ˇk׎EFFrЉŠŠ*++c“ż~ýJ3ŮxLLĚóçĎip׎]tY\\쐁nÄáÇٗU'    ‹Ĺ‚D@ĎÂc*##㏮Ďßß_ŒARl­0ŕ9}ú4ŠJjj*S•şş:łŮ\^^~űöí[ˇnQűęŐ+.8ě'âÓ§O÷ďßwrr wč@ˇ  BžÎ×חťž!VXÇĹĹĽŚŚY€^‚˘/::Ú`0迸¸8Ĺ­\Q‹ě€Iǒ%KHXΝ;'*‰$/Źe€‰YD7oŢ8`é 'řeĽ´´”O=Ěő1<Čć(H4ô&LĐw}›'Ož”ę/Ä#Ŕ>HL>ţŕä䔙™)ú=Ž3˘Â°Á‡Ž?ŢŐŐľ˘˘˘ď× z–ŮłgFÉň3fĚ`Ÿ)€ž…ĹĹWssłfôITUUą5e:É/+Ôůřńchh(ÉËŇĽKëęęDűÇú|¤ľľ555ŐĹĹĹÝÝ˝˛˛â3ĐšwďžfĆ>|xCC?  ˝@QQ‘Žßc˜Lڟ?*żcPŇdč*Ôśˇˇ§¤¤899QůšbĹŠźźźĆĆF>‡ü^YYŮŚM›FMB´hѢׯ_łÚ“W ` BŸ’%úîÔrxúôi6ž/R ˝Äž={†XŃ1~!!!Ę•! °_VxŸÚ†††„„*0ɐQÇÇÇÇĂÃÄÇ`0ĐȜ9sŽ_żÎď‚ëĐÜ˝{W4{ ş\ž|9ýjąX¤ăčX@Qťdɒ?ż-[śP0˛Yńč&LFţľBśśś˘˘˘}űö­Ył&***66vçΝçϟ˙đáƒ8Yţ pf͚%fÖ÷ňňjnnćsđ‰č Xdyxxčť>â… "ĐđŞS=Č`îÎÖL^„‚˙‚Ôš|ů2Ë8Ô Ö!ĚfłC×Ŕߋė/_RÜńčë/>NźxńBÔ^8@„<<ĎÔokk›8q"ĺŁŃ(f™Ýťwsˇč X$R›ŸŸŻiö¸ĺ#<==Ů|)0a˙čóË K)))<×P‡%š3f´ˇˇ;z™üĺpĎśyófÉřI Ěŋ+‚ëƒßĐ˜ëcýÚÚZ1ËîîîŻ_żvě"$0#7sćL€<Yf4ŮeZZż‹G1÷€nů, ĽŒŕŕ`1ѰSTT$Môííí&“‰‡ĄX…‰”””°ůbí†  Kdů¨=t萘bXçΝâ@oSSSĂbĐ`0HńČljććfÉćÁőč$OŸ>uuueů…Aý°°0‹ĹË@_ręÔŠĄC‡JƏ]rű7iŇ$ń Rîú`˙č@)Ł˝˝}ňäÉ<§°Ž——×ű÷ďůÇ.€ÁCbb"7{,ylň~ll,›,Ů<¸>ŠěŔׯ_/Ľ•ĄC‡VTT°_™ëűeĽoW Ŕ`$ Ŕ`0P˛VŠMĆ˙ŮŻˇ¨ş6ŕľgFŁß̎šť˛Ţ!v&((¨ŠŠI˜úhŹ !ü'11‘—¤Xž˘K—.ýš`jRl+))Ńw“ňňrqš>é!űřUGG{<ň)Š"Ö)űŘŇŇbô›Ŕż%ˇ+WŽđVÂ[Laa!ŸĐç!.ѐúüďîÝťT’źBĽÔÇŘív6Óívý˛` <śŠŞŞ ll\UUełŮ¤V’Í#Ÿ†ŒŕgRUňëž}ű(éQüÓŘuńâŨP ź#¸Ýn~ĺĺÁƒAAAźƒPCY°`Aoo/ÍԐúFŠ>ţeddŒĘŢ˝{5Ô) $F>ŇŘŘŽ( ëüšœœěp8h‚ŞŞ†ź*hžŒŠŠâĺɏfťĂžŞ¨¨0úMŔDXäóijj ăÝDńˆýôéMŕK˙üM_ĄĚťwďFéđřÇííí#˙Â`ZÔSú<čNmmmhhčhJ}ěńćÍžŠĹEq­/đ×\ĺĺĺ>‚™0a‚´ţf”ß4Ą/Üž};$$„Úo"ÁÁÁMMMŇLé ŕ?úäśsçN}ŇŁ;üćęŐŤĹ3€&„ˇ˛˛˛ŔŔ@ą›(ŠbľZkjj4Oë;ˆŞŞ4@[1źÜć̙3ĘńÔV\\ŹĄBŔ›#GŽˆƒ*++5ô3qš\ÁÁÁźT˝Ś>v}ňä U.ęŔühŻvťÝâGm¸{¸¸JěěƚČć͛ĽŢÁ(ŠrőęŐßůQřSIJ}ůňĽ>őIXýţúő ÁŔ´Ä¤GWži‹‡ýdŻ- łłsŢźyŁ=ÄÔgľZŻ]ťŚývŕ€?î… >"UńôéÓQłŚĹÓŁŞŞ~‚‡A|&ČŤWŻĆoąX¤ŽĄ( K}.—‹żŰđ~ţ~jŁAnnîÁoăƍúł$˜ ĎZšˇhŕ5 ţ_hçç˝ăüůó6›Ru ~˝ző*-ńŔXźx-Zä#ř‘“'OJ{˜Ľ2>–vlqßöÎŐŐŐľfÍžôÄˁWŽ\ŃĆNŢn`äQőń-‚}Œ‰‰ńúEŠŽŽŚůâŢ楪ŞÖżK‹A‹îüÎî-ڏúúúřřx)ďQäłZ­Ň*şŇť€ąX=~˙ţ}ČÔÇŽďßżKg7SᚎσĆGmnnö:mĎ˙ůóçöíŰŰGُÚDppp]]žĹD #—$+ƧOŸJ§6˝   šOeërš {uĐáťş˜¸Š‹‹Ů>věŘ/^HIl?QYYGÍBß2˘ŁŁŮ݈ĎŻR€qx1ŇŕôéÓžS“””Äk–ĂŰ7ŔŻřîÜ9ž‡ŰíöęęjiÎ`ýÍććće˖ąç(Š"ś'NœŘÚÚŞ>˜„X•[ślńz|ą’×9Q€ˆ;óőë×)§ń˝>ět:Ľů<é‰ËŮŘívł‹sëׯ§źgľZŰÇłgĎîčč ů`BRlKNNöů¨Ž7mÚD“yi#ű˜ߓ٠˛˛Ňfł‰Ű8%7&55őńăÇbHăÁOúřđáĂUŤV‰IwńąŮŮŮ===ÚŔ‰`6ź<‡x$L^^žÖŸúPŃćÄöçşşşŔŔ@ö¤œF7Yü+..~őę•Ó餅nîîn–÷öěŮ/ĺ=1=Žö°X,EEERĚ#%˜ŻÓ›7o™úŘ„ŹŹ,Z‚˘0­ĆĆFťÝ.îŢ<°ąœĆ3żiłŮXĆKII™:uę¤I“x´ŁÉbғŃŃŃľľľZ7QUU:€ ąÂd›““#nƒ™/ŢŃďđŇ&**ę̙3N§SëOz^› Œ0ńäĹ*ńΝ;eeeǏ/((Řşukffć´iÓ"##ő5.–ż 4żš0aÂŇĽKwěŘQZZZ^^~˙ţý/^´śś~řđÁáp|űö­łł“ řëĆ=zD{ž~Ťçci˙7v&,,ʰ°°ŤŤ‹žű633sŊ6lXˇnÝśmŰvěؑŸŸżgϞýű÷8pŕĐĄCǎ;éqâĉ#Gް9l>[ŏłf͚2eJ||<;!˛Ý#""‚ěĘĆl@ť űhˇŰـ˝‰†]FÖ˙έy endstream endobj 1623 0 obj 641 endobj 1624 0 obj << /Filter /FlateDecode /Length 1623 0 R >> stream H‰|TMSŰ0źűWź#= ë[ň Ă =t†Ąža+Äm°2ś M}Ÿ 4ąŃtrŃ$ťyŤÝ}*NZÝ­_w˝oáq˙ĽţQ0J* ?o'VY˘*QӌpKÔĎĹ |Ďa95D2nçŘ}ďvąkFˆ|ßœ79ş ”hJůœî!ľ„ŮĽ,÷8†íKô° C—ĽiE¸‘jNű“…J˜Đr }t[p} Ż>ǒ\+ŮB׀÷GÚ.Œ]ěBa Đő'?dogĐi‰ćďü^š ÂѸźŒWDRĄć´k \ščRĚqpýřœI4E/fv1b)şôiž\cz12ćőqc‰ĺT.ő5?}œŠ‘.ś c—ÍŞ’ŐœŽ!´>őŠÍĜZY3'=î§YŮţJec‹)ŮťKÍ‰Ž–z°çY°eDYÎţ楥bńǸ; L Ľ żi ¨€úäš#4ĄœŞ‰Z§ćÜ8t*żL 6%Ź×<ÔjŇvCý@&q×uqýí˛(/°ëk×D8;+ëýÎCy㞺ŢM˝//btÍť+W!Ćđ ĺj~ĂnW p=)vJIN¸h&bŕáü|uuYŹę˘ŹklÔëÉ Z%7N§ŁJv˜ÉćÝ Ôlß^Ź$rţ33šÉôtvX…=R¸[˙`űHĘÄŃŔĄ{ÚD¸çŠáťH?3¸Ŕ­ł;0ä[+0‰"V˙ÓšJîIs}źš_ńÁ2”Ť™ąÂ. žŔĹv ˇIűg–ŔýŔ 91­ý𚈟ńŠc2Œ™ÂŇÓ§? ƒ™+\%Rq̙Ľ1ąÁëŠJ!y‚ endstream endobj 1625 0 obj << /Filter /FlateDecode /Length 27731 /Length1 46280 >> stream H‰\T xTŐţĎ˝ď̈́l $™ źÉ#)d1Šli$°Č:Ą ™,$AB&l&6YB‡Eäƒ""ŤŠř -*Z[ĄhUŹe ř ¤ý>ĊĚë™)ôď˝wîšgýďš  !‘3.?9ĽČíÜ ´¤łtlqĽË˝­­ń0Đź %Ĺsgk î3syďKŔŇwŞťŹňdmA#` ćőŒ˛éľS{GŰŞ$śŻÚ\^ę*i šą™ý­a›§ĘYĐľ˛Ë[°Ž×˝Ę+g×üeŰ,Ö Ů„o™^UěąË#Mx˝ŁŇUăît™Öł˝ĆúÚ We醃]Îű{óú{wլٜ7?ű|űî<ďńk@ ű 4ŐÈâ׌îB”ök^á÷Şďď­0Żúö}ń [ˇŢ&źMxÄ{ÔÁVďŕZđ"‰M¨Ă:Ô‰,ů5ň˜T–ŻŁ(łÉŘĘůlEë>‹ů8Œîi^Ă,•łŐRF:у*Ź˘1ćLÂye1b fŔM M§šÚ\kîŔN’™wŠ™ÚĚęçć—Hb‹ő؈ó´śÓ¤s”…Źů:f˘QNVČ,3ŕ ěxsP6:&Ř{)ŽP$ŐÉ ö˛Ý4ĚăŹŐ“QŽFŚ4RŘŐIfśŮ†îن˝nÄ>djĹQ|AÁj‡šĂě@ń4×ӂStLzď.ňcÄTFŠóNţ€?á4éôލRƒŐ5]}Ńüáč‡ œí.śü'Ýó™Č•,sB—W}hă\$%Ó8zFôUbłœ‰ŽŘŠŒ÷ö~Žč írť˛GšcyÜ{Á ĺ‰ĂkxďRWŞŃ,z™>ĽŻD†˜"^—ä:eˇrĆę⪟C%VanSWDšô+*§:ާWi#ľŃiş*†‹ńâyqS–ËjyTÁ”ŻĚRŤËÔ–Ť^§÷¸÷ŻŢŰfŠš šÜ‹8űőŘ̕B;Î2Ç%R)ˆB™4˛Óz‰i>­˘mÔDťŠ…ŁœŚKtţMˇčŽ“ED ťˆaŇĹLń‚X'6‰vŚÓâ[ń!cd‚ SeŹâŹęĺŚň˘bSÚ“qNQÔ7Ô&uúžÚa śž€€“?nż÷œŢĺŢď>o‹yÝř mŒBO¤rö.Śi|Ţ Üqďŕc fělOi4†‘™BÓ¨šjÉ%ÔH;ýšďĽ#ŒŇgt“s=ü9?)ˆbÓs˘TT‹5b­hŸŠ¤UÉβ›Œ—#ĺdY*gËZŮ yRţC^’ßÉ™L%PéŠÄ(qJ‚2R™˘ĚQ6+W”+ę$ő„úľ%ĐRiYfiľüËú”5͚cÍľNśžb=hý$ ťó}ŔďđĐCä"鐰ZôW˘Ä)qŠűy JdśŕNM´\ĚŁŃK­ą Ci,:”8ĆúCń†řN •Ů4šň1MôťçÍŽđ´BŞň>Ž+G¸śSěšĆLóĹMK0öÄ`ŽůěŤ$ČřBž'Ť˛W)‚Ž‹]2‡ťŕ¨’Ś:a—›°WVÓ<žNwVrĽˇx.Œ§ú^šb,wŃ@ůăyń9Žó=^ŽßP‰R†ŐčOu¸‚7ůVôQgXâ-ÝčϢBńˆÇ¨BŮÍŐ Ś^$Őp,ĄÉ˛ŃrSœĹ´+8'Ë١‹˝2[éPó¨œoŔ<,CľšľŞS9Ceô b• <ÝędŠbç˙ž*“xŚäŰ}˜çŔp™Í’Hîœ1ÜxB42mŕ9ĄpUđ–§Ř)´XƋV”ŠĄÄSPNxó0Ń|Í2Ě0×"‰çA˝YÇ›đ5^A-őž7žŕ›sŽĆ¨Y˘]Í2“„Gœů˘áŃóe´c)ß0íEŇÔßĂŁ|†| 3WšăîîÍv#ŠđK\ć*op„Qňú{NJf3KşšŢóČ5w™=)ĺćtŒĂě´ŞpYŇ3&Œž>,íŠC‡ 4pŔĎű§ôë›üdRbB|ŸŢ?‹‹íĽÇŘľžO<Ţ#ÚŃ˝[řc]ť„u  ě`ľ¨Š„D‡žU¨q…†§•ä[ë.¸‹˛Ő1´Bżšö¨f:kNý?Íô{šé4)LKEjR˘ćĐ5Ł-S×ZibŽ“ůU™zf\÷óŮ~~ŸaŢngÍYžŠT¨9ŒŹšĺGa&ťk ĚĐ3J“ŃÄlsF„înڈ4ň3"Â1¤Y „“2lzŚĂˆŇ3}2Öá*1rrŽĚhť˝ )Ń Œb˝Č€>ÂčœŕWA†?ŒaÉ0Źţ0Z…ŻŹĐšyVś†Ą¨0!¸D/qMrŇUŕ‹Ń%ăf/^ŽüߒwÍpÖ?ź-=ŽČ ͡ôxę5cKŽóá]ťď[PŔ>ŘVÄfz˛8ôJqtžĆŃÄҧAK9¤ćŤÄWŐ˝úJu‡OR8M3:é#ôrĎ´B>›Ç@^­}ŸÍ–~Čź›CóŒwęvcX´^ŕĘěŃO^íţ¨t-ęѝ¤Äć°.÷€mí|Ÿ y˜)}°ççüę>ntŢdɗ‘ţ47„Ąkœ‰Sçšů>Ľƒŕ)Äjü[%|"F§ŒBOŘŸÜgo¨ąaşćšîýúˇJ\÷%–ذ[đąž>yĐjź˙o$$ńńžąfđ™rŽiţő€¤Äš­B×Ýa˙>ä0śŽ‚!É żÝî;ŕ­é(ⅱ0×yo­Ą(zғ˙Ë}ŐEu]ńóŢťďíj´ŽŇľQĆ"‰FQ”ń‹j]E‰J4AXX6śâGS#ąąąImÇÄuPÄ:i˘†ŐJÁŽ‹! 8iƒÎ$Ôt˘ÓL1mc?ňÁL:m’1™‰^çž÷Öĺá›´˙”Ůż{Îý:÷ÜsĎ˝oZIL-ĺšN§Ć䚈Sď^š†Hn#~ĘúcŢŰăżQžąIˡdǔąŸQýMŤ>Ż -/?JY-ľ}›W8@˛ęçÇëěR,)'¤%ŤvIMÖd-‚r]ź1 Ą1‘ŽŸ!ƒzsťÇ‹¨”%%7ć+]aý/žšz“ÚÍ÷š—¤ëÝl3cŮÓĘ_ 0oDTƒÁ¸ó ĂŃčđu5k•6!âŠ0”š’Ł Nf:~ífç|FIr,—ĺpğĽ˛Ĺ “ír ţ8:3Śç"ŃEŁši)šŃŇč†v3˛1-ŗíPĎŠç˘Ű——:Ónž9˜Ë­*Żś(Ů8*-mMS*ó[JeA8ÔáĂw@eač´Ş¨9ĽKKZ'Ł.ԁχ€ÔŞŹe% ),Pž‚EžV˝˛}rž"˛VH…”7ľ+$u^G§ĐŚvŐŇů °tŠă?Î19…ĄÄč‘G˛$ƒŻ2|9}­ ĺřčęŠţ,_śŒŃ„?}ŠaŤřa#ŚžNß;ČŹôL ďéERöSXmŚ] mÄIzm›!/Ÿážhţ ,Š€ńśn5°(`m;¸/ĆŘÎăHŢAaďDzH/2ű0_ŢE÷u(7ЎŠÉX@Ű CżŃ5F3ŐBő› Ť‡ 7 źý2íň0O5žŐŔ€ýTŒsĐ^ďÚYš+v˜ob-%sP9îçyh“^ ěWş¨Ré2QŚrĚżŸőŔ2›W`œ}¨_Œ~“!—Ł<vŕQ@*0E=I Ô/Ó ŕ™Xąľn ‹śđšăk‚ýśMƒa٘—Ěů+ M]`ö€‡%ŘćFš +ľ,Š€Ë€d _}•ś‰ťIżžÖ{Hcx‰ŘO‰Í´˛; ô6:Ě2°Zb‡Ů'ŽR˝v…ćŁîF ÖąţĆËWý˜fŞ˙  #v#ž–aü=@ĆüťŒ‡ÍTˆůg€łDŒĄ   sýËńűňěëZĚőŠ—c¸™ €ť°/ŕAśóĎdŸóž+Eý Đö´Yǀţ+X;Ç$÷áţ+ݎĂĆëLhS żţ ,?Űŕ@ƙ Ô˝ŒqĆ0˜ô@ <LÁ܄y5݈ŽMˆ ˝ >„m2f­5ÔÉý´ÎLƒ=ϓjœ¤2Š<&ŸŽYŘŇęŒÍgŠcĆaße÷ĘźNŽŠ8ăě‰^ş‹mgąĺ0Ÿ;ŘĚçĄF R%ř0⸜c–ís˜ýÂą&}‚3aó„ľfĘ3ֈŇěX/wŘńEœˇĐ1ŒYjlDNЧâťx{˙ˆ6Š÷i™6•fč™Đa=hS{i­ďrěĺ=Ÿvq-ĂÓ­lŐ;ąÎřł›žOż#şŐI˘[Ńőó]”óz‹ú¸,b7”NŤŽ™‘X÷Ÿę?ÔKz rf‹ůžŢmšXϓ|&<˝J&â0ô§p§wšRë-SÚ=AňDW€‡D€˛ő͝Ř?ň<ÎôAýMzQŤŚ˘ŰüŁĄˆÚM?mŔ÷Ó(žK˝Dĺ ź=!ŽĜ;–vâŐ͜ó혚6pţ.ŘxÇĆÇŔGˆŁŸ*Öó8?Ëű9¨°âŐźĎót|ЉOWœ–šâs„;.Ý,ďäwçœÂŽÎú9?rŽăÉyŽóŒÓŢÍ ýŁj3â˜óđŤśĎő$Ť`ă[öŮGĆ~›Ś‘kž0ÚĚ&mŒŮdĚFů€nžŔşwĆďԐŮoß§SťÔŇÓ-Î=ŞgŃ6;Ÿ“ůćCzJŢŁEŇžaĆ)Ú­_Ăž#J{ëí3Âî2Q ŸŚ*Źcœśçz`űDîŃ­|/đ¨‚Ÿů.ŞŚrí ź¸o–÷Ĺb*†íçĽw*3ëôbj4ziś"×vŇfŢ+^ŰĂ{ď}„FzýČÝ4Kümü4íęĽtBĆ÷-Ăëžđl"bv Úđx ˛O€ĆŘţ8&}!űă-ÂńĹžŔ˜†ŸÖĘ÷D/ýDR1ÎPƒ'B FgÎOMă8úŮô/ďëCtÎW%rS%rÉř›×´Źg'ň: EࣺUŔ‡erí˄•c÷óůњévŽăň0ż'QTLŁĺFUCW­#ObރĐíĹůÍÄŮ=€ţíźM˜űôÜw1żeřŔçĹ $#"ß$mŕw ć×ŢĽmU"Ž—xÁű(÷…‚Řť ˜eAʏۨ˛ u>‹•TÍGI}˝Ś6kˇ nůí{čQDłľY4NŒŚ ń;œŐOčˆ6ŠÖ‹Wčˆh§*–EMŃđJ×ÚđśdýEş—őękk),˘%}[ʧZ+bď÷4\܏˝F?ý‡ˆ“Éč˙!ĆľĄźMa­gŤĺO̓ÜNÎŃf3Ä Ęý muŕ˛Y̓ßVaOa/—Ř [ăv:6ŢŔ>šNý¸8B ‰ĚË@şĹýůj5ľőęŸ(G[MßWš`ŽRŽŇľń Z!šČÇ?GŮĚsčy`ĘÓÁżNY2Ţnsč `Ć> ~–ż ęRšË ]P üÖŠKĎu#}"ôd(?G†rĹěc¸ŰĂĎs1ß\ąţ‹O0ŒÝö<ŠýťúŰ0ŚKĆ<łĹs´u({†‚r‘2Ľ-×čěxěMŕr§0Űwòďóűťřşôď?ÉoÇЗ”K4 \.ŇĄ ȐK*WkŒ&úąÔÇ÷ĎŇ#Vď¸En˝[vďëP˛ú,O„ńxx’ö2Äb´ܲ÷<íe/ĄîĽÁ˛81Ât§vXÚD2Ć\˛qîL@ [ÇË>UŒ¸|g඲˙HŞfČł ¨mô#^?ůHđë\ö+ć”őÎţ8űâŢŘ€0îŠ ” ./q8ßvžóůVźÇeÎ%=Ž6×ĎÄőłq‘﹏ů˙œW€.ŕĺ˙ő\œe8Gř8O\Ć;d1ޑÝxŸÜGĺD}Č%ŸÎ~†ă;ašű VbŸâ˛>…ľă5”˛Ëě2Rű$Zě7œ@Mޑ}y§´<ď8K‚öqjz‘œaO+ů\dťHt€a°‹čü"Q€& 8˜á]‚w‰hŔŔ9@đy+ >.‘e€ 4"ťÂ0v>ĺo#%ě#öGRŠIý ű“Á˛÷ ţ3űƒÁ€Ýŕ1ö~Ę-“H!âçH` \ƒxű]şĘ)g#6Œé‘ak€0ĐěNf6Ě*S{e':$cŘ\e–"_üKň–HÔý˛ę_5Śpă_łLˇŇígŞ˙ôTšńŸ|7ţź˙ Çáqăţ9ěÚ!×çT+ů9}ň2¤Čš‹‘ě"—1¨×mt¸5”ĄűÔ%–Ó–VKŁĺ)KвÄâąČ– Kšežč%ąXœ#ÚDQ4‹&‘‰Dœ—ÉŽŤź“yf‰˙Ó׎áKŒ[c_Ł"#Ď}Žgń- 4Žě!ń݊~{‹7CmÍmzˇęÎ8‰ˇ4čŤńŒ%ťY⺼é[­=”žL Ug/g(iiÍĐ,ozŠ\wŽoí'”:^z˝œó—^O$HYɑpYؚιúŃǘŽź <<Ęń+ôÓń-­úŻ+z;يD\˙ἽľŸŢ¤×cŃ~zƒS˘ľ_XGoĆ6óva]4‘ˆgč6CGz:ʘ†Nt…ëˆ"şsşł9çCWĹ :Ť•ř Ďj5t&Ęu=ÉŞX´§ŞĘД*$ih’ĽĘżkĆ|Đř|†ŚD#c†fŹDă}!qš qť }‚¸ ‰‹>aHś=”Ôä%'HN# ôĄĆ•ӍĎjŠĆĄ üżGgC @Óu‰=íąNoŹĂë:ôWě+ӵ݊ҳ'ÁŠ.ř;vďŮÇyW§žđvFő=ިŇS×ţ˜p;×yŁ=¤=ÖŇÚÓŽvFSuj]Ěť+šHohŞ =2։cŐ6=Śł&ŢY-kCč1áoŕc…řX!>Öuƒ11ÖxSkHëŰsœf…6Ź×ŽrO˘ĄD:´ÎXźuž˛cĺ&ţeZHčsź zŔCOFžŒđž)*Fł=*;Vç) żĘ‡$4;ź $Đu8y˜”ĹžÍý’8ĐÔu˜OxÎ’˙ë@,ŚŤť˘É.Bâúâ-q=ÜÜÖÚcą ľƒ_’žfś­°0–ÉŽä—˘q o„BŢVĎŰŹÖźđżď˙á<ŻçOĆÓTuÓ.’Lş;ް´´áZŰŰZđşÄ˙’ \`’hrś#m’ó żŢYtÎ{ůyčĘsî,œ’œŽŸ%žOaż*@ÁŸ‹…4ô2:aśdŘu.)0MÄf1MP˛@4L0aˆ-'Vz†.%eévýýúoJˇę7ÝŻ'ařŇ=˜ĺË<Ăƒ]‘ÜS„‘{jšKÓßż7ÓĚ: >Á'çZŐVmǞ鴈’”Ą+ҤťXŤKwń"H‚"Â;ŽŸ˝Ć‡Ú~˙ö¤t{ă„1ÝNýĚQz*´ÂlA™/QzĺGmj:ţÝęľŢ Ě4Ń;´řÚĺűw/$^9=řŰyFydüNuÎBśPbV›D‰ÓĘ3°u ܋×ýřěő^Ib[áÜéľŰ g˘ˇ¨ČpţŠÚm6śŐ^,łâwœůů¤ţGžs˝ÄQ[íGYQRZ2_b÷Ó@ rmő LJÚ6ŸiŚăôęP˙éWÚ>ž{˙ňľ™›3"˛ü™4­1ő‘B˛J•É+›…łő€Íd›. ÂŹ‘1ś`Îłme܂í›nŐOÖKőő¤ćn­ĺË|ĎJc…Ă3ßă`ô_lW lÇž™}Ýíănwď}>Ż×v9p.`ƒŸ×¸ő’€šP((ŀ[NnŠE‰\J&@‚IĘS¤5L!căĂ& m\(–NUd„”D˘¨2ĄĄ’‹Ş&>÷Ÿ=5śvvn3˙Ě÷ř˙ÍśŕÝ'ńîlKży‚žOdóœĚŢŔŻ 4ŃzD€˙| /°˘˜Š%‹¸‰đÍŔÔ"žFřö|ԈVĄM¨¨Ň!9+IŒ Ť0/ŔO[5ŁŽf°ŚÇ§—•W–űźź0šŞŞú|zÁâń*&nٝzîÇ0ďLœ"ÍäçŔ¸Ç­Đj˛š!óđ<˜˛‘0ˇąŤ_§+N¨ˇQéźĚô2Ô›YYč›IJpާ‡rŠš6ˆžA“Ź ĄÁÖćB<ƒŘ¸ßÁÚQ>H$L.¨žt:m§çąĎHxŔ ^@Ě؍.oœ¤ĆnXŚ7žŸÁ„ůsž—Ö"셧A" ć"w€09{n=Œ\ŤŽdÔÖmÜ´XbŁ:@1Ĺ|¸ăÎöě’÷ůa‚ęÇ>c5îđ.ן%䩅K,1l°œ×P”€35vÇćíX!J2§†dzůeZ™^CĽ@°44iX]QŢYţ˙G‘x:Ňm`ŤÝšg…$‰§CŞô Re™śôÚĂ!Ů͛!5ôď"ŚôţŘMä‡C‡Ă ĽĎOYžl—śťŻş8§ ÉlĎ\ߜĐSy =K}KCĎć%…¤´ĚłŇ— ý$oůżVZďnăűÔŤÁOČuţşôŠ;ü0ÜV§UX\QćÄČŠ:‰ł˝@kE`Ÿ– ŽšČ‚k7Žě̉ t•h‰eĆĂĉ”@5ôĂŃĐŕQőŞň~ż"㋋&G=Şż|F•ŚF‹‹ž>9Ôąśk͓ÍCGŽ­ŰsĄsÆÎΗ7ĚI!Ěâďœj<—ű$›Í~xú@/~;ť˙‹űxnž÷ü6ʕ€_v":c™ŒĽhIvŮM:ŘS,v"ž#Œ“Ă2Áƒ˘˝Hׄ0ő(mÎ]KłŘ€şl@a—­…kŸ°ĚYŠť‚›Ř‰2›œĹ.$őáZü*ĘIŁ%ű2îĺđ#çĂu8ÖâtP"VXŹńźP *,'_vĎZ¸˙ŸĽkؗžťĄŕÝď 6ŇľŐ—X›ŻŒsÉŠŠJĐăáëJ%Mł;÷,§ŞBĎđrĽh€>`ôŽqÁCŚ‘)ŇoÉD ĚU#Ä,7(˝–Śm•fh¤u´˜AÉKN(ë:ą'´œnLĚsӒtŠ7źôť †ŚR‘$R .lďâ7ÍFůL磳ٓYUOpOđýÜ|żpĹq5"<#7Č ]IšÉľ^_ďyMż¨ß ßĘť–?z=$>ŚňUCĺßť żÎN@+lˆŞƒç#ao$vDÂŕŽp„Q 5EŽ›ŻařÔ öĐ {;ܘČbk`v›r÷“_#ЏÒľž:ŇHV‘M„%}ä[đAľűlŽěŕ+bÔ^ěÄZ—M k:Eš6×´˜ Ź&ç´hB5(żlh˜ä+ŒVâUU•@}ۄA`ǐ(yžŞ&Iż?ôʼnƒ/m9Œ/xţóŃЃ§ßůËŃĽĆéÓ3k—]zyŕÖňä[‡wxţţńÝÓKN^<śýšéŔ”EcˇY?0%†Ɓ“BA‹î0‚0ĽjL†¸¤XTܲŰĹŸa’W˘+r0iÖT)ůM!JQ¤GKŠű¤Ké?ŇăuuD2€_ć˛zYŤąô řMáż2[ŮŚ°łľĹÚÚ<ćY˙JľŮŰäAYçÝŚěđž–w\9“ąy#Ɋ‹0̋),, Q Rpeˇ,űŘ`9†Bd…5˘ä LEom4W™Ä R&››…Ö¨íMQŒ˘j”@Ä#˝ôN´}j0…kşBC¸×@"šdIÜęń~óě„aŮ(Rω%rž5:LÉ y’♃¤ ‚ZqKƒ§ÚO=ËN¨~؝Ŕ‚(ĐEuěMn:stců\Ż.ľŚś5?żËŰ]x÷ݓ˛ś´gď\˙ó~%x°íO[6ńţ–ź¸qٖ­[͞+?ëjj<<ÍxďKŮ߆ Ăŕ*×ţŚŕ¨UĽ/‘WȇäNůŞĚÍeć*ża8Ždž8Qb$ƒŘÖË0,Ł "+ŹŔô“~ä€b˛ĂËÂ#hPdSdy/ljV~A…8á„b.1ٝ{v†S¸ÚRŤ¨¸BŘ\X)´ť Ľ“¤x+Q‰IB_Śď@gř<}‡ô¸Rx—˝ÓŸƒűŮF8BíĽV˝­Ú>…éƒZ-N79o›cA2nˇśŰŽżČůz,çš%•Ç™˘Šq†ÍĎŻĽC4đŒĺ•-).o^—­h\.ŠŔyjÜvŰ(o+qšVî+Ö “}Ł[ÉŰo]žÜ­ÄÇ™ó_Í9ž=˘Ţ;šâŃÜ_ČýĎ;žĺëň§y§'čz,Ě8˸2Š|Œu¨ѧ{<ƒ.ˇ×ĺńşÜ HÄňĐ@,W´.ˇĺĂăAőşYtžűWŁ7"‡Ăý{?úˆ(~đj:xՂ\(ŸAqżöJh’=—đhfQnŽŃiçUSíĆťF"$Ęş*sżžÔ†Äľú¤! :¨ˇ˛É‘MÎbÇ!ÁşM™n˘o4QH˜ž*đgĺ=Q1Ń@`\ĺL ᓆđqC†ŠÚ×'y1ą>éƒĆ¨’I:ɲäIĽÝéÓý%ƒľp^€äEPY\dĆ>s…šÂs[ş“ŻŇäă h^Ď˝ŽnĽ7Rš-mč]ÜÎmSo[¤m);-Ÿ.¤3}Ç';läćpä‘Ű×IťĎ!!ťI`Ćţ\<ᤛÎj°ŚŸŠSd“^qőée=ŁďÇďőX›ŽA9 ăÇÝMŚń2Á¤˜SÇ×Ç˄ˆ§‘8D{‹Đ͑D@!ĺŽHcj‡ąÇS4-!‘’ŮAOjÚN„#^S˙ęíłçîŽ]׺3öčھأ÷Vl[ťjëŽÚşíĽU›ş{6o<ČNňí]ł˙ú­ýľ?ôĺ n?óa|n×yźpU˖e/ˇśŒ>Šě˜˙ów6îNև“v`šŁ ‹S€Vł @ޏ¨C ťŇˆˇ’˛a*ń¨Ő@]j ŐƒÁjČń‹SízÝÝ|ŤÓĽĄĆTšĽČ Ô1aďL"LÉŠ ú#40 čÁ€ˇ üdÂL7~=ŽÎ'ń4)Ů4!(Š˙ĎŞĎŽő?KĺM\H™Vj›kV\KÍ5ŽZöUó:[ŤŮśÁŢnkłżo>d;cťkžíxäH}ÎÜiî1łĽžWxĆKr™ Ŕdu:xÇTű|Ý2’¸&“%ń§Ą8Íő#Ś ŕĺ ĎŚŞŽÂ}˝„ú ăX2(ĆĐá˙ÍDG ˜’T†" 8NdŸç™˘i^Â`pG&ف–ĄL!c˘XŞď1Ż_^ľ!4O?˝Žo vEßjž˙á/Ž3—~öú÷ŽZżĄ WÉÍߙťńj˝d­^‹ŐWoaůýŘßcb˙Œ8z–śŻođÇí@c€™SPRlă<Ŕh*ÜŹBź ař Ç1Ďi™ hĐ*´KÝľvQ)…Mý@Ă!ľ¨ĐÄÂujhhˆ  ‚wŽÝÄ[čťuhŤ’×$nw‹Ä{˘ ÎŇŁ-֖kŤľ+ľ'ľÓ ˘V'5… ĎŤtœx]HqŠ‚5cB*^rÚąT•Ç•qŒƒĂ\—>iRpd›”‰mňŘXTŚâF"ů"œvjlHšFŐpqŘŞ)Lg“V7´y*ӗ/%'ӈť¸Rާ'3KńŞxĚ ”Ĺâ,–˛8ŽĎĘgđĚe†aÎŞMƒÓŐ5KŹţyň°|ĺUFᜈAjD ` źá,"ŞĎɕŽ–°ż%űíîą}4z_‹-ލޠY¨}ŠÔpNŮav:łŠR u/ę*Ź/8ËÝ峪ęš}:s–{4Ů_‘mz`fVľ5œąÔY퍎WŻ´ŽĚŞő}×֜ŃčŢjmąľg´9[=é:9¤Cl‘ˆZ˝7_ ‰Œ(˜O3łŃL4‡9Ý;ł”ŐN!Z­;üő~Ć?€+‘—9ݗ7Ű­°ĐĎlQôrčyä6îםóĺzHđřšÄtö–•dťažš˜NEă(ÂEé‹kÚÉYŒD*ŁcD–E˘#cŕ"`Óźh4ń< çR†`$ŠP(=łř • —ZŠ Ů8ꋧ‹Ś1nW&ǘҌ\ĄĂ]\Čóœ+ÓíöÂěb#r€ 0ÉTŤy=8-M7:†Ű1ŁkA¸{ő5Ěv_FQuăÖ#ąžĄťą WŽŕÝ_`ŻX|˛đqěđý›ąąÇ3žŇŒĎcĺ1nk\ţIßŐĽĽÄ̛–Źo˜Ýş\iXŁ˜łtŐŐMŕ˛ýK#űƖˇë'yŸ á”]qćŃĎbuwżˆu:ööęë˙ńƒ_~6rëąăŇŞKą›Ÿ˙.ۛŽçîŘ;łĺRíö=3:~ţ2C% ŽëĂ:˝LK•˝‰ĆcJŰ ŃašÂi:VŃß<9_ŽSŻŇź$og;䋪 ü9ůž,ŞUa\̈́äUâ1ůĄô0ĺĄNĂI\ §cE­FĹqPߪyA ­ć%#Ë(zÂČČ!Hi0İ,é3‘>ÖÁIiđ”ĆŽRŠí<Ë÷3őŠŠĽ; ƒf‹žDĹ(9ĐJýfˆťĚÝâŘÔ~Œ1$nIl‡„%ň_Ö —fŁđŽŔťőţK<ÓႯĐaK—3­eA B ž­Ş\żÔ{kŽ•Ţ)AdľĘƒƒşÁÁVUü6ç˜X5ç˜}Á’Ĺ˝œžU OîAĺđ˜Pn7ĹO>.\ˆ]Ź“Mu˛//°Lá™Ĺ7ŽŒí뺆ď˙¨™%Šü"Ž+wUťj]Mš żÚö†Ş^ʧÚ"ň^ł†ľzłíć &ŐhĎÎöůĐä ;œŰťÝ€ÔV/ÁÇCeŤ’$ÉI‚äyrňźšź§žćÓř…Yi2yBҒyÁ…‰Ě’l9v&”í ă(žú 2_őR'Ç—~ßżnĘĚYőĎěJˆ—/ŠŐÍżoî‹ĎĽť¤ćţÇíŤ.y#ľ´ťĽR˜ăö/i˜ńäřáťsĘősžŞ„1†–ÜüTZ-˝Uyďh+Y&ŘZ­y|Ÿ™2Ë@Uj+jCŤÂ)´>źí^^Qű…ő”z …żť5OŘ eśRwYžQđ}ľÉ÷HNSޏĽ'ÂżňüÖłCxIۑ߉÷’N÷šůPP÷éA:ó“ĂĽ ž*M,Mč.„Ő7âBŃĄÇ\3Q̀&XˆS'ó†ćEZržŒQB˘áĚh7O&T Ů ă8Ŕ ç)ŞśłÇŘRŔř­bĎŕýé?_¸”ţűËqÝŕGxÂÔăՃ/ř÷ÂĺŸý㿊ürř$ţéťđşĎż=ąăů=é/ˇKţ›7ŘěŮÜ3í‚Ü]0ˍ\G-tşőˆ Qpف LŽ\8¨2C”#—?áĐă”,ë÷ ˝o˛Đťž…^äNčeěämČUVÔ=eÖ !;ľQ‰ŠT´ĺĺs‰M‘Ąd~Ÿßël!!Ĺ Ž\šĹ~ŮEĹxź ^ëp’!4ŕřA2Ŕgq´ŞÖ(čÉč.üßWçŻi^ľňá_n=˝!ݍ[_Š|°á?y¸+ýŽ4~čąôßŢܟNX\ŐU[ůŕçű.~S¨÷3|yTЋfŽMŠPjˇ#Ad‰”Q;CGX÷ÔŘç 3 ŮP‰TEÇ˙юΊ ,e’ÖŔ6Ůpu(~gŸVV@Ô9ŃĚ{X4˛Kˆ| Ź—şŇÓ_KŤ]Ź‹`7@ ô;3ÎcŘ ă?„°Ó †BHPšżM…;îĚ4aú.÷ĺŠ Ç¸?Ć˙!Xä,דwúŢ)|}Y$`üƒW€Oßű˙dEŞ—„c†Œe.œäźXë‚[­Ü 'ŻeâçË3*˛<>ß3ž„7[|Đˆ…Ąü`~^ž`sĆôâœXAŒ‹ąÂâ\5E~—7 ěóv¸'GqžČöšáˆ8˘QT$ŔŘÂŮęĎžÖałšTěţ{řöď ›ÝĆ*@ż[xˆ,ߜ>Óq.˝ťçnüp7ĆĎÇFë}rĂŕĎŁS6b˛uÍWß%Ó_ĂŁçWŹěNjΝĹ+{–öýž˘-ŐđĂőł7í~3}=ľx2vC=öٌăpŽАő 7§F"šC>#Y"DĄĐÁ†Ý#ď2Ď7WL…O=O˝>ŚÍřäĂ|ň%S*V‰bĄŽ•R†/˝řŃ üĆ0Ž?Ó=†Š ľQmQŰTqjsn<ŮžĺŸ YuŒ3 B?MŸ–H–sÂ0ä’đ.„sď š188j“F÷‘ů7ęɑŃđń84Ô:Ȃ€Ţ9Ęz‡Hŕő‘)÷×đkuuXa]KÇ[×ÂbëŽX×Ü żšeŞ^cH[¤ƒ`–ľÍ¨Bb92Q#ú'ú InA˙sžIĐŠVvţ“ÍÎĺlvŽ™şľéńěěĎ6!ßş…ó§`K6ˇŻ˜6šĚŚr0ľbľűř [ ĆÉ7?óm耩?N–ÚV‘ŸŮ6Š›Ü6ľ[šŠq91YŚ1Ľďć=Ě3n0‡‹¸a möÄôłŠ)IË ŻémôśxE/ŽąyžĽÄ/˛Eý(Ă)ł<˝ŮH.éÉv+˘K\^şŸÎ”†w˛Ÿ ÍÚIˆkŽŠím­3–•6Ÿ|ćäiܑŰů뺕k„+#y}o-ű„ń"ŰúĘ N -7˜–%D™ í#űM—÷Lâ×î|śťߍĹŢV˛Ł9ŰÉťđŻťŕ'ś#ds':ę&¤nîź~DĄšëTSݜ§ Ě`.›ĽĚrzŘǒË)8&ÔĄhˆ:ˆŹŘxôL nôňčŕÜŞL$׳‘ŒX‘”ƒ§ů`8qB?sć„Vżxœď+qęś1§Ě;G–Ÿ?E~Jü¤ŹŰ ™EřxęcźŞÝÖ62?íYéCY ˜“°Ó=5.~HNa †+…)ËgßĆ ţ%ÇHň@ޚL53‡lŮôóŻE˜ĹrľFođiV0I+ţâĚ™kqQ QqľóYç_!•ÎÎ.aźXŹNĐć ÄŐę/´*UˆDj­6›Ě°›´Aýž&o'/ ŰěŰh§°ßnó—ŚUHÄ'I„:UľB˘`Rç×l‚˜˘Ô!+ĐÁšŚł:ľxR⠝Hŕ‡%ƒöáJSv:dĂtŽU°2AjXOHH0‡ €čjÓąŢGš^7¤)%)Î#nFry ´Ž&§ĺθĘ;xëf( š Ň ů%Ć´×Ƨšô‚ tŃm‰ő'äź9 < 2ö,WXł9áłRřŒą˙őnMfOTŘíű˝Ń„6!šPűŔœœĐŞ&sóčDx:1aĽź4jO˙4üą?P;Gjq!voÇExA…?o~KÇŇMÓó¤á+[Đř˛0rŁ^|{x’x~˜5ăN˜Bl—ÁOw{”ěÄ šN?¨YŚ ˘Ě˘ r ;šK‰]¨C$Äa§˘`ŘlR–9Ľ[ĂI˛: ƉäpN 6”FĽEiSRФP؋řxRáÇîmAďžPˇ¤1´OĆůLjżú­™äIŔ2‘Hly…ŹöëGÂÍóŻ;Ý5ԀÜ\YÁÖ¨A5ëţ‰Ţú5Ť,ł*a——`"Ś7Ě*ËdO ši*… ťćƒˇ—Ý_íő‚śĚ0˜9̼ޝ“Š_i(a5f“ťwžČŔŠ‘4l¸Š•N1Ň űŰÇŇűHC!ô–ŮtaŸî󅥐(ę˘O (!ń@ Wű‹&š!b„M÷lďě€üĺUŰÄy†ďűî>űü{?śĎçŸ8vlŸół‡´¸ Č!żl ă7ü‰€ŘRľü„etĽĽ‚śˆu˘ch4)?JŤ•FÝ ] ŇZĘ( jÚ˘ ÄZśi”{żł˘M“6'wßkßŮw÷žĎűźĎÓNÚ-mbŤ4ĎŐ靧ÎőˇžöîǢ/IJrČfńhaŻt^Đ"˜óó‚ť›éĄŮ‡ŕžAfZ–ˆA=ţţT h´†ŚG¨ĂĚťśŹmË䙻9ë݀:¨këć™ČxŽš C}ՊLr<#Uc°nĚ´Őü5}C?ůö}řČYTpé ôÝúŮyý~-GGôWŻ~Śżrâ,ęü­ţýŞF!d{Vż™umÜ( ŰÁ¨Ě`ú;=ŇR7ž.Nww‰]nÎfĂ0^5ŤÚeˇŇçćĹ÷ćt,ďűüűUÇ˙+ć˙ӋřcĆ›)öÉĄ‰É;C=(5,X ,ŽD$ˆÇÜ.ŮŰźloÇýœžmzëĽĚŒŞ§ô2ě”{N.Sý5‹vţ´űIƒ"§ýánrăaŠŃâôsó´—5ěSk=Řä ŠŽvşŁŚRRî-ÓęČdď$m™ámŇ2¤5ÚŽ­$›Řd'ť“<ÇźČţ‚9Ę^d.*7™›Ţ›Ş?HʘRRG¸ ŮŤîÓ.j\\)ŐŞ•”Ö¤6 ˘Óľš|ťÔęé vĚ-l ˇ-!‹. aZ Wš4HÇiU\Ó°?\Ú_ŠK#°“ÍPŃ6˝6_ÉżŁˇ9gż ôÖß–źŠœ;ńŚ))žĎe§a&ĂŹŚœÜť:BK˜qăđiMÜEz­–ŕţśmu꼃‡÷žţÖoŽŁ†sđ+F??˛ü(ŕü˛~Ž.îîę9˜)ۖÚÔuuz-~GőÓúgť*2PjYŸŐ/ép˛~>Q烚^?ČW™"ô ‘mN$×; ńË 9‹h¨co6ö1*CiĘ4S4°ç[>O?ź>$űŤa˝;T”¨–čű‚Dľ˜[…Ü Ç˙4T eĂůbnĽÇÓMĝӂÓÂłmÝÁĺÁՖ Î>a‹uťđźă5á´đĽó A…–ˇ$ ’`ˇČń+V“,‰;Q-Ĺë÷…źt|řhŃź^&Rdô° 8pň!ÍyŔD!sLŮö4ŹR‘ašLô‰M™plUŹ?ĆÊÔ˙ľŻM˙uEëŽä“kěć1c䝥j ‘ëď2869UŘA¤mÎqedłř.mů˛G_LÎe¤­|ZH â$IžDGę5T‚&Žß—’`&ɰ9ÓÁ”X䆭śą!CľÁxEń¸MfĹŤx]Qv ‰tBů$9„wźűÁĆ÷?j.nńđŢH늶ňČô?ŁC[öÍ|ţ°^I†gí;đIA<6sŢ‹ŞžÚ9Ńf]Ç&kűŚ.ŢJu÷Ă/¸ż˜JěI'° ¸5ěZŽ‹'&°Šŕ÷Ů&󌂆Â)ąĆÄlśĂÜ]ĐV<ŕrFA+ă&–âů@ˉ|5J‘=9Äó–Ô­5ҨإĹpŒMÄk„ęč”xCEgxn´5žĚöcÇRç"wÚgŰčŘ(l×ĹÖġ˛;lŽÂ.qKěÉř^Ç>aŸ'”SçĺMh~‹VvŠ)ńËÜř*éćr”÷8WĺĄDʼnB(ąjœ„Ę-ĄÂsŽ 8"[nÉ *+ng˙éňxĚ鰑H° ŕÍ&ŽĹ&Ág& ”űÓvĎŔěš­0ĺÔ*Ś e%˘0jAóŃ*´™Ŕ8OťĘé%éĽáާY4Ś•ĐąítâÖzkú˝˙xx&¤ÉT˛ŃCrä2Ų`tůÚ žŞ] 3Í7 —,řwƒ ďe¸Ž÷ÝÝŁO0–¨Ä‚°ƒşÇŢoQ \čŞ ádm -–Đ´ Ő55I@%0$0ĄÉăö*œ×)ĺK­ű”cŢŮÍ+5ťĽťN_öƒ%˙䫟ţçV2,{ířĄÔDtš˝ăÖož§˝]Wějűޚ) G˝?,Ť=Üłň…K>xÂůôî'şf%“K‹ëNŹ_waÍÚ[Š• †ÍĚ@ÚApÎ@Ţ g9× VĄSŚ0Â,b!> j BŘfĐŸă†ŻňVőzž$äIAϚ&ú‹üÉýşVH'(Ň™Ď)dÇ}UeDŠLˆx"véÜ=@ǎÝ˙šŢí!P|EpˇnćrÚŞ í\;Žç ts5WÇ7rÓřőÂ/ɗ‚ŮÎ`é4~ó “Ĺ­áź&Çcš‹ô†1eÁ a)3a…•ĎWV)ý Ť8´°YóŔjĐĄ5O‡Ö”’IČy=ľŞ2ŽUTĘłqk…˝Ň>ß>ŔXöŘĎŘďÚma{‹sŘĆă,œ˛ ťáá'ëëéĐOÁˇ­K˜'nž' @7ĆÄ—şś‚íáQći*mĹŠőó{xxPځÓĹŠy=ƒ_ĆÓO¤0i!¸čr†Ü%\čö!Űü#YÚ{ş‰nŞ]ƒÄďť­ÖOŚ^†őš° ŹÓtƒ›d¨Ä_-2˘ ߙhź¨é,†Ój ÓÉ<<3ąŁĂâ 5;"(™őI„=űG´y\aQ9ÚůűŃp"—úWmŘŔ•Üo¤9÷1Œy=ŐčJZ+a4ŠDÖÔS#Ľäľ‰™*5ÉSŐvŚMj—ŰTńţ!—ČtRD~_™§šTۧ)öéž9dŽ˝Ëł,´/őŹ%kí›<ńŘYÉ<´6ęX_oTÍk°'M~ˆĺůŮUĹu†ç˝9vŮٝ]Ż÷°×ö€ŰŘk–x’†`“†ś$ŮQWBj(Đ#RŠ*ŽB%¨*TŠ‘š¨U/ęƒm -j­V4R‰R)MPăF”K)(¨u¤Ňx×ý˙Ů5‡Şőź÷íÓóÎĚűż˙˙ż >8|˜(işßŻ-Ó´CaÇ)Yć'‰łjpvŸ˛Ár2<Ľŕ;ƒ„0/ŠqŰ ÚścŞ’ˇM€f@őű“F hSREÇćýň ‰gĂď—$Q¤đLŽiŒ ‡ŁĆĂYĹ$F.—áÉŞąd’‰”ÉĄÓ5aPŠF*Q§R‰F*ΊĹ˝vWőęxżŔĚvuŔłŤä˙› “öëĆř8 Ĺńt˙ÁöC°Č Sv k hĹÜ=05ęč°2ŹşźŰS#ĹöÂŞÂ2a˛:H3Aë#äŐŻýńďéhL½ł˛96űÚďŤŰÎVßjó…ƒŐ Ť}ß;úĎ4;Q‰VoţűĐű 0ąĽo'7,ůôGőŒ] ěąč¨›…n!!…fÍŹŐCşŮąGęŃző.łŰ’M+iŚ:Mt¨[Ă0kőYŞĎ"Öłp¸‹Ĺa7Ů­ĐV.ëË(9˝Ő\ŔőŠ˝ ţbżř$WŸQžŇŸ47’ ÜqŤ˛Yß`îäž*˘&Řmîśöq}ĺŁ\Y/łr™”G×֋Oٕ…×4.Ź›\9ÉD‚öďRX|ň+&‘ł%çjäVéV €GŰŇźÝĎ?@QߌPđű‘•EqüţŠĆĘń5ž°­ů[2Óą’ö4ęJPMƒ3ÎÉU*r’[>KFáš88ţĆ7WtA\,Sű˘DuÂđÂ*&˘Ąň„ž30 Y ÚéäPѸbL1(;ń* ťQJ€ž€ôՍzë؎-`¨”÷Β6Ľ ÄIaŢMŒF ´É;Op–]dA7jWâKŮYúń`˙ԟščԅ5ěĎFŘăĎ/;qbʡńŘĽeÓ7¸÷“aşélw–¤IšˆÍeľ\Ž -°ťzsKs%­”ۢmέ›{Pۗý~čŐčĎ5;Y?‚*ł ŤhŃO"Ç2c‘ł™ńČĹĚ;öńщŁĂ  5MςyFŹ {ĂjD‰pÂÉĎĘu¸ÂŹĽ\˙ŹĎ‰kň/ˆ›óťÔýęőŽv'čîÔ g´§;ĂóSAgmöĺ,ÍĆÚő>ý°ţš>­óŻé'őuVW‘ŕ:Z+伎7ś CX­Ť¨|uÁď‡Qąá2=6ć Ćb>7E=s°¸Mžc•ězc=#xIҒJŁV7jîöfMŤ§9Ěř~^Ţ“Ţ)řú@ލŇ3Ž#]ŚOťz›Ë´­ÉÖš­'[ůđÔóx­ĺéwÇ<0×\-ŢÜ9ˇpž@_/BŸíaüĹp‹ÓԞţ­pQ  ĄO ‚Žo*xŠ,8ř]mh}mQĎ?†l; 7ˇ˛‚O§Á<Ŕ&śřüŻśœ<ˇdG×ÖKIÇâ_˙Jă)gŰŰß:plАÂMçbáçĆ_~fţK›7ý°ľń›Ť;žwĹ7Vu-šn‘ˇÍ^´fČ:ô¸ť~ٜ/ßţtď˘ňA&fdÚű×=˝rŃn`ô>`t*‚Á4’=Wýiž‹_Ěó}‰S šH4Ĺ:bÄž˜8’z­b¨]Z-‰%í ţRčŮčńEm“[h[ô|â}őRřRä˛u3|3ňĆӉH’o÷ˇçň}~—_îä_ŕ/5~Âý×P [ç Ž4Ä çČvLWœôŰ 1WY§ěQ¸„‹ŃR<Ž*Ž‡ŃśađÜö8¤ ™<>ôȃ+n;ĆSů t0ůÎ3ąl Ľç 9B^'§ČmÂ%HYIX‚6I `ĘmDz*Äł™ÄDޏ*¨FaŢÖޚ8x_Ä[H|I÷fYą˝8`T`ĺŠQšˇčGř <‡Ĺ~h;3”j縠c~œÚÓÜÔĆĂH„ŽN¤ ™ýÓ‘í§Ÿ;9äV˙őës[içęďězăÇ;w˝ÁżYůäđĘĂÚQý×ĺE‘Çńé홝™Ýٙěf`óZěž ŮD°R2ˆÄSŢ ”Ńpˆ¸;I H8_¨hQViůÄ |ˆK{ĺS*K+ zPĽ kǜ%ľsd_AąŻčřş0Đ!÷°ťÓĎuZűáeĂ*j m▒ đ ¨VaľůĽq§^üëďŮš"] ri´ÇP˜•ˇJÖŖÖč5†W(—‹˝%áuĘ5ÚąÚk {sďk¤>ɜHđN_dNHňü\ސE\çd‘]~ŽRgă_ 4Zs”ŮV‹wix…ąĚşÎ:Ą˙Ç?CżN84­&LÇ"Mî@R5+(ÉťvŢqޏÔq#ˇÍítM<e@Ý$’ăʤ…¨ş:ž W ł_ÁŁq7‡ű/%Ľ0ř6şŐq7$ëđ>~Œs†-ŕ*/œôi>ž|Ľl2-q™}xf|iáŇZŰç …ŽŮÁšŹ5kĆ×OœľˇfčĹ`ĆeÁ€9ęýę:mÍÁ­l\űţmœűĘPŐó7ýá™[7ďžű÷;žzUď[4SIœiQ’ďüí/‡Žžs5›.:8KƒfK˘ GÂ4Ô¤­ZŤXjŽQ×i7Š5f,YPnŃb ń˝>ůOíŒ7˜eS’dŚ„3“ó˛3ĂEÉ+3‹ĂUÉßdW…›őÍéAe°Â!>ľ­ Xčˇůë}ŐíN—Ł8Ť Nö+Ďá‰uł^ âî§€ž ‚Făă Š…ZŕO[˜˙1¤˛ő“KÝľ˛9¸{%?Ą„×h&ŚŮÍů Nę&—F•ŞŁT(•*J|Š(5Ö[ ó†úç;íP=ˇăýęEŤ'Č$Ş^ľżř囟=E˝?  úĂIăĺťVď:Ş,ŠO[vďmĎŇeÁÓ=4f§ĎţëěwNŐžý×Ӈďžuý^p‘HŘŠ˝GjEă=AíĚš™ó2Qf}ć‰ř“ÖłV,kM´ş3˝–ÁxLĚćJăb–ˇCƒŚ•‚—bŞNŒ]ő†S ňŒ¨ĘC`KÄ)ÓJx aŽ´“ĐL„˜d" 0i6&ĘFŁÁ!ővŔ‘ŠËĂx’r&˙– g^—eŘÓ™ˇč~RMŠAF{’Q dwEó€30ĐZnM ^˜îBlgÝyŽŤ ŽÇ BrD˛’¸ş]IĄMœźm-' nmcCcéü&Ŕl ]-ݐŽu_Ţľ+•˝cÓÜ++§M]|q_ŸúřŽöuĽ–+’O-mżÚńĂľ@ÄEgПăÉdzcÔfššW4óŢ\sś§‹q™qEs‚WŹn6y—™-Ţ2žÜźŢ46¸ž,BScĚîÚ}ćÔYślŻHĐMݝţíťźuËŢ5uýůóÇönší™nŮüĚňě˘üÔkVžß}?mţäQJw<ÚůĂÚoű6˙QünďwŢ>ô6v–÷˘ž„ŹĺŃUo~:(ŠŘśČň:ĎŐŮę~‹ÉŠ ‚L)ˆšq×S5JěPăžiÄó"jh* Ú+¨/sŒĄ b˘|÷P…‹˛śY|f˒%˜`Lü]a .řůk[1ßGƒRSŠŰ?í+ëý.żŰö™ŻxyÉkäŔNĂ~Hœœă„!jŇPq’ŇrYß&l„Đ3ĺz(KE–œóӗ,).FTƒîĄ[Š1˘œl.—ƒÓi˛LgBOđ|BWR+\ł°Ô´ĐPŽ}?íÖşRF=íŢÓs{ďŚçôl\ˇđf( żz¨uϓCW+ťďšuɃ[†ţLnĄŕ#¨ú89]%šp ÄNŃ%şEŻ8&N NDNŹb×ČÔq1,Œœ€‹3Eşz;%şŚ3Cçy°]Ź‹uł^vœé˝ě4SŤbGறr­Ź,e?ƍɸ1•IgcŁÎưǘ1„ČŔ˛ůąŸGŻ˘‡66c@Ś|á‘ďh/¤Ň*De{OOű˘Żďű4›đýQ<—°gő[ŘłŠŹŠ*őr Ą/ÓW ŐśţŤ ꪈă*uě%pyĆč@ŒŕȞŒüÇĽęM†’ÔŤRŐĽ4!Ż$ëK›¸&59Q-'˘;aFgLcúůâŚĺő_ˍ›ÔĆQőSďŐi­>çcÓőib†ľŔZÁVčËů ą…ÝŹ=&é˙`ęýúgüýťX:išŞ2Eך1¸ąXžëçşĘX^3Ü㘠ˇ†Űq,V-‰frBFfAóâţ.…úqœ˘ UíËŞć/PľÖ9ß!Œ›Ž5q1ŽşĎQމ}˜Ł„¤ąXŽŚĐÖć.“•ŮÚǝ¸;gźWđe؄љă”ӌL//0ƒţžœ/ŰăQvˆŻű> q—šŃíBaѰB"ÄĹź—´NâĂEŚ* DQWtw”Žú|EŽh—†4’‰Š„t ’‰‡|I0ÚGž¨FC>Q ŸđDŔ5˘÷ů”2îÖQ:ŠŃ. Y0u: ŚĂç_$52ÝŔ‚€i.A˛21>ż[d>˘ŤĂQ4@!’ué EřÇ˙üńOLôńNs/ďď$=ĐrrP8r”ŒDĄGJ ýøxbç­\)hBéLÓě•őĂí8ĺb“ˆ%HŒéJ„6ߐťĚŁhrŮ˝ů†4nŃ1žŢiŚČ!זŔ/6¨=SöˇnŘ|íěo §žXóËžE+žz˝–-ŰŮ´tů˘‡ŽfĘéߏ^Zťł;ł‹îݸńé_ý<óIŢ[ ăý˘ŁÍI7Çđnúwę1őó÷mfÔÍłDrëđ†yUEď¨Ć5cĚ`C‚ÇáŃ]Ř[ ^ˇKv‡âˆŕ' đ2¸ \…|ßUČ@šî + ŽBWĎ˙“TW!×r(ƒq‘ţ“› Bş"â0ŒŰ˝ĆŘm6ú Ö`čjŻÜíÓ´óţˇą1Zą`Ǚ؟t=jTš|ęhşýژ…wŔlŤŚ]iýYŁkW¨mŽ6}…ń=äyΞ„yŽ{NZ˘ŹfVr+ĽŐŠä+fm– OďoÁ6°7ßf@‚UÇŻŢîƒ(K đ ¤ 8@ ”€ŕŽDăU6DŮT[ČĆŘ&b ן „ăU¸vD(ĹA❠謾ŀŻđÍąô‡Ňá$ž’ČMM.ŠO'âš~€œÚKŚÓXâÁR‹óZ;i[âBnĄ¸œ[.˛¤7‘[Üęt ĺóOš˙úţé›n˝5˜9ŢŰůfď‘m˝´•oߐ˝žšpëG(€ěçϝ˙ëésgń uf[ŘŒ ‹  ĺÉíŠú5ő›jŁĘ&B‡Ct04A ű§x§řgúׄşBB­ŻÖšç›g5 K””/eľ Ť”ľÍˇĘę]ô\1Ž] y†×Bc!=ĚĆԘw*[ŤÎa穋ŐĎä[ţŹ*kF/.&*Ż;dĘaF$¤JIi™´EbCaŕÄžm8) %cüünŢĐ}X‚ł#JdŻ…ÉbKČ]MWť˘Տ]ڍŁŰˆ ˘Z€Dú¨15F ĆvRȔˆ™`ˇB@ ™K$Ć™Á†éŠ5Šąšš3ô ÎĽŰ1ŠFÂGBG*M'Őî΋ŞîőĐ$¸•kLzÝľ;žóăÖőƒ›ż=IŰżaă{:Öőd[¸“?}晟˝ł/űŐ[OŐfžbş/œ:wůÜŮżÎÍś0×0†*UŒŚ%ˇËtŒžhĚ éW>áM˜fW`w€‹ťăV"PşZ/š_˛–ś.ń—]ĂüM埆:.UbŢzŞň$=GYLˇĐŸ(Ÿ7ô›ć°uv"Öî)*–mŢSĚbŕ|Žj*ŞŞN¤:“ÎeÎ-N6”ńr=§‹(Ą“(.Ńɓewęđ4R˛ôNŹ5‘ ` ܞőčĐ"Ř>˛ ÚĆll›Ü˜Œ`ryĐV ÜÖsĆřlú%ń‚.™nŸ?’‰ŕT‡QŞ{ŞiŔ$-NŔńMŞŻŚrâŽçOf˙ýĘĹ×Nˇď͔üaăşý‡6Źß—mĄ…Mh˛íÎnÝżýî,ć.üůĚĽĎˇ CóŒŠF}˜œńu7RYfăě,v!ű2ŰÁň˘&ˆ‚hwk˘b$%(IŹčPr#7]Şý˙{ßë}™Ô  BôŁČ…XžŔä7šN=b‡ÔôľCxqČŇŕĐ >Ą†R?ětl>Ej-Jç=ĎFÖņĹś˝O´$–źřÄ̙3^ôز=ísk”7$–­Í\"ŤűœéÁŤPĹř’›ŘROi­8OŹźPş˛ôâvńČ~÷{•b좯ČđU5V~ěă,úyšV§ ÉH )1%Ľä”’˛ˇ ­bŤÔ*ˇ*­öž˛žrgyY¤<2aZdąÔ,Ż([QŃîˆl‰üBúľ˛ŁbWĺÎŞné÷ĘžňîŠ#e§ËôŠź-Íá|Éšt8~)Âů"’/ü8W$]šĹByT‘آP™—•'ů‹ŽŃ“Ľf%Yü ™0˜KÍCćG&ď4ƒć+ć É͡MÚ<‰ąńâ}qBUš]EIDŤh=¤"ŸďŃă`whq„&ĽüŤý´żŘkcÉk‡p1 “"é&˙—ějâ8ă3sűšš}ßqOƒĎłÍ-ÁÄ>cœz‰ qÁĺQ‚W¨mŒH(ŻTÓŘ*ŠI”ĐŚ‘ô!ŇT*AŠZ 6Ň´–šFyÔ ­€&´¨–J[„b)(„÷űćÎ.míŰŮŮš›ÝŮožď÷P*ćG+34S›cŠbNoIJK§J-VK:9’ÎáĚtgĽĽqL'$K°§ôÚLŽhťP | Î(`yâm Óu gpR!#UU_(nnmbíM}MŹÉĽ”Ö’TIďʔ˕˘ Ў\vÂ4."WëHväňœ\!> s7l Ś…ę?OŰÚô˝Č¤ĂPäe(ž€Ă…Óî•R"áĐŽ`Ĺ]šx´0ţ¨}b—ßÖXr6ÚňÉČůdI=…ő÷ĚŠQăóę<×wcnDŤśrYÂô,UďfN.Ťěš,ŠŽąLcŽČ҆z.´@ɒJw6ęŹŔUVjЁ… żżŸÜG´{÷ŽîXk˘5őuőóYKqak‰  Ć¤‹'A›%ç°Ů׾Ÿrž}ŞwoKţĽˇv.YTxqÍţ77x'Í'ˇö>žH4füęđş­oď˙ŕ#ú@Ĺť{đšTžéáţ•Ëö5T˟ڒZ˝iukMĹ온m^ŇťiĂąG_Ç:­ú”ÔŁ$I>•ăý%_péM8Ăgó•iôž3цâšř ‚qo_\bYDĹľ-Çbšnh†j€QĚ,ą /KІ ýŔż0ˇŞEnM=lNł ąű‘öŢK_úI§ŠzŰW­:t˙Ї–­łĺIö˝ÉÓ/Üťl՚ďdmˇŻŔîŔEŽĂîzcąĽkׇIŐ ÂШ&ˆĘ •2ľÓOm ŽŽšWÇ 5ípŠŮł-*%Ő^›@|ˇź66łh`ĂéNٖĎđ‹C>§ŞH ‘ş“Wç‹$ \] żŐ0żHrĐ8ć\ŇŔëDiËÉ2ąŽŽc]ĆzŢC{ŘVc+ßKöĐ=lŸą—ďt€=yV?h<ÇDŽđĹëäUń&9ŤŠwÉoÄrI|Lţ"n“›bźŽH‘„h u˘Ut’Pp5ôERĽ8¨Éwçđ>řę%rčŕ6 "1ccRÎbTä(SU3 ŰÖx5€ŘŔ1Œ¤ą˝]ne6lşa䚈s.H„1&qJa!$‹a0F5]đĄjŁIÍj# CŢÇĄŮáPíS™ ˝çXHŤŁ7~Ů4‘IOvOvgR׺Qj Úh_ŒpŮĽ; Îöż50?…§. AŽčnÓKşťŞhs,‘\ŘkŚôgwśýňZž2||îÎvĽnňŔ–kżÁBr@vh„¨g!;|ev);ΕŠDM•Vö‡LKRěu¨Đórfé‹Ń!ە_ľbĎ ĺľđ"”˜ †¨ć@4,SÂ2=ĘĄx/źi ó€uĆĆÜËcîĹ` łŒŒSŚ,†,T`œ”š‚=âmôy/'÷odj\B 2ÝńvxeUŃ­˜]pýIxś˛ś¨h&iYžöU…(Z”GmĂwI,×+Œlt68Řź^0ťHZôűŒűí#Ë´P_atD—:ËźGüÎj˙ ýŤĆŸöMýëĆ9íźsĆ˙§v›7D˝Ň`ŐŰ N˝ß_DZý=Ć3ƑČaó8}˝ýŠ9LÎhçíw”ËÚGüşrÝůťSűŒWD5\ą)[WśślŮúĺ´Í ŰQ|âş‘םź6ÎÖ#5óÖČÔĺ°Qʂě+HŻfŃxLQŻNŢZeľŘämóz˝ç<á rˇŁ´1˙ uˇ”ľÁMřŕľ{ ˙KěŸl¨*–Žr! đ(Âő<Ŕ÷ŽÓ*ńAł<öÇÎýÚӍœîů~ ęqUŐmŘçźeÇ-Ë6ŔîˆĂt˘ÎT aT÷ĂńLےËóÇ C׹t|Çąm"âˇ\‹nśvZ}VÄĄÇC‘ët‡xZ01žňNîđžö˜‡WQWĽ›ŐP\(ŽăĂôVěV”Dé7ťťS kŕƒE֝úŰLešĺxuZŽ:Oś+î.¸˙>AVŘî[şí.ĆűxtœŹ\ł~Čʙ9ö‹ŠqĐ´ăĞş0D89r”.*˙uuœ,ށŠ3Ś. ę ¨¨ZÓq˛yŐ9:>¨çJŁ>ŒÎ‘ŁpŁ3 áހVNé đާČ"vžô¤™›ĎĚKĘyŢÔři‘SrżŘ K7Éť]<㷑yp@ĆÚŕşĘdśĄľ"XA (ObI•šH}„vÜyăü‰vĽůÄšc-œůůĄ7NĚýĚŽyďąí“GŢc=ˇŻ°Ţá}HăýĆĽ*óĐ,‡F5…qid¤#šÓȤô’’Ÿ:Őé6 ůç éś ÎËĘËĆQűűΨ:ލęď;Ü m™HŒĎ˛2n ˝/ÚOEF˙QĽKˇÓ#âHô,1߉žg˙Ö˝šÄgýŃýŤđ§‹+jßsR ŃÍƞŁf!Ô/dŔž˛aŚEtƒsŞi\U" ůŕs‹:ŽĺFAT0ëßěWypSÇ˙vŸ,żKzOOO˛.ے,É2rąců@ĆÔâr°ˆ‡`lhˆ9Ęƒ9’’N[:x˜SÓi§d0'¤dŠ ¤4Í´43Mé4Á´ôpšÎ8i!•ÔoečÁ¤ĚäŸÎhĽßîˇçŰýöŰď8Y UDőœ¨A8j:g"Ś Ěé˛Ě‰‚ŔqԈ‘€,ƒ˜ĐˆÖjÚ*űEĽÓ(l‹hNƍsŒŰŒœq€N›˝ÜVęO /[-›łjrdÔX ­PŻŞ#ĂżKţ‹<3[‘ĚIkr‹zŘöeŸ•ŇŃ &şM|SN(Ž›Ĺ1‰ń[*ŽÉţ˘‡`őcž˜Ętźh‹ż/&Ä=ą1‹Ó‘\´A((hp˘EĚô4 …bB˛#Ýű^ßxOe°˙ô×ÉîËżjL˙†Iúú˝ŐS˘Ÿ¤ĺԛ¤­#ÄsůŇ÷s Œ¸Čßr2R,ę 'q§˘%Ł5Ž)^).{s˛âʊ¸.ť?s9UV0ÁΚ wżâ! ;ÄJO,ŹĎSŽŠ\ÜÇ ń†ŤkU–ʂf79´rŠ\.7ŐËőŚ:sŻE kaë {‡Öaí°ukÝÖnŰF㓦–˝ÇśÓôeËłÚłÖgôýâaéő”ĺeýâďőL)őşžń”ŒI”Ý*yÜeš˛CáçÍíg÷‡wĚÉQƒ˘Č*ęJôœşŐÔD+ŠŒĘ0(‰ş$‰VM“eÉȏęĄUžW=Ô3@›O(ȋ¸>@ŰăRł×čBíUjdʋ ńĂtˇČş˛ÜŠ{ĺj9!ssäŒLeŃ_Ľ ohóqˇw3*Fd^j †‹(DH;ԑ!§:”\3ěr¨ĂY ,p“(% KGĜŠ]YůA­gFmă@ms äĚ52×ČíşFĎüćņ˜čoˆ™ń•°Ĺ,~[,'=¨iЇAńą–3ˇýnš0hŞĐ~JŸXŮ4ŁČ*Ň+Ď\ŽřK#WާWLTožW›^zD Ü˕bC8Őť~űć'éňO^?:Ľăćĺ„Q÷\Bš2“Łq“6@ÂSÔhEľ¨Cߌ HĎŁ×Šľ3ń6$*hX¨Rc$&ś’Ú¡ őŇNŰůÂuYLó˄MdżIŘMvňĎ×Éu;ůŠŕ#BŒ˙˙)dŻĺ¤jŤĽ¨^Ń š/Ób„6 "ĺE1H(š?JĐ.igA(všŔÄ\P!kÍ#f‘ĺ8Ăă)ú0b§uúMß10Ç͋ĚŰĚš Ěl^€u™×¸•Ł@° 2Ŕƒ5ƒSQ×ů˜ÚˆĚAíŢ4KVSŒЍ#ěrSŚDšÔŤ"^ľ0›Ÿs5UóŮŢaÖdÝ1źÍ$ÄS2Ć=žńkgN2.2Vf’5$™˝{Շ˜+ŽtÇŢîžÄœłcEąlŘ%ÚcTG¸ěˇK´ŽË|u>)Źúlazđ‰ůéˇ$őăU—‘?íáx㞠ŠG7 đЁË|Pp­ŕ"ښRh$ѸwŻś×~Ŕu ä9î°tŘôRő%í’ý]ם%oGYo^Í{č÷ű}ťUŹŹOߢ‹ ‚Ć´+Ž&D Ź <řKŔŘË× `Ł‘ŻF2.˛X?ĆK*+€ŤbĹř‹¸^WżďiCݏh”Ó% ƒ[ Ž&|Š]'dçÄţžŹ'2kxśúńŹaTŮřf"RI†5x-É!55”ŰŁ Áq¤´"¤Í!, ŮCbĐrŁăęJĄ!ˆ™EŃ}PJ<>R$ ĺ,DŞ6\SJęCJÁjR}¤˜ĂĚ&9|ŕ.Ŕě–O}{Úž};I’ƒfÓŠĄĚ uľZ Čo 6]3DkZ]- X‹ŘS ŐŐÖ×GkěE…ĄP™ßhÓŮŁĽŸ&Ë.œO÷ž=›î}ý§dŮéo§/>ˆTöő‘Ę玤ßjßT2¸ű…_/yiĂÎźJÖ'žŘ÷•Ő ž.¸8˜Ţ÷Ú`z˙ůóäńÁ×ČňÁ-}é_ěKż}č‰ô$U})5°eßЅƒ‹ŸZYܖ8ŘŰűÍÇáfZqř3ރ=9Ü@çs-b1‚âłc!/â|@ÄáŇ"“ }íGaŮ`Ĺń:sý­QŘŚÜBßpá8÷i€bŒŻŠ/”lđŞ>;żëe¸§Đ7Âq€Šuăz*ż0ƒł{pš€č<€Z\فhÄďN| éƝŃüŔäçŚ> 0]hů9ŔŒ@ν÷>óŁHL˜ƒßť ˝ŕÁż<ô @Ç\€óp:,Äy‹Îtý`i@7îmů9€•?ü˙ÄŞoĺ‘Gyä‘Gyä‘Gyä‘Gyä‘Çg  @€%8FŸš¸\)É`VT‹fŐmö"‡ܞâ𔂥ňpŸHĺç Şúžšhm]}ÄXăÄŚI٧MošwFkŰ}3avbÎýshpŢCó;<üHňÓ?~{Ú}wĂ˙çd€Ő˜ŰAĹŁńDPa´Áč†8’É`żÂ ؇™Đ ËY{ćĘüŢĎqůż%îŽ=c‰‡Çró91'šĘřĽH9Ř lq@ GS0CSŽć°˝-GîĘŃF¤{ŚOŐ:­%2ymwçŠ;Ń0ŚÂ,h…iЂ§ž k‘°ćÂ`)ŹGŞŰî4ęnŰńda̚a1ŕIT¨‚yxlržĂ:‚| {xRŹ6VÂcTC&ÝL˙ÎÎfLx_^8ÂłeŢŕenŽŤôĆ{Ę_;Ö.Tš>âÝ|vôwŻ”cĺ€ĺKžGSKŐFžÝăsvĺ˜ ™˛ endstream endobj 1626 0 obj << /Type /ExtGState /SA false /SM 0.02 /TR2 /Default >> endobj 1627 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /ECMJBE+SymbolMT /FontDescriptor 1633 0 R /CIDSystemInfo << /Registry (Adobe)/Ordering (Identity)/Supplement 0 >> /DW 1000 /W [ 3 [ 250 ] 39 [ 611 ] 120 [ 459 ] ] >> endobj 1628 0 obj << /Type /ExtGState /SA false /OP false /op false /OPM 0 /BG2 /Default /UCR2 /Default /TR2 /Default /HT /Default /CA 1 /ca 1 /SMask /None /AIS false /BM /Normal /TK true >> endobj 1629 0 obj << /Filter /FlateDecode /Length 39323 /Length1 60376 >> stream H‰\U tÍW˙}÷ţ˙ďERkDԖO"H$ŇŘB ɋK,AL[yA!đԔÂÉ*ëĂ<źŽ™…żK#rh#E2Mž%óĺę÷şŽŽ§ÝşŁîĽ‡é˝HŻÔŃ'ŹŠÖ6ë˛Ý×öÚۜŢŔ¤Ŕi“iŢe.ňjX$Ą3ë'ŸŐ4ü|ÄTĚÁŰ(ĹRÖË lŔ6ĆýŽâžÁßxHrĎ݋Yuóe)ąV>‘rXŽĘ ůŠŞ%Ł:Šž*UĽŤ5ŸXŠNŠóęŽnŚÇčšzQŽwéK,Ë2v"‘a—ŮŽcÎg†3/čŤg÷Ÿˇ}žóüj&_Vn›áfůG!íÉt!YŽe n&>f%îÂ|… 5\‰›ßXÜŹ†XžZOé#}‰2˜Č&FČ(Â+yRH̕yňŽ”Čť˛DŢŻÁĆśYśĘ.âsŮKœ“kňÜ“GŠEŹ4Ť9JľVńŞ+#MU}Ô 5„(P“ ŸšŞfđ„*Ôgj:ŻCu”ŽÓ^=EŻŐŰőA}V˙ÓRVŹouˇ†[V‰uŇ:m]´žÚśÇ.´ËíƒŽŚŽ$GśŁČąĆńŠăŽă™ÓáĚrć9ç8Ď:MPŐęό{'~ţĹ;NĘ4ťĄ5S]ă˝hŹ}öBÉfĆj˜ž¨—ęŻí|y¨]rYJőx=ÁlŇéꉞ,ĂŐŇRGŘÉ:‹ad›şĄŤŰV˜ Sw%ĆzO>W“uŞrTobŸąÂŹű . Y˝)Uę°.Ń%ćHśËĺš]ŽNĂe]WĄ¸Ć[˝P­ć¤jź*ĂH+É~ŠńĚűV{&óÝC-’śúŹUŽ[Ú­~‡˛ŠŞq\úY­ÔkŞŤlŁâ>—¸/Sŕ“÷‘"űäŮ ‘-şBúŤxZ~U[:ó:Ž#ĺŹFN5G‰Va’ĽŞl˝ßqJwĄJ|Ů˘%ľóß/€Iź+Ukjš‡jrFŃŤŠ÷űŤŰžh—ąÎ6ęX A^Uǐ̝q‹‰HÄ^Öŕ"$¨5˜cćÉXęţę§Ân)Bź„P-ĂÉm.ߋFŞ%ľp4w}Bý˙’ŞŸ)đ†¸xłŞcU,ś”Z¨=ÍbsaĚGKf(ŻčMă󖡫đR` Ş4éÚÇę› !Á(4ŠźűąŮiS{桅˝™ľ‹”ŢŮĂRzöxš{ˇäŽ]:wę˜ôRb‡„řöqąíÚś‰iŐĘÝ2ŇѢyłŚM^lިahƒúőęÖŠýBHp­ §Ăś´ÄzÜéš.tŽßŠvgdÄUˇÝ^vx֑ëwą+ý—>~Wn›ë—ž)ôĚ˙?ϔ{ŚüĎSęšşŁ{\ŹËăvů§š]ťeÔŕ‘´—¤šs\ţű5ö€{y]›vd$'¸< Ó\~Éuyüé3 K=ši\Ž2$8՝:.8.•Á!4ChůĂÝžJ ď!5† ÷$W*Ő&)wšÇ˙˘;­š_GyźcýYƒGzҚFFćÄĹú%uŒ;ĎwoÝv5.HýëŐŐU†˙{ÎÝGiB6᝺›Ë“My$Ź$ť ŰćA؍Šn t€h‹ĂŁ˘ŚčZŞv(C†ŃC´Ü„VaÂ8Ś:X'0}¨•mĄĂ€3Đ1×ď?wď˛Ů˘ c&ßţçü˙yüç?ß9˙šjÓ]kzÔ4ţ źÚëďŤJîđњD(§Óčěh™˛#Îsä‡0o9éLž]ĹྐྵݙÖ"™ŒLŢŕçj2šŰomŒeZüc SىdďCšý˜KôÄcŚÖƒ ýź^“˝şuF„5‰~ó>c™ą>š1)LšÔ´=Đ_X´ŢŁÂˆ?Ů3ćŇ"#ŢQWÜ7ž’MŰOM ű§ŒśTVôůňí°öÍKrr3 ëŇ6URÍšÔДŽŤĆËAÓżÖObÖ´Ö-¤äڅh†ż¸†^f'öcƒy_m"鍁ŢÇýMWĐgř“7űo|ôáhMGJăún™%i˘Áî”ÍPČ,/g‚xjąŁđq‰ŞĎŤŹŘ6 Lc“ρđŃ#ˆmGźŚ Áx{÷„i *fwcĚŽűiMQ?…ŤBqS$Ř2äX&ŹbKˇcIwOŕńŤÄßLoiú?Ď7q\d}ŠMüćuś˝ĄŮhhl‹ů#ÉD*ś -Łjś}aږ*iś7ő "ľÜőšÚbŹŔż+5"ő8jđŃW“E"n—D‘TCżí鑹Ëáąô [ńżsŔさFóGM_˘Ţţ îąÓ€ő1÷RâvˇÔšĚšĐčú˘QőQîĺ$%ÖKECK[29f”-ŠË*™Œţh2‘ě°ş×~Ÿ‘”1KnŠ$œí°~śˇČŒî‹cëľP[в>CŰÓŘÖö4ˇĹ}řÄÚÓ뚨M,‹÷M‡-6čÇýŹ´‚ľŹäŠŸ+Čo8ýÂŤÚ ⣎[YuĽPőľ)×Ńi´v@Ř:ŸŁĐéś.ŹtüÇ7EmK,“ę`Ĺ+Ő_¨‘­öŃ'[Fš|5ŠjŽĎ¸Ťľb. xaË:ęŃń |Ĺ}‚ęÝŐXĹרś`&ôôg(ˆöŁŢ y@T“„~đ1P4~` VOhkßć1ČýÔîůu¸Î’ĎŐJ%Ŕ ” ý}*×7SĺzŽcžšr*•Ł\[™g*ڞľ.ąíJTťVôŰLݰ/Aý~ ŔłŸŠ ó€qĐbœăě3dƒ<ĂkľŽ˘ź ~,GůČ(|­ƒ\ ýĂ(/rŃçs˘ÚZ‹r>ʋ›|”s€úÝä>hŸ ;aşŕś˜7˛ˆŰbĚ2yA+ŇáMuúôűXŹ›×쬉ýgŸţ ˘ě_&l˙ŘWqۡOAdaœŤöjgj­‡Ĺ9Ú$Z×P6Üă)Âđ\ iX߇@ľŢISOq`îs¤öÇÁýTüO(L& ž÷ŕçŔCŔ÷¸ ƝˆöÓŕÇÓĚć&󃚥ř>)Îň>nFl˜cö™ůĄxŒöだ|”ěJĄmŐyá}dŸů,đŘĚ-ćŒ#a/ľyŻ]ĺu2§2¤áŞPsŤ3ČÜʐeĚ}–2ŹÖP&†h>s֎ľ#•>|&éřĂçSHŮEă8vźďŽtb‘–G)ŰJ×[ô >›VË×Á˙v”\€řQgđŞţ}ú@ôđ Qö’Ďî‹Yň Ă3ŹmÄxCˆeŠ~Ž^TrX”čÚËŐk]vőЧm8ĺL™ mČśąddÚţ[ý˙qŢŐKĄü7×°eéĂô<ÖJžżkłż#ĄďşroH;číŇ<ŤČŢ\žĐĂř~ Ó}ˆ–ęÔš Bż cWé]´ý$žÔž•Ťč˜ť—>+‡ą˜Kœ§g<>äŚ4˛9÷i.)éđő’Ď@Ž#Ő™Şśţ ÎUľőGu&Ť­[R5瞟U~ u7ç;|Móň%*•72ř™ĹÓ ~.B?_6/3äX–ŠÜ’ëœSô™Čš†×ŻîÇVužÔ=[żÓ>[ŚűŸ qÂzGÝĂç¨Í9×Ŕl ű/R÷îaě7çĚýVťűIŤ]Ž°ÚąÎŸ¸wC^łN‰V_:§iNę.+tr)ÇÉuŽŠÓy4H§îł çSý8r¸GÇŠüůšěşŚîś9Ę_>‡|ŤpďÍ@˙‡uK/ ÇĺłDç’őŕH#Űt/Mť‚śČ#ÖďäuEäĹeg}łÉ.AĹŽ:j@RăqHÖą˙nüäť uě•s/óŢťoQ.0Ău÷Q+ڜPk Ş{ü Mç8¨ž[‘W0–'Dş PŞMPőů*Ţ *¸3b‘ĘÍKxLw“âlžę3׺ĺ- j†ëešůƒjŽzŞńVSŠŤŐş˘ŢôťŽrľ’ÖM•ďw¨|žăŞ˘Őę=Á67Ms—ŃL†nŔ– Jů2Ćyźş…ň+–ĽŢż§|žúhę}ÂďĄÎËoŃď Şä3Ć>¨|Ăţßޤ8'zŽ!†cř jâ]œĘƒ¨ Čďd๔ŽŘ–Z@źE­ĘÖBď‰Óâ¤8muń;PžM_–?Ŕţ¤€lCţ~šqrř Äę7“żFšú#Ŕ6źýśPžžGň"Ú́múĂÇ`gěBŸw!_ĄĹň—´Aá}p‘ßСB> ÔQ­ö#ę7ŠË=9y‘ő’ŸąĹú˘Â1äÍ‹Šž)(_ÜÉçíxŰÝÁ_ĺkڟěăüă1x\ŐmtňˆŹw -GĹ~ꎊˇŃö ´];ŽgţaŠj—€Ă)ü˜ę•ěqĆćiO3őyôS`'ʐ§“vď=ű ä)7>bř Ýŕ đ+ǖ žëNúL¸Šhtý5ęfh×­2˛Űë;i>曯/&bČËôĂ˝ƒÚ<ۨMâ~ЧaĚŹ:晣żFďćĎÝ ˝IłT m„ďe÷ >ťœŸ˙_ăÝ+°ż;€G•WpŰŤ§ČVČVš•žÎ@˝ő¸Oí:¸Ć8NßUúôţŮzp…$çě,}v={_ďV§đÖ̀Ã4ž§o1ôĽhd×˝oü‹űŞ nâ8Ăťˇ§“„8KCŔĆ^ŰҁŒElD‰ůP#Éą!ţ˜Ř śŰ‰\(aJ`l MŚŠ]Ă4¤Đ@í ě¤qӉíZ>‘O:$“LܙδÓ`ZúŤ?ę$-´÷ٕd“tŚýSiž÷Ů÷cßÝŰŰť{—ź  ]†ďň§uőĎ@#j”“rNDîą{t­–ěPź˜k–ěsH`RżŠł beĎ. œ!_˜ô/'/ L[×GÄşbLéOߟô}š÷ţ`~aő Јzö )ŻGŇ<šżSöüşä~ŸÔĹťäĎ÷ÄL=SĎž•ĺüž÷wwţ×cQźÄ;ÂČu5ŠĐ–ŁöÜHp\˝ý!ă™ŕŮř.ŕÉEűˇhoŠĐ~ śŕ`¤żűž#ŘJwNŤY¨ß 9 ǝ–dßۡ€ç’9n_ ä_żOaO˛˙ř!` |؅ăgěŢń_ĺč“ÎóCčťŔż†ž6™kíŰ7€ďŐŔń$~;Ćř¨GîsýŻňƒÎŸ—SçŒ`š?u†řOxőçâťÎéű˙Yœ>K܇ĺ:¤ćŻM›ĎƒÎ8w1ö}:PK{DM)ęhQËZP?‹úq’ĹšíqÉłSyŇěß@Q;‹úŐ˛ 5ł&çQ4íClDpFŠ"vŤônŰg ëÖxVN’őL$ƒm!ß’ éž”*Űbz‹ůyöŮi#á ŢŽ´łvľÝ˘–”S÷% uxƒsâfKH…<¤ĽMöű^;sŮóě%ö°˝Înif폃1ΊYˆŐ˛(ł$&†MëŞe đZmŐ˛NGˇ#ćvŒ8,1mXŃFľ1͒§•ha­NkŇZ´˝Z§Ö­Ů;ľNŤŇähqěu0—#ĎQâ;ęnĽÝ‘ýlłř6Aş€ PąĆQŘóŘS@w#ŠĽxJTşš A{lćDœqNX°:a%ÂS4-)Ż6éI÷ńcˆ˘(Ö Źí(ä˜hUĐth:4Q#Ę8fč‚Ěę&mŁv dÚW’ň7šôÉ˜´/,ú*ăáŻ..¤ąBÚ]H; i8ŠÂnˇ;ę‰Q_´Gmö4ÍžćľÖSkÔúj{Ԑ'd„|ĄľŘSlűŠ{Tîá÷ńľŁf ćRÍŐ5ZÓ\Ó^ĂJqëâfQI@r!řŹ9?+PęŒŹĆ ”’(dp`„C! P•HŽôĂÚk?Š˘€=úĹë’§|ÂŢ%}˘%üĘ]~† ď3W-ŤTᕺ†Ü}đ÷Éčdk@ÚcŁŇ^›Šď–v™îĂđ‚k”ŻšF<~$DŔBޞMä:€Ěh•5⿉mRúńďSú˜?Ź/ĂÉÜš(˜ÜłlވK™‰= ŁČň„”Ľ Ié gT顪ô_Ué/Vé‹ĐP|$ÇQ)óΈ~&˘×FôˆŽl‘|˘+s¤Ô„¤‘ň )ýáĚ|ý“|ýă|ýĂ|ý•|}WžţĹ|Ńož]]ɔŇ!$=&e•” ĂŽżĂőM\/ĺzD§§)F'eRćJ™-$ý茳ÜIěčG¤™¨,ä …H˘f0şcׂn›ÁÓ šÁ#ü"ý„ĘO˝ezoňČú7ZŠ ýăH+I/x ź ü3¤řu3¸OÄ˙ýOBŘDüŤ¤Nö뢕ŇţJŞßOL˙fŒzĘô Łž$~9ęqÓÖ#Ś˙ čGڍĂ4ġ›ÁĹ<2‹n#^EÄn!†"fR“ńqdŢ^›ě\aúEŻr1@‚>fz–‚‰Y^¤R'‡ăŚG^dńČ ˆGN:›’3¨SN^'’mŚg˛hgŒ›üÁ âÂÉߊÓ<Í˙tסęiĽŮË3$–ËäWý jœăW<řeo‚n4ů°?aƒă’?ĄĐł|‹CŹBĎń˙6Ţď‘Ţź¸Ő]Á%ü”§‘żl@7ů>˙E1 ˛Wźî˙Łź&ŘË× w8ˆÁÂ3ř*Ď7řJ˜W$heź—/ő&ÄTJŁ÷_ŒzäTžTz^YNŹô›ażuułuŁuuľu™u‰5Ϛc]`Í´šm.[†mŚm†ÍfÓlŞMą[fbb4ŒC%™šKŚ ŠĘśKBźőjSđěÄfłjĽz}šŤIő†˛XiQuÂ:ńdlEQuĚV÷ĺúAJĐ-ŚHP˛ĄT˜ögÇ܏ŐJ‹÷ÎÜş˙pC­Ž o!՛óbˇÖă:fŹkŒYŻěŞxRŘéóĺ “a¤@iA*ţ–dXœˆ0R@ă2ŹF†a›T”$ƒŢŚ•"Űçm´-™Ë‹!ŤN”\╹źJŽĂ~H&sNO6“P§LćœId˛"hĐ0â7DČ`Ё€AŁTş{§Ü#9bČq Ú ÇĄt*Ć÷oÖŤ=śÉëŠßsż‡ă؉߯„$~Ä6Ä$qśIę‘/W T% ÇIx JH31h“jęV 4ЊGWÖDkŞś(NBÁ ´ŚŠýşŽý1!u™„ÚZc+˘%ÎÎu˘VŐřgŇ>}çœ{ďšžçÜs÷ř|‹sKshÎńü?ŸţŚ˙a2ĚôÜęë ő;BQG¨)š<źwť99łZ§ún1…5Éš˘ąŢíLöô'o9ú[’}ŽëTOď#Ô˝LÝăh™"˝ĄS˝RËtÔrô´tÍL 7‡żgë࡜š‡ąŘ0[Ź™Ůš?Bfę f+Ěl…™­ i"k+ÜŢáśÎŠŇÔŐźyQÎPE.އhĄ­ŤÉ¨Ţł:{9ł™Ÿ-œĺ ţm)<]IĽŁ)™‡ÄTĺĺL…ˇ“ŠňqXľ¤2?ű˜­pŢZRŠqXăh"bíhůöÇăCŒ ňĄ„9;6„—ÖÖN>žaSg2˜ †’R´Ľ Řq$–žćNI}9x=H‚ĂÁŃŕXp2($]8Ź˝lżn§Ýöű°}Ô>fŸ´‹Ląšóźł˙ĂÎ%M0„O¨%k3_ÖJÄŮCĐ@iќ'áiîl´“^Źv+ór˘Cr Ő u äCäŸ"ý é+$žü ů+Ho Ͱޜ+™w´0‹]–tĚ\őŒ×W˝*…˛gë˘ěŘ´(Cëe°ąÚŒrşĄ&ˇQ……7Yä!ýés¤HWÍUgO,˘ś+Nâ@÷ v†‹{†Ŕƒ `áŠ{<„8žNőŔ÷qO ž  <8);g?K0ůÝDĚÁ˜‹…lľLd¤uŠÂEz ËT˝E/ăHތ5ŢbÉ…˨§„ƒD;a 1{Ô÷ƒóÁőę{ÁÖů iŔśú!˛*ŻMcÓ8‘aň'­Üű%|CŹüűhk×B÷Şp‰8ÉJâƒŃŠe—şt;üî‚ĘŔ Ś+z…úÚpmwí֕űL{-‰•{˝ű|…EgĹł˛Iý¤áƒšßůţ-<đér- ĺ¸]ĎŰ|ĺ3o5ޝĺźĎexĐ fĽ;˙2#j!*’cÄ ˝çT*Ľżw •‚ ^=gˇ—äÁE8‚1Ŕ‘™I=čSpT2V6ž –XR ¸ŕůÖç–äyÄľíąqśŐN—}&OÁç’RMʤ› ŕŚ-ţY8Ž…„ŮƒŃ‰´ŢKߋd#źiĹNZĆxŠçŇiäó؛Óhë´uuăŔ:&֙ióFeáîŒ\[ëJ-ܕň°!¨‘ů#YŕTy›÷IeUËWç*źU•UTŹ(ŽŽÁrEYŒT•ÇHqIEůŠ\7šJ˘ރž,C•=‡Œ@ÄŁŤ1M—ŰĺŤő|5Ł ť—Ë­1 zQfpř°Q4č:Ŕď÷պܝV*N˙kŘwámŠ}UŃîźĂ‡Ž~2+můu b}=gĂËW5>ń+Xđĺ|şćđÎuOíOé6oňeŤ37Ç^ÉĎđÉ3ýA=2Â;–sđ‰rŰú?<šgv JM{wą˘acf-= źDt¤^rœĐœŃП+jhî)š†œ˘9WţVž˝MqDżq g$=Ä-’†tCşĘKp`Ŕ­QŸš ˘H zS1ĽNö= Ő÷÷żžŢV°ö™Ě€sÝÖcpčŕ‡…Ýe-_fN\űÓäĄ3żD*Ї'ł>ÔIĽ+ř˛œ5‡Ć5脍y.:`˝˘$r∥óÍ˙v":ĆTkP™Ďď×újÝ´âT˙čéĚőŻ÷ľÚ,áB_Yxë˙ŸÜĚ|”ÝÎаóÚÍäĄ ć“áÄHdL*¨¤•œ5Ç*ç+‰U°Š•Š2 ŁĚ:ˆŒs“\” Lnüx݀řÎÁ–œŰp^Ą Q„ßâ ćzĆ9÷ˆć@ÎEQÁ^ DŃÜE+őR ˛T°R ›•‹‘Ěz.B*Ósęš"é^:űÎĎECíÔŘ|6MĆf°i¨)“˙jƒ{ĺřŞţ™QľgňŘŠîÎźƒŸTż'&Ň!šťh—骑“›˘–NDĆóŞ-9Ż•” ž^e(1Œ8C ʰÄUuŤ¨Ęb>ýćŇ›ŕ•JĎiŮí1ŐąHĂ ÎÇđév9ě2Ńag˜ŽŠf0Ţ˝mP.“)œZ}U}Řß´m4óÎJűh›.OŽ—××T=ďŢ6Ĺźë€ډliŹT)ęó ŔĘŘ$Çކ6ˆÂQ‡ B jß##üĆM,@óvć•iä̏ĂĐA…ůo¨é$[ůŘ +x6i‘D'ÉĽzŸ\jđuËaL>)§ňç•?ţ)[kđi‡í­ĘëĚzż¸ •RcEEcă•,ݍ”ŘşÜÂ]ĺHť$'ÂÇ%ŰüLv y”ÓSŠncćW”Hz+çĺ˘ÜnœťÍ‰ÜE8K?ćS00őf•e)ĚQ Á_žgÔWŤźĐŐC|!źôŕIám\‹Ź]¸Ă]ś5)%łÓ=9Vü šyy)PIZyqI.*š˘Žq×mďҰá|–+‡É(Ç!‹sŠżË˜élŽlM/]Ěnë ÔQj/Ľ"¨(s.+,*,.äDKĺT¸Ě“…Š6^#%bA ôůŘ2*ąU Öć ÓŞ 1bÉE–­+ËRYŮsşZmŃa2jô#ěvÔ&cM5f8 hBtí‹C›˘§źö§ą+Ď=u5T7č*Žđ–Ö­¨oń­ŠĽŻß'ÚÇŽe&żĚœ?ţ÷žÎܙ:ŢóôťPw羸×öƒŽĚi<ŁťxáDŒ˜‘œ”ô’9j7˙‡érnâşÂř=w_ZIŤ•´ś¤•-ą˛,ɖđ$L]|Â#M׎“iŔ.Đb`Ź8ŚŻ˜Ś„’’b% ™@ F˜LH;Ą)ŚôvÓvpŠ›Ćéxšé„!$ŘôŹlJţŮ˝ÚŐhtżsžßů'>棛ÉOuĚŇ` ĚÂ)›!E8oÍľ×a,đ—D…5ăOü—á)TĽ2AśŘ)Gŕ6~}>s;*sUUŞę>5ŁňŞî Ĺ04!n˘ć18&’°ş.Ó0ŐäÖČ]¸•HäŹŰÚ E’Ž<ůĄŞ™´ĘŔÜ˙ç° ¤ŐŹŁMÓ=V)âĚć?zíëîśéA‰ĐŔ”vú×ýq#8ÉěĂɸǓ¸Ç ´°NÉgŤöú żň1źčćE z<ĽR4_:.‰ĚXÁ/ˇŹđ.÷­łltmtżjűĽă×Űśˇ—…ËŢßůŽ{Żű;üo~>x](Č×=ş7ŕ“dŻÍg ¤ôyúNo!ůtJ˝~ÝŽ‹ §SAôyŃ/’Ć+Yü˛Ěňěľiä,—Äa-ř{tčŐßŐŠ>Ŕ%Q¸˝}@íÁ,ěe o.ÖľőZ‡ĆkY˜ĆpS~b0#mpMFĆ †~î Ď`,ݑާ´‡^¤Wé újĄú¤xńA?ՌLL˙űĂd´ĄľŚv´u|ğë‘á˘|UڤĄľ>1d",WLÔ9ţ•3Űő˝:žŻwÔt;…í:ВĐÚր3]¸P!8ŽĂE˘ž6Ž:I”¨š:mÚCÜÉĆťƒđ$‡Ÿ}ş7ŃŻ:úˇĘÇî̄ćgęćúAű:łáŕńçŽmj=˙Ű?í[˝úőłcŸOwN1ôRtů÷°žSaŃyb˝7ř+{ľœ˝÷ŤąWϒąÎľ-,âŻĘPZ:˝”ĽšRWSƒŠŰV‰¤`–Ün/?Q|žx ürůđČ_Ę?+ŽŘç[Jł°§Ż¤ÄI˛t¨ď•P™ĺRg9ÁéOzĎX˘"Čœ>§RZrZH‘é?˜m րîËŐ+ŮwĘv3ŽŮ–”ĽË螲L-ĂçgĽÜ{–ţ“YY 2ŠR4…Ü›yŽi5ŞéI8Ÿţż@šęŒ˜ƒ /C˜i=‰‘śÚ‘†wuĹ8ƒŚ•WŁV•‹BáPq(âE!âˆF­— žŹ‚*ŽB6LYVš\Źl†IJŔ¤ÍxÎJ܏ZŚÇÚHk"ĄMË1ëäÉ+41¤źh>“>U9öDĂaӇfeĽ–§ťŽÔÍ؞ŢđŇŘżw>UŇýŽ{#ńU?ű'%úĹŤ˜M–Uzšw9Ęeá6óAmÎ^*4!ŻUN™’îř†‡ZkrŞAáň§y⨭Ž03ŹsÄ9ÚVăŞvĺ Ó]žŕq^™KUU‘hm˜FZŰ ?ě c&$ހ;ßtô7tÓłGNJá‹Ç~ŤŇ\çÝ=ôľŃF“_ÍŘď[„Ex<˛9ođம vbG`ż7 UŃŞĐÜF]h]áfaKa7ÝĺßUx„{K΄Ă* ƒętš5Ěϖ<œźœ)•ËáČ卐ż “|ź€O{ű #¤ I|œĆPS¸IčÍPSŮĚ$0ďlZʘ} ˇ°ĂŔÂMaFƒÜéwŇLBć0Ů`Ό“:ő"óÜ1œSl¨1ďl0ŐÉľöyâ@öԎäŠoRŚŰRžP.b~ SÚ śĐI; ‰c‚93gĺ2f[ÇŻw?Ü l ő˛¤Ä›,ŠßČX͋˝nËăc-ő ÚQ×őni__öÇ*>śéôáÝ?xxaщţŘá˛ëúÓą‡–N-L8CŠÓ[˙<ŁL˘ŞŮË°§ą;}¤„ÜeńMňf돝ňőČpD9ŘÎľóíž^žĆR" \X/ŃEÎhÄ(‹ěč7˘ŞÎööůˆ`†“>U—™5bn›ŸÄYœ˛xS<Œóq}\w|E4§fh•ÓöiMŇôŇĺ.ÎĄ‰Œ’CUmiCၖglbHs"?&Fdw 0XHEWD‰Fä0ÂYĐLB\[ŁÍPč6šI‘/ä~F1Ą‘Cä;8é>×͌âJš‹§%Á<‹ÝWáĎčzóČşâ}?Ý}eőś+ťŸ|˙%Pż\7zĹ=onr~ÝÎśG넖ˆ˛řőv>5xęĞ+ű ЏŽ-}¸{iÓßgWźqđäWş`Ń˝!î(şŔF~}žđ÷ű´‚™BöŢ KŕBˇ€ŔĹĺل)MJFů=\ŚĂÇtPAIÁDa GĺϘŸŁyGyNŘź*á&ˆxośy^éĎŘŔŚŰ…ú)á还đNžńKř /đďŃOˆ}Bwó45”ĂőćM8Găů´ŰąýÉć•7 Ĺ.ĄKä''dęˆ ăkcœű˝6Vł^ŰÝZůÝd@Xýę}ţRAy“ AHśażíÂ~ÓI”$Ą ÔăŃ.9)­OśĽmi{ڟ.čŒ¤Łť’Ç}GýoFúěgüç˘b—Ź—l׏DŹ *Ô/Ç<Š×Q"Ž…°žWv8ŽÇˇČ XHÂü’FX[™\KÖÂş:ş6Ö’Ü Űb›'oKöđ=BZJ[:]îžźĎAţ€eżë€űçXôŘ;É,ßoś}fv dž§–JŠűŮUŰÄy†żŸ;ŰçÄžsüďłĎ?ńĹ66ą˙@Ühš¤”m-P Œ4T€ B6 tYSŠĐu‰şŠEĽŠ4Ô1*„Ž ŒŃVBˆR*Á&1B׉1VĘJŞM‹Śuş÷;gýŃÎţŢ÷űž;ŸżűŢçž÷y‹¨ĎŻç˜PĽ/ĆéFrëZÜŔĎeÎn 4 Ŕë Ÿľ ô%ŕb ĺľ<ŃňÝůŃüő<—Ż> '(źsŕ0gܚ{ÄMÝŢÜ)üÉ,ą0y>­“ĘÔÍé˛Bg€ÇŹę×'ÓJÄćâLN5ĚWƒ7Öâ”cÎZT[1ÂAŠT˜OşćŽEiŰÜ2ÔgąÎň##›^ľš/J6ŁË]Ž}blN-Ěb!ßn`n6[âý/w^<ú‹ó›oXtměíÍËűqÝNműúőƒůşÂ˛śgżływÍ×Éą=ŁË÷ź9žmŃáMű–Źď~ˇMߪą+›Zż˝c{knCzćÖÂ#ÝOھ⠁ƒ–›đKŔ„ĹpĽ–}"6É˙12ă6pýü€i—°Łr§Ľßž#ôŒéiťY0 'Č&>ć Ç<9|qýç^ŮńܟϽ|†dŤZúwěíhîŞýĄ_%ßÇŃ_?ţÁăĎ=pěţ™ţ§6’“ť—ŹůËÎŃĂŘą<Q8ţŮM/{Łwé[\‚ň$(j*Á*ÓŇM=Nz¨pďWLóđŹ0ý<ďÂYě›]üc=˝‚ŃXĄV9ꊏZz†é˜V^ťvď^*2ÜfˇĄ˜­[Ř×Ő3OŁâ÷šŐ´Ј~0f0NĐŘë|+×Ĺî ]Pƒ¤€>Ô(BŠ1ˆH˜Qt ]G<2xž ăKg°†G1EXÂ!LńjÁČq”˘ŐŚ•ą84ęŞíߝ Ëô.jęěM6–Aޕë2@ŐúGĺć݇5Ú÷čôŁđ×*ú-×ÁýŐĚä6$m d–ů+g2ňš`ÉńĽÓI}ëäqřcx­ÂŔ; ”xR ;ĺ஧h 2Жqâ€! ńdŃ$čb‚hI ă&ź?‰1‡yŽˆ¸6Ć/an Ć"NĂTœ=E–yţS‹@EžűB4ԍF`“8 n—AmňĐVŘś/vŁŽŢĆŠOu×؈ҝ˝S>oŠä󀓦Ś@˘ytIűy‡ĺ5Ə8Ďž\Çý‹ôĽO×p9ňěLírü~ţ[3s>%„řăü&äGAâ#ú.Uá B”‚A ZÄq†Ţ@nhFhfzCs›ˆ_Ą˘Éď  ŕVxj‚ąI$&”nb4ňŢĽ÷ŇiĆ!°śOîŕtů†Îž• ŐedM6YEŃ"™!Ř68EťäłůdŮď ÂP6ŽŤyćNdVćtŸŹŐýx˘<Ş)Oű”ň´[ŸwęNű™dĎYÄ ¸yƒř°¸PúŚŇîWH펕ĘFąGÚ l—š!ëqHŞÚŻě Im‡”“âIéwž“Ęťâé|ŕ‚ňžxUúXüHúHš+ţGş¸Ť¤ń™AmŔ&Ą€˘řŤY\~ˇě2ŁlrÚ˛s§"J!Ińű#6ÉaŰjĂ6I´Z'Č;š(B”`ŕY߸ ü­Ň$‰Ôér™L‚É?ďi‚ż!Gʚm‚dN´*X™ w4kHłśY˙aĽÖWB›čČđú€<>&á§‘Ăě4ˆúR㐾ŹÜ‡:­‹!~ŕl҃¤),˝ő˙vH8Űhl„Ż.ĺ“˙;đ6ĐđaŁžFá|a^aÎbWyŔ襂УĽ­Ž<°vŚ˝Ý›ýţ _mč\Vş˝´!ţÝďŕsWZcÁ´QUEOć'Üęű?ߡ”WUŽ6œęÂ-ý‰)ŞB܇ #”Dóɀ–Y…V)űŃ>eö ďĹŘŤžWcˇ}ÝJWÎGťbýŮęfD•˝ęťť7sĹ rë„ŘS(2Tř#9ćľż:ÝšŹNń*šz­:FäD¨ű}“řJôZöoŞ‘‹bŐR/Q§Aö9WÔwfjëŠ>œ[WzWŞ'6 IĹvź*Ú]ÜZ,ŽMžŒŻž QÉč‹*qoš3޸•Öěžč ŃÉŹ1TԊmĹudíćť ÝĆîĚvCŸŻOŢŞ|/ÚŰßcŘ+ďU†łƒĹ ék鏣÷˘Ţ“”…pD ĘŽpu6 ̓Bůd0J#‰ůŠ,­ÄóyÁ•ˆťÝ.RgHĘ…Áž˜×] sƒ'ššslxâÁ…ş×0ż¨ËÍJĆOüí\28?UÇNHĺŤ4PЁšÎQŽMš-śâpˆĂ Ë/kjĘ`ˇ“öTĽ(2ką€–E‰´‹!67OăË(ŒÖ`äĐä’éd˛qń`§œÝŮűŕʓ¨ŽÎ˝-ënŞ#)…BˇMéŰV–ĐlŹčŇ`Äa+—Hɤ.@šÓšę¸GÁFŸě•‰ÁPY”­‰{j˛8mŹËâjĽ&Ks¸.Kcr"‹3üéŽŘ&Ž;~ďí;;‰}vâĎł}÷î|‰Çŕ8´R>Ž HKDŇQՂŒđĄÁDl>ëڄ­RÔŽ ş‘Q1$*Y*›ŘTÓ$Vuc‚ľZ÷A&QFL]•Ńi`g˙÷’4´]•Üť§ç;+ů}ü˙ż*Ë-ËEçóš,LRG˘ăĄhB&ˆ'ů*‹\ąđIźä ° é iÓI.;A{ÎM{¨ž#\čšáŁie:] Šć˙ů‹KúGŽż_ÉŽ6ü‘ŚeYźô§ëŽ}ŁňŹąöї^^ţ暁Ţ…ń }oŽv}YƧ˘=óí gWíz‘ßúëÝí{‘ßď; •ř󼽖wZpäq~ oM‹’;&ĂXeÇ2Bç¸2˙äiőUk<ĚŁ2ž>îNœ”T殏Öý¤וů´™n°ă‡š/•Ţp#ĹÝíĆî ´w¨ä (`ňÝäWÓ]ĎUK†_2×ó…˝Ń¸Q}wKŻ×E%Ŕ¨Œ&QËĎâé2Šš ŒvťĹî8™ć%Î%~“ř5ńĺÇ}Ë}‡}Đ:hŽGŹ#śQŕXö,ÚÚ2j4ëDYˆ(˛Ÿh6 •ž4[e›“őΨ"7=Ńwˆľ8đű“œŢČĹĽ8ŽSŚŚŚFěó‹M‰x‰kF\sŚŮllś4°Ů­ĐŻ$Đh–✌I'#ÍɘtjŃc2Â#ŒÉČXęsŚ›dóË˝|Ąr(öţ™˙„<ŕ~)…‰ö*łw *tO䦔‰)Źëî?tŚlÖűP_šĺ>GÇ>^˝˘Î0PÓâE×9ÔÖ̟ʚ̪Ć@CQđ˙ŞÓC‹7|HťýäśjnĹRŁÚˇ‰=ا~ß:˝ŻžłvMœňEkŢŕk1šž Îô˜ôßäŒňÔ˝qŠˆŃVžz`z趍!ĐĆĐhŤ‡Ězz\´Zz×jZyę–É`Ó؃ZhĄóDŽV¸ŇpĽ¸ZXípuĂŐ“FM'‹Ľ:q*ěŔ\wšÍoĂXqç[PšŚ‹o'čý݉‹ó2 Ů, öíšŇ3ŃcŠď ›í˝°ĹEŽ!šŚČa˘ľ)rŠh‹š‹hX‘DŻWd™čP>’DĎ)r'Ń=“ť:;kj8•L†Ă˛čŠ×°ŠĄëRľŒ6¨ŐŽhšM+cŐ I=ëz.öđjęYlhšŢśum¸mlI˙_‰eŇd$Ń!ŠL•ŽšŹ?ӂ˜Í&ttK ťçöBMľŮźŸ“ůbQĚź‚Žă] †D&ƒ1 ƒZ3™Ę/2+ƒ•ýěŁy•ó3BOđbÚůťč…ÍÓňđK ź2§t¤şţ!ĺlyč1Şœ,´ĚÝ …ťdn#Ź&bĆsAŇďh- Č˘ÝŽČn˘{Ü`W1ÄT5A‘Ş$hĄŻ5ű 8"Nˆü”ˆ2bݏNä׊Ĺ+"/Zčc"S XžúĎ)ú.lŞf„ľ~uŒ ÂgH/YGř‹ä Á””ĺŔ3+„ÔBqƹ̌Ó,ĐŐř\g™Ŕť?€Ę 5>ĺ*şđś§5C-<ŠÜIS†ŮМŠLí)ź áýęaőuőŹZ‹´2úž™u´ŻĆĎD1 Ä͡@vwjE–ˆŽ**—áLŸţvK8Źc^äJh+.ă_›iß˙ vťƒ9ĐÁN 4ÇéĎĎ.işrMŇŚCC< T•EP%ňóŸ‰ĹŢĆa˛ţŇn9HvÜż™í3źŹýoÜú”*ŐÎ˙Öú?ż ŐĆ#ę~ mýj1÷<(­Tź Š€ ̀ś• şlŢr“ýÎ`]ÜŐějądO'ęLŻ lC›_Kď ü˝š~+đ^ŕşřßŐŰÄyÇż˙wq|ą}>żÎŻŘw~ăŘž8qÚ#isŒńH) jQ ŹŃŠ´"ÚŽäÁŁ$ )iiC˛ ŘŚ6Ý&1F[ šV*¨TŘşśR4M](•–Ieëčźvk×Îţw”NՔřűţg['ß÷˙˝ţVŤ€AąRYŞ0MB“˛L`>A˜˘ojw+9—"x•œ€™ť×ďóyŠ…e Q”¤Ě*ßFFůrY)ˆ'DÁłbĽ¸_ËC¨~ +gŘú4Vo@{ŠëÍJ=IčE‹C͕°Ą†Üܔ/ş:ÄfÓŚÜ¸ F!|ŠBȋž´˘ĹvhçŞn…ňŠ‚ŕPŽW +¨ŢŠšé ŻęU\Ş1C•_kg)td|Už€ŰxtŰÇŔ,˝q5_Ľ”d¤Ëśâ~€żĂ0[ƒ‰2ž*w㜲&ęšń׷í ×Ć㍑^fŰ:9”Œ_ťTa\^šőÁČľ ăć.Ď]1ý ą•„×ľ#<đ{§¨öÂ^ |ˆB’fœw:ˇ;_ ˘sÔě”$žÓ}Au_˝ŻQ—Ţ×(Ď;€R‰—\øÇڊóˇ“*-¨ęĺŘü0śIŸŠĘŽ—3šWyŻR΍/ŸŠaflŠˇ™.o˙™pŠTs¨dŢç‡?U¤“AP5~E‹Ł˙‹2#Π›šKG ĚčXŠ]2hG`é@jžŤ9Ôlş÷ş™ąÝ„ĘľáŠo^ípŽ/ŠsZpö[>÷gÓvÓc¤šČ+Zý(Ř|¤ęWńô™‡`ˇšb1k• ă–+-BK˜É1”0aFcLL[Hﯿľ i!r´p–ˆ…Ú-a ľ´ż[΋úHś’ëIZžÍŠ­Ec$ËCŔ_đ'œ [ľ#C dŔeĆĘcŠŤ˛fŔGqáYw†x+pšý°ŇƒH`tČD}˝ŁIŸTžwp˜‹ŔÂSĽţŇGĽKO˝öłÉMĂ{?űůđ&ÓcĽŽŇJo•6ÂhĹożŇ6t¸tŚtr|7ÔÂ"xđčn”$]ą+҆Ó×ÁöÓ$‹úㅅ\vŤ°%°%ř}š;ű\ĐÜ'œŠýZž¸|/VéKrY9ĄĆŐdłŹd×%Ivg˛ .đSÁÁ?ú.L‡eř]ě˘÷˝ŘĹäŒüQŹ2¨EC2kÓĽT‚pŔ,FQhÝb”„"uľ!š5ÚĹxlv×ʏ›˛f–'~ÎŻř5ˇßäoËę-¸ťľ@˛ eOdéĎłç˛ÓY&[†A‚a…`$Hv›Áśů´ořŁm&;OŒ‹zźOëśx?ϷΕ‹‘ &󷀱זĂ~ł}ŽłČŤ*_vPlj0–ň…¸œHy  â’ôŐ6@<m óÍ$mŤű4Žĺ'Ú\!ŐDšą…aşh# Ą§“ôôBŻNÇô×(ŹN<ž…Ť2*%’hĚůŚB#ęŽd†—‚‰•7^EvП៓żßwéˇő˝‹ ÷…6Ž.ßľşaÝQÚ:Fž3ź…ůž^­ë?4m[VUő‹ŽŃNĽ.S˛ÂM䆖Zć瀩´ÁŹ6Ŕ6xö‘çŮßŘ/K…]#ßć–­˜˘ÓZŽőČCjŽąŹž_şÉŠ ÷ąŹ•IK-agÎI‰“sFœŠSsšœmňMÉoţÎąRť5lĽÖśä×1č<őb'ň¨ĽľČ]-sIł$"ń`bAuU5­âąh-˙:4Ч3PŸŇ6"eŇHŠ6tŘĆ đIŔ?8=ŸaÚbżĚP!ěÍnˆ1°Äńe¤şhWl젛Û#ۤíńŠź9 Gă§g2s1wed<ەüiěex‰ŠϜÍĚ(gć2VžxŔOyYVż0ťPŮ{$WUËŇ`Üá€]”H\Œů61ęŃgލFë⹘DÁ…?vŒF¨š6ő˛YoŽW˙šfÎźĘü™Ůg>`Śf8lœ‚jöź ŠÝf ,/â÷Ç: úŚ-i/ń¸HŰ1Qq‚k­Šťiş‰ijd fłĆ9°łYÉă6˜í6ŢtĚvď/Ź? >ňeř5hÍuęSZ:­ł:WfunžŐóáŠXäÖ˝š4Ît->?W˛a|B^őŁJpEŕÎĽ‡8ÓÎ7ęAç}Śž&Žg˘š¨ŻÁ%+Ő5hL‰ä€ÜDÖŕ ô"ŞzČušÄçfÇŞU@ĎsŠČƒŮI—a˜X~2ÁŠ gG‹„˛3bÜJ§E Ę˙?I0"ň󢀚`ÚXzžThˆXk¸`âނ!Fx‡Ěźł÷ĹŁ <ô_žŤ?ś‰ëŽß{>ߟœ}&ą}öÄçs.ɝc;‰ŸÖBI!L$YźT˘ĐlĄKˆŇĆŇ – •śŐ ŇŐ֑2&JÖcŐHŰuS5ŚŇíŸi ˜ë´˘śRV'{ďBŰťłß{÷Îw˛Ţű~~ťťZłďźwâŮâVřmŔŇÔSDéŐ§ŚŤĘҞýýNxĚ?3sBŔIgďň Ҏx˘n1ƒž—š€x g#<¤J¤íÚF°˛ŢbŹ5Żśu´…l"9‡†EĘ‰Ć…"9ÉMş&ÝSžqi\×ǍƒĚ~nÖ5ëŢç™ŐćÉů,ďse]9W>’ä"ydĄa3•˘r:ݜíݰDAC2d#ś:ˇ:żÎľŽąĚmvmá7§7kČPĚĘyą­(ËĄÖĄěPn(?Ô6Řîśq\ZŕÄt‚‹;ÓFqÂ7!l8Fӏóú‚úv㯾…â§E˙ŚC$Ć x| ˜\"ŞśӕŸË„ĹȘ,JŇĽžÉçüˆ<şœnżÓé֜nRa­ŽJ€J@jƖPý,<L)ž@V€R “×˝—˝đšD˝g˝×ź6oΞ)Ÿ‘4!˙@>Ń.ˇ|ҲŒ¤Í|$oś|€.lDK´Ĺ@‚GśźÖ°VĘ˝RŃv"˛œXź]C"V›(čڊ÷°t GÔ ŞÖÜ8üNj¨¤oŁTˆGŔďź}ZŰ ZPމÍi55´.ÍÎ,Á9›´$ÎăN7&}HćÂ5ŻYrf5+žU?Şý 2¤ěVnťë ~ŤFV*i,ą“°Rˆ“ x ¤á)d e€7Ńqj*ůz Zš‡3Fœ˘ŢŹWĘ<Ľ4(J>זmŜÜÖnűiŇW934r@ëţŰ/Ÿďůä­Îœün(Ą“ÉP˙ĹÓ/śSK?>Ň{ýg;vwԇb䈴ٓ_ŸŮԝí™ŢţäŃMs×X{IŇÁ‡‡_|lß`ëö&éÝÉʇ˙Ę:Žünä^łźŃgfq ÂÁČ 4 FáhdTbôX)ś1vĚţ}qŢţ‘† "!šäcqłg‚$ň&V… ŚŔ0ëÝ%Ÿ˝Ž8‹ô˛ U3İĎąĽąĎąńú:Y“0?şń„ÄKĂŇI‰”.A•¨[ţŘä0 ÖYüW‡Ţ~>úx% ń(4,V0áIˆ`š<~Áëœ'‡XťÉwY´¸hí aryôýňÖ-ËęÔşuáßçßÇŠš!Ąŕ=HüaˇŽśE _ö(œ ?QžŒš^{Űó Ťšő´ÂŰ{—Ţ)7ŰżXüҊ“Nˇ°ctăU喯ŰĎĄUmĎţœ0PěhÔsŽŃŤ7ËuáœJŠ^jˇ‡L&’ŠÖDkjMbMę•NR°Ď˜äöxćR—S˙T¨.7’(‹Ë˛ŒĹeÄ‚,b‰` €t &Uۈ2ÚgđŞĄÁ-+ŔYź‚iœÔx–eLg1‘Ia 2(ޙ^żkĽC~Ďža RČú§—ňźƍ“ĆkĆuƒ4䨾™Qk3ŁÖfFă>ߌĆ XÚ%¸ń=AÂ÷„ žřŸü‡óžľI%ľ Vą Ş5‰qmI—fŮОMťĎľ3şJLuxăąD Ržd*ŮŕŽ6źWqŚ›çˆńÉfBĺ’8U€óƒœĆ(Â"ąCÜO`~ĘŇi̓ÁĚoáďžŮ>׳}ÚŞMˇŻüů–]óhŽĎ•‚‘ŢďŽ<÷űG‘âŘSÉäCňÎڟŽÜxy@ßô†d2ß0Q;ˇńĘÄúɋ„É™hŞqů=ę `“ÎAřPš˙ t¤żˇjű Ž—0ĂŹ!’œr Ąë%DfĽ_ťŠŽ g Ń ˛”‹v2–v8 Ş@űÜĄŕD_×ĂćPż÷aԛĄA›×׳d?{ŠĽJcš8ŐŠ j(-6ŞŠLUĺŒG¨‡énXŚúé~fŔŃďěőĺĚ7¨ÇéÜHhDÍN‘SÔ=ĺŘĹíqî í§Ăť˘Oéϑ/0‡ÂôĆÁĚaú8wD88:&U_ҏóĚiö4w:4/ž>9ĽŸ§Ď3o:ŞĄ ĆoŒ;ĚînäNtýˆžÍÉdÉq‡4&Ť™ÜFocFX[Ű+ŻS{tr@ܢo2l}t3ČŮHšp ‘ ×éá´œĄ {ŽÂËiF_gQ4Ř0ÉyWVVô148ڐňAúŽRĽ‹Ż˝‡{rQ(ˆf3,ë#Փ$† €H!ż(¨zZT}Nô–”¤ˆŠBŚC,T—Çϋœ#Z]3ýCGŃŻĹP8,ą×*1Œ&Âz„aâ†î7 =CŃ4ž62č2#řRŞŠ"9‡ƒahśó‡Ô+´gŻ›ů Śą˘Ő™Jł‘32{3ßËŘ6f†3eĆ­‹ë™O3Lć#ćŻěW9ńbˆťŁDüËäLgŸóŞÓćđŔ€š7ŔrŞiHPąCü˙-ÍťťtŇ|×&Ö{BŠ€XýŞZç*I¸‰¨‘>Ž´’$‘%Ť"ϗčc‘˛N,—@HáЂĎ&ÁŠ\&ňôtţ+’_[ÚŻ.ývéw KO6;ýk:Áç|Gŕn¨Q䡅`PHCžĄ#× H›"uĘj{oRÉ%ö}ń ŰÖť? ˇ?]Ż$“I#žxşFĂŮ‰Żľ*‚ËÇPh*ŠÉđďß1ęUƝÄěîAić,BuÉÖ´‚ę ^’ˆÓ¨bťšÄŕćoŒh!•`T`Ą˘„\‚Ý üÝűçw{+Č*E°‹ř7ăUŰÔy…ßóŢ/_ŰÁ××NěŘů¸žŽ?ˆcß NBnđői 0(  i›)›H ëFˇŽŽ DŒiăG5őcˆ DśJ|4MMŠÖHk§îš`b?†: Ąý‰Ć&&ő;;ďuŘĐögśî=÷žžž:ď9ç9çyžÔV$ĐöŸe(AK)ÚťČYaüź5Ţů"ů˙%}"óRö-ýÍřy8ŻLÇŚőéřůě´q-~-q-ůaĎlá3ĺÓč§ÚgÖ\ń–zKűŇsżŘ¤ŠŚęZ[&3Œ•ŠŠšÚąî”™YGP$ľ˘YźQä—…˛?2ŽeNüęĚNďÎ'Çă Ť ĹÁČꔨsЖ{.v.v.Ç/"Pç#E{Š?™Ł~ËńŃ E4"F\,ŃdO’ÁЁŕ˘aA^â`N3 Ó E÷+şZ U ˘"Eň†oIeÓÂBoÔ€ j8ژÔŮ[ŃžŹŽ(:dƒYěœ*Ű*Íjš‘‹ů ďœ@ˇzz°€h¤ąQ×ţ2ŕk¨ZwĂ(LŔ%˜ƒĎá> Ý2ýĘöők[ľ1Ó–ýŒNő2ýíŹ]üĹ#`=F"zwř?" żNgŠŃPIK!őÁçńł?ˆ!2Œć FÁ “Ťw̰T7VqČ4żeŁEĆ<3€ĚÓA™oojź‡ś‡`qĽÎ˘ĺ…żÚŻ{Źńő VŇl`ësł –žn°xŹś+ VŠ6VTöă}ŰŁZY—jéšjőŕKŽřŹTͨĺ…Űh´šÉÔĚ*4—}V?ö!ÎŮŮÁStH˛şWŕ¨ĹI›â@D,˙{m@2™BˆłŐP P{ŞśÂ×ń#ßŰUů°ˇŠ>*Kć˝ęÝŹÚ˝ĄÚšOʚXvőŸß}ăYzxó捿ˇźžÜzř‹ŐÖ˝k ý[uhfH€GNB!˙:Ř]}˝7UŻľs‰„ Dv|^‡ŠÓĎâ—kJŹŤţ–u§ëë•z?ŕ’/44ÎpRQ˜vXÝ­€ę𣠅.Ű 4n6ůŽĐCG’GR'C'RbŁĐ(RbÖKőiÍÜl ‚€ťH×S>F4h“ŇŠśt"gškÁ6ż ;¤]-;қÍĂâaépúpű„Y‚’xT:š.ľ—ĚÓíďŔ;ôŒůIó­ćĎMí˜8%MĽ9hjtź5ŠE[I:%5bŢnŽś´%ĂĄŠŒ –żär1xčŠ4ŢĽĂɐ‘–LWZJ%ĂBŤ„´śś0"j(/|5Ă^ž‹”ţް’ťąÂň[éSîŠ,˝!–ŢŠ\SJ0ĎÎĘc",sÓ5CLvž+AË]^řârĐŞ%bËťW„¸XÄôš({ëá1ÚQ:ŃłżžÄí­}çé|}˛IŘđľ8ńkąúf‚˙Łąó%؊‘źP}žŽ ˆD^ľĂś D’9^HrT‘Ä$âW…"Ł^vWc`ăĐń] §q\‰ăKÜ)Žžá€›ÄK›é(Ľ8Îĺ2,{/ö‡]Îć'™~AŮ9y=Zó\˙˝G1¨ô9ŐÍ6 1Ź:Z]ĺęĐŤĎK°éË_˘ŸƒŐqĘ9~ľŰlůŒLGe@OE) Dř$ĺÔfÝ —DĄć,3v :+h„Př’pJ gŚLr‘P‚~~ËHŒ<…w\ŢXs=R˜§ĂšZótr8€nvá1ˆ~ŽG?nÇĐÓ}›{[ŘODň‘­ƒkǒąîŰ`€Žĺ× ;a'ÝÎoĆaœîĺ÷ ŢEŠŕĺB g.ɉ)ä DżáxŽňe.e˂ÄI9ŽÝŐŽ' đ<Ĺąüž-‹D űÄ}ý ôcĎúßPÁŒ8să|Ľ2ŻĚWpSϝrĺ2k)ŘQ\h>’j<ţÓťŤgŤgGࢰż‚:Ż2KŻŒÜŔÂ]űě{眏Krœ‡Đ˜:%,-Mśc.­`šÚ)]§™ŃÖ6[5öĄ" cV¤‘áŁÝ4w…BŮ"ąjęŘ4ÔhĘžÚyĘ´P!ą4űżsZ´Eš÷žŸßó˝w÷űzŻăݨéěŽŢ ŇU˝¤O霏ž s%뤿Î倂aŕ–š _Äťł‰˜™i'Yo†’aR"źDđÁĂ“Ü}š/Zˆ6M›*‹CZ2ľz—Œ•–ôaÄpqi>/UŠ}• ˆ†?SU łĘŒ3źˆÁ˝*đŽŞ:‘Ű—čXŤ$íÁŽîÎnNp:\NĐęh't¸3ůăA‚>ŐŁŕşäZ{FAݎ4Ĺiw@‘쭃˘GčU˜­Á"ŔÚ €Łššy˙ţýŕŽŕ’¸8XÂě XŮĚ@–ˇĂNŰX”Źęź7ÓE˝,é1ˇ¤ěTↄHݙ¸†ö¨;ă‚WŮŐČjÔ.¨P;3č˙˘ŕ6ا(Y—ęHł°šŹ#B¸&Tíë\łşFŽ‘Ăţ,3Űí łţ?‹~׏ćž­ď\ˇă+‰Ś_ýcËHŸžâ̔nN{ňáľJŔUă“ÄpďřŽöüݖĄţąî‡ž~Â_űő/äÚűż˜őGjDd‹ÉHŇđ'+iW™ëŔNŰyű˘ VS/Š’gŘ3î™ňŘJPL{xä‘<Ôł šeĎ ńű/ôvx ú/´ˆÄČců(g)?QąV:ŃçŻÉÜŽüßś¨ŃXKy7IQ>AqÔQPmÄ-*ř¤Ú4ŠkÝ1ŅEŐLÇHýűđ€qH†Űśa€™‘*śXŠŤ# úżŸŽs“xí3?xö—ŸţјF”f/śŽy"łýčŃÇ::š/ýë7‹ß)őôđ3/nŒJÉńĽĆĽ?Ž^síÓ?…Ŕ%7†Á=4|űŒĂ†?ö.*ˆ ‚Č0"X ČşĎI Ú¸ĆiđHfž´8(ţš`ˆ…ĆőóĚQâíe{Ę~ČV2O›e“d͒É!SnŁöQÇfă! Śf—kŔ5ćúžíÇÍÇMR6 ŽRDľ×ínpÁzé}„îr=NŸ¤ÇĐ1ú šDŢjv§Áq} ěÇäőJ"ŢŻÂ4ˇ­%l=5ľˇ´¨ź[EnM¤,`š$Ÿ–yUž’9ůƒŚaÖzśą-Íę BŽ-÷ľŞ>BĘXšČCNgpA+L%K‘tO&Ł)ĂćhĐSŽ&Š D§¸ŮŢb #ŽJbž›!đ]ÄĹ<ř3¸sՈ`Ä÷”ąjÇ5öd‡żűĂÜŐ\iđČܝ7÷ BF öˇú49ÖęţhĄMč}ÔÜúŔöéǡďްîî•+x`ÓOŽZBy÷։ş,žoög†>íúďс^ŽđÓ(„âüWWÝčÁďD@y­Ęk Ś7ź*‹0iŕ’ €ei%kdý~?´;Śű "áűšÍ&–şÂ8bť¸üŽ5×/06ŘÚÝnKX‚1Tĺóy Ö`ÇćlůžÇĂ%t䈧–:ńŐETďč`7ÉÖ3K„’iÂ#R€ŕxœŘȡm/ŮÎŘxv+[cLL18‡Bjöɚ°[€=Ű-T^™uy˝jâ-ܘ˝Á\<9Ÿ7V[k…•2¸gk;"ůÚ*„ŢĺíľT˜Śd䬒QŮŞ\šÁ´CeĄZkL[Ý#Ímé˜PëÜ|DŢQóŮČö(ÁźS N‡hJ˜äž)IĎÄȝŠĚËýŢ÷i‘ű7 HÁ1ť›tžAŽů8ń<ÍńNĆx2ŘéÜŔ 8‡ÔÍÜfçNn‚› NÖ~?xŇyŇuŃ1ăœv]ĺţĘ͉‹ŽăÁčżTWLçžĎgŸĎœďŒœąą}Áç˜lc‚/@3!„65‘ŚVšŤÉŞHShł,ËZ ”ŠëˆŚĐšMÝĽŠŰ:•Ұ EjW´IS׊M*Eýc SÖEŃ´•dďűٙ:ĂÝű}ď}ßwwß˝ďű<uÓjšG‹{ˇ›śjĺŹ?4;™¤Ű…ÚčČ9ŽşNťV\ˇ\f—Ë÷'3/¸ bFŠÚˆćccؑĂ=ţŽŕą~ÄťcžœÝMfݧ݋nÖ}ßé\ŕI’_âMI~‘żĹłođđ&ü*›çř×E—™9qĹśޤhˆă"ˈ’Ů{"ńIl°—â@` Ć\@ŒnĎ#m™Ÿł<_B )aH%J2|"ŕÚł.ŕÚ zyzr(E™l–™Ÿ&“eŽ!&Óüřٌü*c…ťŐľäę =׏ˆËYŤkÄ_ľçŤ^Ťő„jO¨öl´gˆśœKňćź!9×-˙ÇŇ§ŚŚ9ň nO Áˆ`š čĺ€ű„?~îČY=čúđŻ}ůw.ŢŘ>G~m‘źÇ2‡Î˜v}ôěłÇžsž˙œż|IŹż˝g2œ5ž>4Ć0ě)ËKLÂÄײ[Ó)^éŽn`bűD9‹qÂcŸ8`Ż˙f80AEM} R"‡đdLř°đ0Œ=nŻßÇ3ů­5i-żą%mUAi éôşt˙ÖQř>†ĽŤŒÎa`ŞŃç°'4 ‡H(ŻŚńąQGł‘úĄ˙ ĺע¨ˇ=† OńˇßŘ@ފéŘ÷bhŮľaŮÁúaďYöl˝ĺ˘™tč§Ő%nɺ¯Ř.I—äUÝ&qP§ŽśM˜üźXđvrŔZay#ŘX \˜rXóÄ¸D¤dkÜ!sźU Ŕ+äŕ[‹ x+ŚWHk˘B$Ł!'ť,]°ŰIƒő­™™ľ==U›ĎWm¸“ZĂíWSK"Á?*ΉkâŚČ‰Ţś÷XŽľVÔt5(Gˇ tОíóĹô PŔhťÔ›ße AńÇĄEîˆćŠh‰:Ă~RC„ I˛"­ËĽŚ!Ü2iš%ݐj@Ę˜Ş„ ”ŸŤËE.űľžC۟ĆcýŢ+W&ߞz˛'đt‚ÁHťáżËîŰžź°Ł-Ž >e:2Ü{ţýƒz6VżßŘŘů˝?÷Cř1ťąNž‹ů63ĹžbźŕpżYΰŒ.M'[O21­\;wđŐ9ß=Vœí>™+.š-gÄx„}ŒńŸ,ŕƒŽÄgü‘Ť…ěě5&Üűű7Ę7VY=ŇŚ‚Ń´Éš˝n7í ö];lŮK6ďccŁaŽO°~ú@Đ?R úěë}×HNAâG2ą|Şh‘3*V*=G oÂŁ”8.CĹxŻÔŒH =řŇÁIě|š<zŽŇ˜łuß)é8–œ:0ŃÔɒNÖôu˝Š_ĐďęaýRöŇĎđśw`˝;Aš Î Ś´ÉŔ 6€ú*ŮŹˇÓNđ‘ř.ŽŹs\çGgfFGgg~hŒUZşű"b*90ŇCáM<0;::ÓJߡVJääl|ý•ý–!Ű뀕ăş( Ö ˝ÝVy'ÉÄŰ`­El*k kaĆÍ~lAŮo14bŕ;ÄOĺ\“´Ĺ˝‹Á\`rď2ővűQîݎʻ•w‘¸-_aC QÍŽaIK° aÂő+ĐúanŢ;Ĺ´~ĘㆠĘnŽDhŒq'ôá’úďě8m ¸ďlooc˘˛Çœíë€ypxńAÉÉuM.™%žWPü~yEjF›ôźüšzž÷5óőқ’T2JÉSĘ)ő”ů-ĺŒzĆ<ĎGî¤vLţ\äG=×C×ĺŰümyGý´ˇťŹ–ő˛9m•Kóň†ô]šťŔ*֐5\(M“iEěSęä)eŮęĘ*'Č ů#ĺ_Jř°ú¤ůNäéoRX‹ô+ć i⟐…¨*ÇcI:(§zLáx¨Ţu<ÜP–Őĺ¸`ȃƒ)ó8ßŐ&maJGRYD IšIxG/RB_K‚‘Ł.Ýö&Ęź ^úGŒ…˜ň0Bđ9cĄë–Śżt%fJčF7@>˜!i̐öůuE&źÚ+†™L.M.#ń‘”„>“ËNĺ •ÉÔÔWŕ˘qEą-3aŢ2Áً„O‹łĚ8éĘń˛¤(şäqœśE>ńŤ:ým4* €wĂĐĽh‘žŁü]JnŇ(żNˇ)O šöşNô¤Y"%0&Î.8Wq/şŰîM7źä’snÓĺÝľéŇyţÍôĎż9ňŃ{g7Vgk˜ýU6>ĂđŢ*řŐŽIÍâĄňʁŒ)-*̗{\ÝéůňîËÝ퀃 z›żĘQśƒöe<öŽ(6ŕýllœ…úruƒŹ˛;˝…Tó§mmš#7Ă>čđFä*-EąSKrĐE‚ŽB÷†Zb2сlƒŹ‚+bĆ991œ›L÷ ‚(ĆYFŠz1…Š&AőĐWôöÚâąŰGhwz˜l>őíʝ;ĎdŠśńxëŕđž‘Ö? ˇÖrçł}QšÇJöŞD o~ąţÇš^Jƒźeńî̟[z!]č‘l›ôĹľGÉł­›iŘśŐŇ_ =ńúÂ>5‹JóřŁ JÓG~ŇqG ́šc‚ D$L3Ó Â4ƒPL’P6 ř˜ĺ‡´c€m‚żž…çĐđo@şaš8D4ž` ‘čƒ”€qLI'ßs0ăSŽďÉůrqćq‰śq8ăDÂlŠ0˛ŕ­ ěŚˢxą °,Jľţ‡Ňś2p$pŠŤMm[ťŤ…4ôžňüöţŇĚŃ.ĹNO-iÄז´5m]kj`˘Hó)ńH†äSB.›ČĹ*ńTbnI$ŽŘ1Ú^†2әœ™hR˛DÉ]§MzŢĽazŠéÉWyöK›‚‡ Ú1—yŘY:ČxÁ˜Xh•Ën˛Çԓ#*QÛ˙ŠŹL2 ůç‚܇šˆP ý’;ú}ŰE´Ť>~+MeŸV­W‹˝/âĹχ#žŒß¸č°YΘ7ߙ5ߙ…#~gÍW*l^…ĽÂ€RŠ&đjŐÎyՎżT; @đšoŕÜŞ„ËTvşĂNw<ř€~<Oƒ˙đŁxž7€ {Ź„ÁŠώ󸆧˛5Tś†jĄ˛5Ź"3Ę­ďkXُü˙‹ĹŠß>ţ`ÖąúÂřĄ'1}ł–ë>Î)ÔÉąú™úKőP}EXӇöGĹŮýaŹh°Ś8ŻŽBžvˇŽĄ!čţ7lCZŔťĂúë,Çsv‘? ËĂęQ1,.×WD}lAeˆW­.f#+a6ćxöŻÂţUŞđ3đ[ÖI‹@ö‚j˙dG=ďd=ŤAđov´ZmœlGÝm¸sśĂ#pě™o”Ë(ʀދąĹĺ“osónq‡`/Ŕ^|pë­¤nčPz[cŸ?0!Ţl|Ú:o`­äÄHł%‘•Oé[ü—3^>5ÍTóŠ…#5ŸŇ *şœuňŠâV(v9[ɧć!đĎÖsľĘrŞ>ם÷j~)?Ň͉C +'đĂ í§RTşÂâÂüXQפ†Ś%ŐN-˛n]´xk‹Lú˛—w{şč‘uď˘Ç{8Ö_;QąŤUłśTăĎ՚5žŤ)5žźž’čŸ¨­llń_ĎzIß"§Œžĺ`1US Źş‡UŐ߃nöčĄoĚ}$Ç­Ě~5f`,偗ËíÖ[Š+cS96”śiz€ôșžĄ˝\9ť ę~Á Ž˙Svľ˝$Çę.QűRGv‡Ĺ=őŘCyëŁdétď#ß|tĺĹžg7ŸM÷ǤŠÇZłń™´&uíË­L>Wĺůžó­ąj)Nď?65yüclą5SO˛7'“„ĂrZ=}ęůĹĹú[ß[ąúĄ<ӔŹú_˛Ë?ś‰óŒă÷Ţ]Îç9Ÿ].vě;Ç?ÎçKâŘÎLĐr4t@2HZ֒ĄV+lů(ƒQąÂÚŽSŁýQ&­ŚnęÔ¤ąBˇ˛ŹíĐŞ-"›ŞIÝŐţ¨4ą’Nš*mŹĹěy^ŰŞ‘ďőë÷}ďÍ{öçů>ßg„ŒsĽ!OĐů€Şt>v˛¸\aâôć8Ý(Nˇˆ›*naRăl6 ˛Yłh´S9ľÍƒw˜L›îF!q7žˇÔ| ˘ W;\œIűÓ%W´ƒĽZR(@NźuKƒ ˆ|Ţß§2 6¨Ť˛ą§ `ăW#ť<Ÿđů´‚ESšˆţŘŘy08!?U~Ľüžźë~'ţž[ţĂC6ťTvDN‘ÜĎůߏš4§dóÚ`wN#×#ďFYG#[ÄĆi‚<ţčř˙a@‘'Ë؎đü?Ď/đËçŔ¤ă;%Î@b`HľśÉŸĚX[WĆŃÓ -äś-Œ<´ó’/ąĺ’Ćoyxç蛌ďî"ĂĂĽÝ]Ä80ú&ʕž sĽ›ňÍŘ}!;ŒŐ ę%ń`Fʲ™śŹ'#dţ°ÎÄIT'ŠzŞ zĄfY'1šˆˇEgZ› Š Ť6úM Ž Œ:Ăěaá˜ç˜t,řMĺ°z¸MƒBŠÇÝ&*1¸"đĽ_ňVp§1@´|†!ŐndížŢޖvAˆ„ƒČ$d–Y>qੳ7Ž=ńôŸśŰ8wňą_ŰÄ]<ű‹ßúlîÂw_;qűȆţłÇ˙Pýŕü۟ź0EÇÝŰŐAî `Í`*l{5łĎAU-yňřć%jetÎ Q é 5g Žżlř5Şť:BÔL—ł‚ź$DßmmÁ’ěGWFę\Ua†Ş0C€NPXpn+TpiJ.ԄvqQžÂZ Ä6¤ő*SşűŮeąäA&Uěz<}ëŕt”ŰŐȐ^Ëęc'F͚Ťr‚d0¤U‚Ăxń4xüĽűĺš2’šb‚x.×ÄsÉBŞOxúÖŠźEŢ%?ŕOwžŽţžĄŽ]Ožě8$ íxFźŕş)Ţv7w÷–ÇzöđN)ˆ\Î †ŔVľžnš2RŒ‘6ĚF6hĺ8žKî%xօgjUĽRQóĚ{Ř Ďœç˘‡ó|¤łĄ+ä 'Śë#ÉŠ$;—$LRN.$“ËÉŚäÄşˇ†ęĹĚz™ŞâĚ 4+đX3–Š\WDN’Ń˙P˘ő‚íj3=Y_ś;cťJ:)4CSv÷ę¤číŇf]Ęé™qfzä2ĺ:äĐE94ŚŹŹšW 5Ő,]7:,‰f7˝8üüîég§^ě͕Z*CU˝uŠČŠ„š!=néëŰ÷éĄÝÎhw!ÍUfţzôąƒĎźˇňĂوżłzsO9‘ÉĹ[ÜĎíëVĽŮ꫓ŠuŁŰżú—émjXf6VyXŽ3yŻÎr4KĽ2Qđ-"W‚P„‰„5IM„D}ˆD}Œţj)tţ{‘–š`ˆ•]qÁŸŚ2Ş`Ž˝.ŠĆ Î{Ľn–ŹEJl šĹX%4–Gcyd0ę&•9ŇI-ˇŽ#ŹÓ9×ů“ÜůNž;ڝěĎŻľ†e'ę$‡ó›­Q˙Ht,1’Ü™ßkMĘű˘ű’“ůăňtt61œľNEżg˝ě)úrâĽäňg­Ÿ)ŻDŢöšuUš'ř›uËúÔĘ띇2‡r/†Î„΄;]ŰC¤]”Ě„Ëh'fB0R1՟иTÔ$řXŠL\uš)c4MBě ŒFć ;AćČEŸ‚|”-ʑ‘űŰȍȿ"\DĆŃČ@ÇŔ,UbkzfëĘkÓ3ň¸~Ľ˙ňŹÔsłšÎ…ZŇ-YÉ… É()aSŻą‡6ôŕ[k13¨€d•ľe •„Ąţ{ WcŔëĺ¨ĺÁj)´6Vw=ťĺԟIříĘDvýmc˙ÔůęŰÍ]üôńŃR[&#{+`}˙ű7IF×ŰŇw 䐯Żýîęb™çŰ x˝dĺČĺ:Wš<ŐHAk ԜŞF”ŹĎUžZĂ×j GŞĄ1-ŒôiÔÂj´âĽ ‰ĚŠJëŻ:•ÉvҰ1iĚœ‘sŠ>Äj +ܨożŕJĺwŽ7œh#ż§pť,Ü;éžułnŘ@ŕ¤T(´‚Ĺ3ţ %tţI‹P켎sš–7ď™I؟)ô/-ŻzȘ3 囿ĖüëřOň.'Oö扆*GëĹÓ)ĂĐ7dĆFĆăÍÂşLxuÎMÜŮG|cǸ "Ü+G B—–'y&Ö4M'súźÎ2ş ⢞Ź7éć+ß p­Öx3NĎP˛ä•™•ń@­–Ť0 Á;ţgͤNŕĽ^uŐý\ŁHŤ;:ň•CG×lîI§vD‚‘ÎîĐ˙ůŽţŘ6Ž:~ďÎgßŰ÷Ëvî‡íœc;Ç;‰“GĽšnMŽ´D›—lŮ$ ĽąĄľ`ţ`ŁÚD­YW•ŠhÖÎ۔-"ęŇV˘-ă2„˘ŞHőSéTIůžg§Űţ!ň{ßw÷îŢ{š÷yßĎçz`ÓZ~k‡!°Ą´Ůî(ƜžxńA×Ů0É=˛śă!Ä[&FüÔä‰ĎĆą€ź<~o…ž xéó ´đâ”^JVg4Ňńţ#ď7’,“s‚řž“’Öӏ„‰´÷K}ΑR>5Ϣď˛čIąŮ"B¨;`<D“I”ĚÚ&š0§LÚTEjdŠR T„Ąd:‚!şoůʲ|ĽÉ¤÷Ńџ’Î×KŞ–îî 4‡1Ô],ú:ű,KłŮîŔ–$z<ůí$ĚŞ"Â+üČ31Z$ŠÔoraâbÇ)őˇsŠ—@CU*¸ČKK•yI-C, C'Çť†KŤjÁËn—XÖ#cÁ‡;çäăV]Bn˘4UŞ–üRŠŽlďyH—BÂK™Ľě_Ň×2uořn¤odţéŠęˆ[qżŮsŘ=ŠŽŇG™j´jV­jüHĎŃBHB-0|ĐÜw:ţ”ćâL,˘Ćc #gšłüŹ0gKˈj>Ôĺît÷”ĆKĎäžqŸ ŸJŸ.Ýdnă9Ž/I-ĐIԎŠˆFu”Ÿ§ udzJˇž4ʤŮn"Ů´áËáNc!†;;T5“‰>É!M˘?R…bwEáj~Ď0ô:łŐ‹ÄŠřĂŇ慠—Rď§ţ•bRu&â‰SšŚ¤‰‘ęhƒg8ŚQhççÖ4áL9U‡ą^‡v^G6Տě—w­ŽÝéŰÄ­VÜ?/…*cĺ"čĘů{š  +Đԅmӊܔ\¸U*€O˄ÄH($>.äÇĺĽ1’oÝnTڑ܏ÝhśIł ˘W 6 ňc$§Çťr휏říJ*Žü9.G8§]l­'vě˝`.ţnŕŽ|GšŰ嫌Ąi Ž*Ü4j¨FטšřRh&:cÎX3ńَŸĽk=AÇytS<&ÓĹĚ î\fÎe+cX4+]śQ滌2ň„2 Ĺ 1/”Mě$ Ą\€[.)|9('Ց°+óV™ٜQ0Ż•ÓÍ„pN+ťşÖKmŽ%Š0… S¨e×Vń;z’IeFÁӕ+l›™‘žˇÂŹ2ÇŠ,ÝŰBUĚń0z¸–,í.|iß×Cv˛ĺ0W<K“‹­''PĹëůeŘŃŚ„żŐÄárž„ĹëůOę¨}›ŕŚ8†D[ÔÙlŒÚRlibcP!Űôá+“H,SŔ÷L•ă:m‚<ŰOŒŠÝ Ťýˆ`OĹúwáÁžŞ:-ě)¸†J^† R-b މ=¸Œu9ŘUŘć‡3Žo@jśˇˇoˇY“Óö`ç™Ú“Ě:iÎA›In‹-f\zš@eł@Iř˙ ˘ Š)k˙0u! MĄş„|¨N/xYŐ03ŞşW›Ńč*Tg4ƒÎnÁ@×ůö÷?­Ó€Š~€> ăm¤ Ä^ů}ĽÔ![qI‰Kfœ’KNÄÁĆɁ-ŔT#ÄRśąéÁu‚n ŚZč„+g™”Rąv'źöAĎwî>čƇśŁÍc#ůoě*?Ě_˝ZŰWŇߎ>0öbÍnîˇPvuŽşwĂCtŕsCt0ŞF€Q›>ßÄč9ž§LŐyđ¤@ąĄĐĚ?^Ś …5ˇnа-Źôéoq<ߑ‚÷ÄH ďoDó+Ä˙)ŞŸ&wŕ|ۤaăq–ó˙T˘c‹×—ĺëd[yő Â~ýË9î˝yq°łĐŁŃÁˆ1Ó|‡Rl5ŁŰ†móeaX-ëƒĆ°š“ŰÁoFőQc‡y€ű7Ë˙Ň|ÉŞuü†:Ĺýš?iœ4OYorgůsÂ9ýUăuó kąăŞ~G¸Łß5{j<Âłüžb€Ä|_3&s͸m[3:N3ŚÓͨ($zž:QÓhšžbŮ?`¨íŕ‡ša@/[đ/ŚŢ3?ŽčĎ̐ş]§5=’Ô(ËNRŞ $á<çšźiŘşaôňB„çË43<-.ŕg}>$™Ś‚l˘üŚ!ęuô4. YČ5áœpE`…Ăź…A,{ţâ î5î"œŢĂźń”ůúŰŐÇU†çěĹsŮ˜ŮŰĚězgw˝;7Ďˇx,ŁԒ&¤QLŐ´jĽś ¤Ö!I…eKˆÚy@– Ľ/­x ¨mb§‰ƒUՕŒ”—@^ŃHUypK+b0Q@‘ˆţ3c—˜Ő9˙9gçzÎůž˙ű T™bá}ůT›%ď-ý¸Řěp%ŢĄŘU°KËč˝ËxÍłg‘x™Oˇ+„XelŃ˝Ű'|‘ß’>•aĎKwó$NI5ń÷:aך@NÍEmÉoX Ť6^}¸†ŒŞ}rWř[ßBS oŢáĘšDČëł+Ůče0  R8—v™2Č((ČHDL;–Žd!‘NƒjĐAVt*Ůp@¨Š4M×t˝=¨›ŮnŠLl¨ŹvŚ:¸˝bn_Í%Ą~YŐĘՑíPb´˜dů˜ŞFeßýż†Ł]ł  %ń`=z ĐR_ßA‹VQ„d¨žL˜—b5‰‰ji€ Űź×sŃĹ[7ŕX}3W) ˛çŁ„÷¤AßRř5ř$ԒĆF(ĂżůŮ:ŞS§T¤ĆNȈwŻ×•ŠÝ ĐŽ$Ďęő{}üQߘŕťV S6٤ƒ˝NNƒ)¨zŮ~Ę>Éž`Ž~nÜSďqrÂbşăŸw­PjWlŰ|ś[”ĺRĄŠí§ľşćjGÄóâyéźĆÄÔ˝ľ˝úaęqtˆ>Ŕ а@X€ŮĽćáë˙Ă˙Ö4fƙqŸ0&Q˜bŠXˆžE¸BÙx“%ˆiÂEW|(dHŘ\]•„Źßť˜ ¨ƒs ÄĄžhc—Hvú¨x$f! ŻýŽ-éšqtiż’anźŸŃ]TůŚšý{ó“í¨ŰˇŠŁăŔ'e°Tßú;zsn\L†U5,âj&ťuýŤ[N+!UMœź˙—Ё­+áЁV‚hĆE…˙ 3žłŁă'ľľHƒ‚[9Ŕ3—i…ĆeŞĄŃ8a™Użň .!o.ő5-$’ œ6מť)ŢŇoľXŢÖ85V‹Oq§bŸ6éÁ1›?ލؽh÷„Q­g¸í‘ąąĂř°°O9 =nl{cGĺŁęÄŘ)z&6ƒg„™ÜŒř ý:~]8/­hJ2Ęc^ŕë%\Ju“3EgŒĂcGŘă݉ąČŽR¨Á{ŸEŁäC~č ÇÖÚĄlň Š],şś=ćîšăôzäK|F[ jňMżŇ›b.§ˇŰ.ˇ@~Đ´Źľ;íVGM-ä ĽšxqZžPâ¨ĎWgŞĄęBUeŐśÝVăŽię­ ˜íéęDŁ´*Ót­Łf:5žÓő‘V<ÓjĹaĺ%6.śtUŽ:šÄ…ămşĂ˘ÁŹ„c“e€.$+ۑj4ĽČĹAbžó|ĺlu%—Ę2’ ŻĆqǓ/Č’7ĺ ŮX^ uŠEŁď.vlř`‰jĄÖJč}ĘĽĆB‡–*ךÖ?űw7đ–Őˇ&7ŔĎŘëďf[š~…ÇűDHůƆ@/i[sÉéh¤¤”;íHˇńzŸĚńş?Ń)ˇďôaű]üŁŰТ<žŸKâńéľ5֘5ŁÇSý>IՓÔ$€ď*Lqn ŹÉÖËJŞíϖ f‰Ie…^Â+ŕžDFĄC˘—“˝¨—Šőh Ş.i)Ń4xrˇÍËźŤ–y’đ˙¸Čť42ď6!\NŔ ÄăSŽV&E€1\’Ń ‹Š d($\  @˝”‹1ď Pę^ÖMʐ BŠ¤ÂŹ›‡ž—Îş]&ë#ׄ"09—őo–sMO€’u›¤Ŕ“Eňt(äň‹Â¸ĺËő_}ôĽ?|ňőKN÷âŮŐ/t:—ł•N“Œę:Ą&żOlé^˘s čmłRĺžzp˙†ş{j{ŽLŻ?šßݞhČi寧?ÚhlP+hÇWßúú7žÄ4(JMů­wŠÂƒ{”ü`“ĘŃsxŽcď7,†í•´^1C鶝{śűăčOB,M12“g­L^ckŠZ^łFQ7Ő)<–:ÁžŕNĘßÉ?S8Q?ÜĺÎʧó?(œŠŸăÎÉŻQŻąŻća­P7ڟ TA“XV}x˜CžR—‰źŻ7wä˝Ć”ĺ|~d˜ËŔ uËň…˝5 — çŮÇÔ!Ę 4˜ęŽÄ× a$ámu§ęůś(će˘ ú˜ŰäBOs/păÂÜżéŽúŘ&Î;üž÷Ţ%věóŰg'!öŮ>ŰńǝáÄI.v>$!ĽĄƒ /t…˘ă#PŚĄĽŸlÝşśL ű'›ŞmA¤ F0ąiů‡ŽX…*TMŞ&EŰ4-Ó4eýcÂÇ~wƒM­í÷˝ß˝wśď{Ďű<ĎďLżyťyÚLĚg °ľŠ›âs~Ěůçý”˙ÍéVý *áMg΋?ƒ*5>N}|ľr|ľś^Y%­M íü꯭Ćët˘?ƒ>L)7ujůBĄ~$Îř¸N ń/˛â†7ĘŮl&—îŒJ6Ă†čZńW2)~úĄ˝Ńˆă˜ő˜˝Úws—Ÿč˧ÄB´Š}$4 ]ăD//¤ÑM‘!­ ˙ť#ę0[X0ëŃÖ˙ČŤßLÄŇnŽo÷<ľä“ƒVŢ čí]= čuáóŞâ0Ńzžžgçmçé*Ý8/`VxžíĚM˘]ܤ‹´Ň‚­™ű*˝ƒű”žĂ5n 2Љŕ&ecŹŰ|šÁ“Ě^†bRֆAŸäđ4w”ُՄúk@’F§3r˝Â-@i‹>ăůW;˛TqHíb˜w›Ú-´ăB„vB EsŘjXý_čI3)ÖÚŔOs˜KaމťAő!˘Š>5A°<Ӓ'YœbUöKŘEčś D°Ę–,˘0ĺu ?ŠKČÄúńńőŐ žň`˝˛ĘĂt¤6S4ş‡9ęiBƒÚíě™ć×Ŕćţkă`P?š‰C‘fđžíÁŐ ,ORĐŃ:`Y8U? š \őÁ–Ý:ęÔĂ{ËÎ}ĚĄ‡o-; ´ÇĽ‡YvAČáîIq7&b‹5ÁźčÂb—Nxdĺţ=jŻv÷ébs+m ¨ö#<ńÜ6ˇ`Żöç‰yƒ][5éţÝ`Â! =ř#s‡9„8äC%4F…ŐĽŒj)tBKC‹BKB“Ą) őć,xdLOŒúöĺč@S”•QeŸěS(.ĘɔŮŃŕnh1ˇ+Y%wşů”ËÄŁAę¨÷¨šöíľďȤ}R˜ö’Ó‘o)TBŮŮŁSD‘ĺ+ш3De…D’ŃD¤Ź”ýůĹ\f1[^Tţ‘Š”˜M,&ˇţĐϋ‰~ń–HÄ*P­()Ë9_˙Œ‹>Đcâ‡ń ›ĚY”á3ţ É|żłäç}9œ;\œ…Ňńđ,8“Ăž̍ŕ‘+|φćC—C$TĽüŞ“N•Ëcc|'îźŇŤß,žU$E¸°lmţé* Şçđ¤[GÇ÷=c kľ Ô8†RYŤĚŹVŔFŔčş>Pzď×oš)nÜQ4J‚‚R1Ş…ú‰cƒkęNĽ3ĺ)SĹá!É!Ů”ÔvƒSmˇHƒá‘4 Œô`;ç| ůpŰSX0Cäm„hX*§Q8˛%¸ľ7łüIź‰@ç˛xN˘VşşîňĹř˙ëň‹/BA/t`=ä5ƒÉ4î˘.'E!*›q„„Mšœ:Ýrd3TˆťÜ.gˆ3ś ÜĽÝíNë* (ÍÚ ŇkîĘ:h$MKxęÖMíRľŞ]žy O]}G{˙ŇœYXŔŮ —´÷kwńKoĎřĆďĂí́ŞöÉXC˛Ź˝ŠšIŁ”\;őőîăťÂ2sčšvázUťtăŢQ˝Žw^ë]ĐnŸ_Đ>X\„ß:ó w_ތđigV"âhżŰEQpóă”e++xľ—ĺ'łOá… i|C*៪ĂßSpEţšç„ç„÷ůä ňkžW’ŻËçäŸ'dk99*ďö’‚<čj!]ž\K>A/ě‹đY>ň„[â˛ÉżRj­bóťŢ•RI‚âJI2‚řJ)l\J­”rĆHqĽ”‡@íŘWJěÓJÉúFĐ镓~7ŐâOx…\BiŚBsRdN ‡sýě\.ˇy.Ÿˇ˛`ŠŽćsˆ€ľčťŠÝÔ$ň”ÚćZ[ćJ%܂•œ;(ců˘×[t€Şôq˙ ˆi<ƉXŹRŁË˝Šs¨ˆń1Őa"s”{NČ!*‡ĎšbčŹýŢ2ğ,‰ť^Н8ç*żŽăśAö! őm ŤgAŻ]?]ƒ4ăS3nPęRr•c1Şě.ÖďŮřr}OôkŘĽHHűÝćˆĂÝ̌ÝŢ2TűĺT bC|5Ř?qťśB%ěL k‰1:ÂîŘţ[íő­}°Ă N26„?‹ş$X+“äIŕ`7J˘—@J‘öRŤ/0Ů-Q5°,ŘUË2" š$N}šînƁ› ‚Ú06ýăúÓZ_{L†ëFƒэ6´ą‹ëžDúüa<źkŹÉ̲ GGďÖ|ůđŤÔWöŤ‹Ő’pwôŽo.|9Ô!ďë ˛6Ž7‘:šsßĹp¸{O_›ÍĆ÷Ä;ˇĚě|î"zđŕá*`‚V@˜ŢA0çcłÂTŒt 8Ž őëd?ţ+ŹU ú’*"ÔŕĄ0j2aDóŒÉŠ˛Ëˆ´éKÄűřYžđ°ď1݂ˇľí&Ž!}„{‘ąăÖa|}­Îľˆżmř4˝Ź¨O4_Ÿic}ŞůžůŹÔjľpMŽV{´Ď/ ÜŐĂŠ÷e#Y?Ç5š‹Ét[xfęÔÓŞžëŻ!ךnW7™˝ŕ^ŢěDËŹę4˛dş9Á'̂+<—řĎÉňá.2lčĆCŇslÖËÝ;{>Ln#ŐżZ,V›ĹѢ§ë.ÚÝCö+˝˙ażěbÚ*Ă8ţkOaÇRZ`´|ŹHa]ĄP`BůƒÂ9Ć q݄ p n!Ä̏mq. â6"Ů&áJÅ"مwA㕉‰YââŒŃD˝đc7şásčQś…4ĆhržÓß{ţď÷ű>ďsڞâěâôČ‹Üه––(‘wë˛ŇƂ|Ëxľşâü†óůo.ߢGěĂI'íǒ,É)îLG†ęł%ĎůŞłb˜K¨śĹVšËZü&‡?ÝÔŻř—ÂqJŢE>˛”9œéÎŁNĹŠíˑRPx{ j›şŃuS~ĺoÖ÷_ÉGŰŐíńwHŰߝŰÓC.ęĺCá*kLŹŐĺrů‚MĽ5N˜žęh˛ZmąŽ¤x ˒ڃÇn]ö=ÜU!A§ŞÁ܂†ÁŽž™,Ÿ?\žŃŤŞ•šĄa Lt{îޘgîD)f#X^†¨LaTřT˘3뎀şŹy`łBŹěoAœ´‹O†őRžř.8kŔ§#ů¤/—Ií…´ÓŽ‚g2aăo˛K gç2Ţ~đ]żň=P …Óňj(ă—aó8”MF¨|jž†ÚO $k }Ą^ćkh]ŚQćkƒ– Mę;Ś`Wěůşżƒ˝ÓzlĐű Čú‡dŢáăpDúźŁWáé÷Ň 8.sż˛§}0.OűŮaâů˙“ç"\0˙wš(1s1_řŢý{Lü›`Ƅf‰(š2Ľ ŃŹjаNˆąawÄĹ'ŹOtş’’SR7¸ÓîǓYdçx7‘›‚¢*.)ÝLYy°˘’ę-P[ŞoŘöČŁ4?Öňxk[űö;ŸŘŐšťkĺ ߟ{oVťŸZŠňäę ţŤfaAŇ<<˘l’fą‰r* ąít˛‡Fç o0ăIö¤xܞ´ŒĚĹE鼾ö’K[h ‘şčćŻńúÝ­ŻŻ|ÉžĹŸŻ^ť ×Äľ‰/zősZť)ŤśP٧ŞČůŁk‹čD]G‹ňj‘ašOJźumĆÎ^]+R>¨k‹čI]G‹žŻŰÚÔĐXŸŰŢÓjnčëî_kulĽiɃőâÍvńxa†h–ô0­ Hž›~Qaö3ĚAÉ Žš×?ÝN<ĺĺGńŃQâĄ8쐲+ŠäĹ9Ś1ŠQ-˘´Üwö™ÄůÚÝÇT%FľDŐŒŞ óąjW†ôÓ2˝˙Äüϟ=éţ˘Ś¨K­§Ż§Ík÷Kçf;}ö抸2Ő.Yíü–Fţ]€™#ĹŹ endstream endobj 1630 0 obj << /Filter /FlateDecode /Length 13363 /Length1 23388 >> stream H‰ŒV{pő˙|ż˝ťź 䅲ǒš„X*!„W šL0&č%ö.äĹ#p…ˆ ƒĘĂí’ň¨m§RP„u`d ˆ -śĽŔ´(ZĐŠU( eZnűÝKˆÄ?œî÷v÷űü}ß;ĐË!QúƒYYŁkŢUg™[2ťÉđ˝8Ž xŇhÓě%Íęř›Ž“,ű°•Թʏ6eö Śßo˜ßZ_ňŢ(>Ńľ‘ŃXçŻ=v}ăĂŔ‡łMv#3bb#X?úżLoljn‰™lĎbT ˙őů gűĄ›fúV“ż%`˙%ľq<ŹŻ.đ7Őmí8s¨dň.n6oą•Ó-y`Q]`Ľa—â䘞łBRřށd% ‰€ůžŻZďĐóš% -4?Ÿąőţžťű:ŒŁhĂ>ě`ÂI jъ5 ďŕŸĐą¨‹ą팿Io‰Ş¸Š ŕx”¤y ťńőƒđşđ6˜ëh ˘‘„|,ÂAy\ţÍźF…´)(ŔL×pŽ1іh[lf†Hü ]b:LJA‹i(A5Ç´“c}ç)ݖo^€ y˜Ĺž[ąŰp‚Ö‰:ńŒh—ÇmćF“˝đIHC!ć°Öb<‹œÇ×Eéş,•MĄ›Ąťf;g>a ĹMÜĄţ4šĆÓާůÔBoĐ~ú=}@§ĹSÂ/śŠ.ŠÉ*öÝŽ@)PJ•ĹĘéB9ĄśP0ôžŮßÜkţŮüŇźÇŐĘ5OĺŠf‹:öülŔËěqöŔ`8„óź#Ÿsĺ"œO 4œĄLʢl*Ľ2Ş˘jŚVZIki=˝L›Č }Íz—>˘Ťtnre¸Ě"ZĊĄb˜Č™b”( bľX/v‹ýâ0Ă)qVœçĹeqCܕq2ža˜L“EňqY-ĘŮ*Ÿ—ť¸ž'ĺEEáţĹ*éJ†ň˘˛]ŮŁ| |ĄÜľEŰÖÚ^˛ýĆvŮvŮťÓ>Ń^jo´˙ĘŢi˙Đ!eŽzÇóŽ+"ĄEěĆ^ގ gúŔ%ŞńÎĐüvČxą‹JĹNú5ő—‰˜'Kąăgb‚0h†,˙EKh É×éná€PÄ9r+;i ó&ľ‰y˘E‰Ľ'•ו{ÔŹœV¤¸„âšĺÇŻědoKx˙›hc hÂ+"'E;wáÇř^ąGŠőÜ÷uHECӏވŻńoGMĆ\ޓ{´ÍÖ,^ŁĽňވÁtO\ ńśfÔ۝XAűD‰ŐHóJšVT”iњŸţ>CeVa_Cő…ŐÔžšyŹY˙-ÍźnÍź^MrŞ0!3CőhŞŃU ŠTUćeüçZĽj|Ćg„q%-LôcÂĺb ՓŘX äS=Fá’FÝă+ŕó‚ŃQůZ~]Tf‚QьF3f$h %L˘0"<šAˆ~•‘ŹxŒ$­Ŕ ÁŠ­QZćő¤¸\•™ĺĎÖj hSXwXůa7†=ßp„ݨsŹt°F fź­ˇu:QăsÇÔjľţjŻ!ý•–87ű-0–^Jü†äĂä{W?(M‘ş'qŽj‘şžZ5ś”y”şŹge%ŸÁś"ľĐ§˛ë6ŤŠ‰Yˆž•JwRušÇâřćŞF¤6UkÔçú¸!Éş™­Ž˝ÉÉy͋Hö¨zšWs“S´JÁ`<ô™­ű’ňÔ¤ž’ĚŒ 3ŽťšÁţą=HLż‘ş^Y Ť[XńĚŢr’‘6ÇŔPgŤ‰WăDrŹG]ôŮ9ŹĆW%ą•QËm˜cDćűtgŽĹˇě [ŞSSőŰŕśk_}ٗăďáŘSˇaĄÖpôËďă†ŰmŒiͅ#ŸÉ1N Óc23–tŠl-ŕTůĹĺCŠ—Í*sł¸ć.—ŐŐ5y¨aÂX^ćíŚUÔ¤ěE^–ťŇ>Kňö}É  K˛üž¤×ܧńřvŔú{7ȈHëýĹ:ô4ć4ř;ÄuÝňâYZqY•Wő辞Ú—÷Ąşĺ9˝˛Ě˜ď•)˘)2,ĺIŹîUśoŒĄ¤ňĎžäÚNGb˜CjĄáôu?+Ł\Ž˙Ó¨ÓźnY…_ߘő„iäşűŇăűĐ}‹Ń%ʤ‰âň*]ę#+äjjĄîÓýćňMujúAą]l×ßýŽvš‡Ö¤üőjޞ¸Âg˙×˝1bČĂRf/(M‰ČSr‘$D0˜¤yČ#…y$”śIKA•°ĽBŞC‚77B%tŞ)ŒÔÁ`F´$$¨ƒ áďwöż˙ĺra”všĚˇßîŮÝłg÷?{ÎŢÝ#=›˜!Ă[5z|ĎwDŮř=~Q6!'ťŻT_ŮÄě€&´ÓŸź§;ú˛kđö+Š–rËÇ-#ŕéÍŤşşÔř‰JTŻĄޝ¤d^W&(?¨9˛x%Ă_ž<žžgŘÍq4Â[{ý“Ö1Ţ×ńŞńD&.ý Ľ\yvP…ÚIkR.đź§+ՙ™ôŞ(Ĺťľ’ŢĐ*í zWj6vRcűA– ^¤ ˛7aü:ŁPôó€ŠŔ  ¸ ”żÂř…<—u„Q( ݤšfŚ}ëM6ëčmŕÔ§ghŞ5vÔQ&Ď5ˆŇ şžś*)ňô€,ü'´§ĄžólÔßCýŚgľ č>„z äÉĐÓxv—é‡1śĐ^ŽUŠčĚҰF!x60ăxýY.ęč1Qg{Ń?őGąţ5ž  Ł‰Ď gÂóÇńY˘]‚ú6ŘąŐ ťuzá0 ݚƒÚN{"ö_á쨣ƒźçđž`ČŚ;áŘ83XsY$nŮvJ˘đśž"ڂ7~`˜vŒćcńýÎĐhóM`xItĆ9ĺ`Zę%ű ŘůŚšóĐِĆŻĐýúeˆž­ôä¤őţEŻkÍô’ŐƒŔż˛ żŘ ‹”/ĐDĚď­ôœĂoťBzŕľ{şçÄgă%ŞđŹŚ8÷^öáJ:œu ć—`ý">sţî"łľzĆcĚs@7Čç*R,ÎŞßő ř÷)č* ůá”[LSB~ŰŕBůYęě+ńʤZŕđ1Îl 0 ő§€ÝĆ/Öî ?ęŠü>ƒsčŠüžÁţĎßJůŹł‡lĺcęÎó;AĎ&`‡ľ“–UŔŒiŕűÂ>ËvşşůNąĎ¸Źü{˝ĽUjíyŸěSaćťG4/|á[.ó˝cßgÖü4œŠ§Đ öYö7—ů\”ý¸|'Â|kŻ6ě{Nq=Í ůz‰Ë|Oů,Âź–˛Ôyh/ęӍ”§˙ŒŇżSv“v›ń-gŮËyoZýÄ[Ká[f ]śžz1ÓŹĽKę<ëéwŕůF˝ö°Q/LłĘž`’8bViËUýކ¨uú˜‘}˙­üvÂŹ˘é¨7šőśýŹç;ái}ŸË€ Áű}ąÉ;K=“(Ţ"şlń]đÓ`ÓOŒZJ5: ő€|’ů)-ÔWÓى~(J ęEʧrŔFzˆ×ŇNĐJëϋđŁŰ|.ڗ\vý5š9ć‡|Jqčî-ť ‚O Î ŸU~@ŒVPţjżöĎ#”~ŇőĎŰýÔŽ‹đĎfčíí—ŃŹr âť{Oůn¸űçřČ1Žc$Ç9üŇě厏ć[óE îIšŠĂÇ('tˇlňŃ×vţ÷ Ç2Źő‘•AůÖť4C˙6ĺY9XŻ™ŚY)ÔűžΊĎÚÍĄ|šěćR>'ô7ťyÔěK^Ďާ,oާ$•GaçOëÔju$Ohn ßCuçS:çFc:m4Ö۰ßëoáź!7˛č§Şh¨ţš}ĚČł8'ęT *0^śĎęgá{<÷Y{Žů!˝b Ą‚°>fŰo˝Cç ěŃÜĄrţZ7óˇ÷–ڍžÓŘ˙a:gěǘŽtŢ<Ę{ÁôW{šŹćnł‹Y—'ÓŢo\ |ł2@ÍYj7…Î#3ň,”óY@§5EĺěCćqôĺÓÇžŠ”ĺÉĂşóéź§dźÖj|˙ŢŕŰGUž.A~K˘ýKřÖlĺ‹3Íöťz¤›‡ő:Üť•ö)s)řGď]1â>îzoŔGŹ]xŸń{br|wú­UA‹­hąq•›g0ž?Ľę-¸Gę#í†PÜN×-ČŻ ćÂżˇŒóžńŒ˛OY[ŐzéĘ~§Ň2ýsĘŇöS*bÉxo%|eŠĘÓŤŕ˙.9 ?Š!<é@ť}ÇáŁ/˘˝UĄžQKĄżi•FGČâ8ç+čy#“’ő~ˆ#mńŚ8NŰÄ5ڢǑmĽ-FNŠkȓíé+}7MĐ÷Ň %˙€ćb\šö! 56!~Ĺ–Qƒ‘KĹúşŽ„=LGŹÇ ôpřćřîx8Á>f|Ó Î ÖrÄźˆ}“ńfiG%Đy™¨u8°ă˛Á͐ A˝70őȁŤÁÓ!Çű/Ľ]pWœ8ľ˛™čB~üW´ńk¤ľŽčĆEŕ­‚×KőŔH€žţ‰cýđrČ ďƢsíÔˁk@ °X…9Ÿ˘?ƒv0ƒ}űŽwÍ˙ďžĎî•9nąŕ¸‡ Ń9éžŮýžßŔŃšËýţßÄoĐ(vÎÁÝGD.ýڜé2Tôbó0ĨĄ—96r&ĺ$äČl_WçSŤŹŰ: aLąŞ [ÂŘ&ąřŒib<ĄÜĹq ÄŠA†´iKéÉ#ă@΢“Ą “Ś“˜?ššNŰ 4.aJœŚ‡Î˛úö, ™éÝÓíÇŰßÝŢ{ď÷ŢŽLS(ůš ç׎OŢśpD˝9‚ŞG˜éiô‰rRY†őłgŮłpćĂëŃ0<ë=‡›Lš°ŽÇůŻÁnj˘(< iW`xúđ0€ł?Î^ç>†'ŞÎž ™k†,Žń  Çƒůńx=nDđ†Ě({G$ *PÄk9çĎď|ánÜĘ­d?çw  MEbů9ŸŁť(GmŘăąŘjźŹňëŮëƒĐú UCgú’FĘÍ[ÔN‹z‚Úg‡÷iżPě—/Ďb"oYaÔTPžĺ;Lő› G™ţLŚ noogîBŰ5özœĺĘwRBE) 9ÝŽŕŹP­}vMšżT¤pxf÷ÁžGO^]´âXĎ/vşŞnsÇŁ/toYőPwxi$ˆŻŚńśkŰën}ńő—ă×úžšß÷.čxbŽůQËň3Ÿ€1p5á2hiFťcĹqҍIă°ü~X^FÚdA6›ÓĂy-nÇŹœ\i̕H‘e“Ů 98&ĂFŠMKXr×IâŹĹ„UäNă< ąlÁçŐaOu;tŤs}ÖEŃ@ĸŤG{…nő"łčŽ9D!T;5T ÂîýđřWĽ˝˜6TNíć[ťćŤíŸ[žƒáŹÍż_ŻĄŁo/Ę[4ĽŁ€łęُb ­śĹUEŢԂ˛)aŽ6/l5'Č:óZÇS+ WNYUôdńV˛•ŰKörŻuÎ]âCE…6UŕÄ)"ĎC–r >ŘFŃ9 )ž›~5 ZÚđďbfä-•Łž˙žţű96Ş^3â":js‡Ýalł‡™RŕŇö`=ŕĘ9°˘śüË, ˘H5şyĘŞc˙ŘW/uď_űôkÚ@ÁíóÝ>ľ66ţÁŽIúw üâüĆÚEń`dMßţ#ď]]ű›Ő{—ýç{ť#' śQ;Řâ1!ddÁEą:AÁŻ+Ż[ŢVŢWƁWZRMŁtťđ’ňSË)Ëyˇ ĂŢ­ˆ* &"ɂŮB‘˘XdŃq6ćâx'Çń d9ŕ€ÂYvÄ2 •Eś0cTŻÔ}ZO@nĺAaŽŘˆÚ7j-„ƒ\ú9΁Éęř7˹ه޻¤]ZÜ´-ó)îäÜYqt|/q‘Ő™ŸąL´˛Á!á*Gďžmv?ç&%zöň jŤŘŃ' TłÔ@ĺ5ÍR÷8¸ wYIłűŐÂ÷݂ŰćrćW˘2ʚ9Őjˇš\>‡ÝépŘÝV܂tlÔŹŃ0ë{‹MǛcŠ#ßu:xęÓ,6t&;-óV˜ŁE:Ů9XÉr$?#sTšƒeâĚXfT͌ărф Ëś‡mÁ`ŻŐ/–_Pť#$ć;]Oj'ŮčШĆ”ĚwŢ_Z^>ťfżNćmŠ-ë˙ÁŽĹ}uGţJ>ňg>^_żŁéä'‡Ć3‡{Ţý.ţ•˝BjŘ5żóÓu[-X`&_žšŞęÓßž1ţŮO~řÁj‘쁗˙^RdEGc͒(Q’¨`’^”ŹŠBE)O0ŠĘŤ &>ˆŻbŞ8)UˆÂóĹLóxŽpŞrˆb’4AÔńů˜•Ržç8$)oäíŘî xŐ1ä‰FTvą ŒŒbC[8Ü d.Ŕ. ›„{UëEáâĹ^ŁŚj¤—% ?:üœĆa+Ż顸čç˙~g~ćô ĹkŇŹ•BúV3>1žœÔá >Řs ś˜ěŞ˙ĽťęƒŁşŞř˝÷}íۡűöž÷vł›ýĘžlH6YCb˛ Í+hB3M+NĽ„°(˘iT(IP S¨t€BQ‡ĄAgŹTůŇňQ ę8Lg ĘŘ)ÔNý´´ ÉĂsßn@Ěžűrw÷î;çüÎď÷;Ó BEQ ]°ZJŒť4wÎFĎĆx#‹ŚJ†"””+F*‹Ĺs´ę7ĚTŞŹ ń‘¨‰;S<‰Ç̔Ž\Á ×ŮjyŐ TňxIgÉŞž¤d_°â1™ /Ѩ‹őË>TĹŹusšCťÍłĆ(÷1úO‡sűÚîkú1Űu„/=Š a>…+ä¤ 0Ôx/v‚ RccŽŔjąYŒ“€_”i‰b6zJ“&gÖLyˆ0$™í ŁgV4.h]łîŮe?şň’ýk\~áČÔů/ŘżťŽ[39ťdúęCözaŘ­}ms{ďPuŮöŽŢK˝ÜĚľĎ=4ˇüöf™śýđËßꆎžsM¸JAƒśş°}vŔ§eœQC…VŁ,żZT7Äśž¨h>ä‘Rmć–SžŞţ‚@!Ő} ęË nŘČŠ×+ް’—Q?ؒů–ßׯT€úWIXĘDŐąĚ FčWUzÚŽSÇ €8Cz˛@/Ÿj€Ź7ähÝkh'Q24jԙ5|P‚œ$$Qółăß95ĎŢńŽ}Ó>{ă<~đďŘ ŽÚ`˛săĽý?ůŒđŰÁ͸ŻÇÜľ[ďhƒŰ˙qΞňÁ3ŒÓ;YűY>”@/[­ÁeäOřŤý{ýźűDĆJ´G˘E‰*\•Zœ 4Ż˘„‰qŠفš)r…+\łŠé–,-‡fóŒ< ;”lŽxŻ;˘–Ăȇ@Ş@" äeBÎf{î““˜Aa e€†\ƒ‡ŸXţÚěî׏­^°Áţóßś÷=Z×2őю-[íQa8X4xcË>ű˝÷~îŒéÉĘÖˇwě?^„j̓č÷Aô :mMK“rn*ą¤Dps„(‚Kć]^/Ëů@EÁZ‘Ǜ)  ˇlŚä’N!‹C䇁—šS„Ŕ˝yQęwŹËX yr-Ô} 9mÓ6!=}lűC§éÉľ‘s˝ˇ‹űBą8Ü ŮŽÍ˝ćáZž89ňóNnfrdčin[RŢe×ď˛ÉNŚ6ł]N䗭V^všέ@H<Ç{=DQĆB–¤¸KđĂ۲›çLˇ›(˘ ’ÂDašH!`[Y’ú] ĂpĘyŃJzeBŔşýWěHpAřŽ`ó–€4ŁQŔŰ9“M#Ë6Ť§c"o ߝ÷÷Ť ńčH€Hr< F”GŻŞ*>ŞiŞáô‚`(XŤşd˜pžy@ĐľÄNY_ €PAˆëż.¸ô€ î5ŐŻ DSÁéĹŐŻ(*“ňPŔ'8˜Kdľß•‚"`ŇSşŚ)ŠlŁ źĄ –qé!ÉÂZFÔţČĄĐfAVUVŰňtĆY“œŐjTiF­R•ß(ÜbeĽrYᔪpS˜„˙ŕ†‡čŒo–ÂFt X ĂŞQ%şá… ¤ŔeNS§űţĘŽôăž>ší9ɲV8öžšŘG ŠÓ˙wÝä@Ř™iÖÎz˝‘^GŽ,ß.X…ťoŕ‡˜9ý/¨žž×סôdż@3 ‚uŕaĄmę QÂIÇ­psqÍG[bň´ „ܴϝüéO5eG/Űě— Co Ă#­GölĺÖCGýţs\ťá#s{Vď9Ů3Ňh]hU­~ĘęZÂ-zUŽAmW ]ę**”yŚxjËÜ˔˛Î+š ŒęŁÔŤéĽőůnó=š%?źM¨×—˜9Ľ&Œ•ĽšĂK璔×ăÚ{aҸe…=@Iý ća§Âˆp[–,i•D¤!ü‚UŽdřÇôƄă‘% #ˇ=+á÷œŞBÖs…MÓŹ…ÇLPŽŽ9žĘ×ńŁŹł:ď°Í‰äˇ>ȗ9Ľ¤Ź–MÎáÎt1n(ň#ĆŔ=%Ë5ě!šp{2”ý°˘tşÝr˛€˛*2ňĂNůâÚß~Ţ3˝´&R~đ¸}e~/= 4ř—‘= _{ă-î뷚šÇß˙ՆˇGÖ@ŽÜš&N‡DQÚj…ËHJ!˝Ćó~baÂ,8ÖIĄ™8óIqŘ 9Z`D˘| Ď =ipąJŽ Tzĺp…Č:ʤ>㬑bgľŕ13Ť@Eg™ZE5ţĂ(“ČĚb>ÉqI`˜jËYĽ gq™ŕŒ`ČeĄ¸„LÉĎú’,FGđ[xÖqű“ŸéŮş{Ż}ů•“Ýç—öüńgٛŻÚ;Č"ź_ąˇŮç˙txÝŮş™ťqĺŽŐűşăŕŔť˜ˇŸe.iř„W—FŰŹúÝü.ƒ|Á˜j,7ÖéźJĂ>ƒŞ41ˆöůň(Ő¨ T‡ ÎYđa;n*ŞÄ&ń+b§řŒ¸JĹ.0VK0Á4o–şŔ$es.éłlŰč՜Œ‹˙č˜IŸž´1˜¨aćY% “3ĚÜüFiŽ% żÝÚłdúKíM+ńŒŁ{ŸŽ_´É^+ ?˛ď{Gűň™ŁŻ“ĎڙŮ‘†G9vgŽX ŐĄÉčËß^Ţ%, ?ćë Ť  &Ť;Í­– q††Iěż/ÄI‘p$^đşŤ(ŠóŽß~ű`oŰe9î8¸óî¸ă88ŕPŽƒS”#ž˘C}’A”ŠIŸŕĹŚD%’DŇúÍ4`ĆÄ؎‚0Ń“h´cZŇéäŮjfJÍHM[c§*K˙ßí!NŚĺćöŰwˇżď÷ý™->ÎoĘNʲţ,ű.â|~rvsÚV÷ß_Š&3Ľś™6/7@<ślÂXě,Aœ-;+7/Ї‹˘IY$‰Î<(˝y‚hĎąÄd‰3Čň€AlůQ'§ŔˆƒFl ˙ƒFb ‚rŤÜN˘-mźÂZ#1ń ݍľ™HÚY”T>č:‹Ă…”jLfœ\,S+­Ř—Ulą°Í}zÉsŤî]Ťi§W̙úîć#]”x}ÚWŰÝţÍíďǏ6=żnIMÝěňú­Őó7/Ů9kţ˜{uŕLű‡‘ JÁżhmě2<§ë:ćNi]—ţ˝ˇ>cÁ¤öJĘÁ:ŕŕÇŔA+ň˘[ŃgÜ´œ8\ƤĐ SOUTUś¤z­éŠ–d‘sf&[źVkœ‹*°Ň$™á.U–HŚÉç”TŤ¸Ç’^—Ꞥ 7ĆRŤě—ł ^ŻhľŽĺ7pٞLљăâ x†ŸîŁf˙t=ĂŹî˙ qqz˜˝ĘȐň%ŔM1‡ŘL6Q]ătC㝐*}wĂX)䨢%S3R{(Áő^ ݆Żě=żć[í^UöҒ†Ďë#s&­Ú2ÔzËç#^š7yYŁ–Á˝5ő͖)‘göi7qҁľÁ‘-$‡“ć=űXtyMíĐ —ď‹Ń§ý( 0‡r:vŒňÍůť˛™0N(q1ŒYz1Ý´, t“ 琈œ(ĺäćó–"GĎ"Řá°`\äÉł>ŻHÄ͈f‘ÄŹ—Z 2˛Ú 2jSŘ]"ćL¤¤6ŔWM|ߑ“Vg§‡J†?ä˛ؙ }Đţ…Řű˜śîČ˜ ĺ{ˇGn€ÖľUʤHPR†(¨:’T2é\,č:YĘňїŻ(ĆP„PV>Đ[ŕSĚoxQěYXío3óÎí<Ű?qҍSe+–íźu¨űÎ|A2/üEMç3Jć„Ţ}ľ´jńËŁčő˙h—đgjá˘+Ž˜)ŠŤđ—ůqco]ӕ1Ežć™ş°đŃâšđ˘lÇâYţ˘ĂuŰŽŽ˙”˘? sýČ'” ›Fża-ě4”Ž^ˆ"¤Ţź2ý0ĎŚRéXR1´%1KÓ땝âvĺHǛ-ćlq:ŽfŞxŮkZ ao˜@;ĺ1Ť:%Áćd%Tíž3Y\‚Ď.W#“bbLŽ’ j} ŔůnW‚áŐ>ЄÚ!Pák¨[yp8˜tŐ Ť?E)ÍŕÄÝ3ă^犏÷aüúŻŻtáMËÖuÖ4UWĂť“ßżřĹŐÓ¸ęĚĹăS÷i_ďjmÝ.ľžňj,)9ћýČĄç•>ĺrČ"áMŹĂFę}‰˝&Áb2;˛OĘlÓośâ vrS~bŕ&ăI†Ň” üˆan Ÿ*Ëú͢Ľ;EA6ĚNFJźfŞ6^SäĺňšSfĺ>ěíu+.ÎçňőăLł~Ýř+‡F†čӗ›ś1 ÁOa€Rż2ă€ţYca9&Ĺ4:y2L Q^9yřjÇ­ŚËO5Ó~B+Č]=ˇůÉ=Ď>YžŚţŃŁ]7ţô.ď`ŚÜ…/lhYÔňŤťOż4ší#ęÚŤr˜uĘ@o÷#7ÍIˆ“şˇ…˘RMQáýmŠm66Ő6;Pí’řHŽ´-mo‹č˝(= 'ÉäUpˆVpě°x›ž–›ÔŽv‚{¨ŹËiŹŔ 0’ŸGÓÍŽŸÇᒣVWÉŠÜ ß¤Śy}Ótzt~čđÄČj§Œ€zčŠČš TŮŘHĺ¸W,fÁ×ěÖÁâIŐYŸvëÂÖK+atđˇ5Ý˙'űüŠÚsš—Yˆ[×lŔőęî›ëŸ;gwÜź6ožÓvđ—;đťąőĺNŔk*€ćţ$ŕ`Ôp‚\&_“ď +R-,Xz\lEâƒb‡xFGEq,‹ /(ÄĎ‚‡ĹfzfýçxÁĎ,b=+*˜Z„ʲôSá[ŘA–aŁ’bˇPo`­‹§Ă<ĺť@cÜ`úŇę6Z™_ű7ąĚWĆF§eƎş+|úYSšΚý°Q=ú%G>ڃúhß*šé­ŽŹŘQ—Í]xřď ę=´SţЈčvř!/¸ŇRAŃĂc  tĎ œ h3Ž÷\g‡?řŕ^2ëť÷U 0`ëˆaŤEŐqřqŽ…äHvrAރ;Ă pٜŔâŃ՚˘GüˆBGČz$Ş:thý1-hŚ+*Š!´ŠYęâĺüPۨƒ†˘Šj QĐţË~őÇFq\á7ťˇťł{{ˇť÷{}Ć>|ćÎâŒL}6‰[NpůQáŘ d;S‚ą{XŚÔ@¤Ş–ÔBIŐTM•6´ŠˆąqŇB#WłüŃ?ˆÔDQK›J‘RŞ@ZÝšoöÖ¤JCŐ*ݞž™7ł{{7ßĚ{ď{ÖČ]œÂ’ŒŹ|ĆNĺ{$ fIF’5‹$Í6ëǗł›QĎ˝ĚÍQ÷)ćłÜbŞ?‰A{ ŠË]&˙š ™Y‰!uzi•őúrŠVâ˘\9]­˘-Ü#j7ˇ/ékĆ4˝b¸ů@s  S$­/ŰCP%YUŁ.ݧăDżN\.Ý[*JüÉĽ Ěhb…tš@! ťty‚Œ¨­:viW=Ś6×:WťŤ×ĺp˝Ć a´ŕČäH°•LÉ´ë Đ‚ Ë>ŸŹ°aÍĘő˜ęő:KiăqŔŒŚ~#TĎÎ úíŹÄFÓŽc´+FoR˛t:3őÚ^,ń+ßýYüąÉÎ'N{ĘßÔř˝ˇ“;ą o;ş÷ÁƒŮ!VŐŽ¸üQ΃‡`ƸČž"0x Œj_èfb\&e{Ę8Qű}%|›ołżĽ¤Ľ´×ßQ*6$Łřö}łä/—:$LkN-éEU5›oF@ŇĽ=/}Ł,śýŽ|†QˊW,„÷acÁÉŤ§ňËȋ˜ K_áćbřśńSˇ/}đLžőćccÇzč´Ń_z|÷ŚŁ}ľäIMŸš9=žű홝o˙ÁŞ:öŻîÚrě'žť–ĎÜrO g ޤ>¤ukÚaíY÷˝§ĺłĹ—Š˙âU€L <ÎJCÍRŢŠÝ4pßGôŒg’äŔ˅G}­˛:Á…G\çë\˝* 2žrgye  8–yy‚ /e2nkâ֍[˜¨Y›Ď]ŮşzËTý ۸ŚŹ8“jŢh*éMńI)jk9ňAÉň/ďJ/.zbxŢpęچ‘’W÷,Ź;ńŒQ[Ń=Ŕő%ÂPîŔŃě؞@¤ ×w÷oŔĂS—Kď5Š)Ÿtž—Î+ďű˙’dTqßVż:)T~Áż$Ҹ’ HJFÝ+I•žĚh2~3„Î0}<ű$0™3ÔGŁ3P"¨iPŹĐ0y›!E(ޘTЃ­vĚľPk˝ItsŮnöšs‚ Ë­”yHąY,ˇ„÷„›_%Ô œ`… P¤,ý úV™‰ŻVĄc7céĂü;Ëú%6ó8đ™CXJ Ťčtë–`rČÖ–žŐŖ2ŽňćĹËűO•űž§iőÚă=óó:ĆŢ=}éúSÝ /pŰłm›Şę:Вú.yƒ-jrŒ(űS~œ~Řç#ę*%­ŽWŸ”ŽČ‡ÔŸ“•qâA 8âĘRYNRÁGŠ€kŁ\’€CŠL)  (r+PrȆƒ‰Ľúnž— Łř›qN’fnŹsӟ˝Í¤^‹şö¨íţvüëۊqůU<Á’h›ĎĎÉX˛ţ•ł[´@ÍŇu1űź#–ďxťďiî [ĎL×ӌëш;íóčFÄŕâZÚXotkű¤÷ Ń`ťiу5˘ń/‹č–jŕDQ’eŞ(<.Huť5§““eĹ­iÔ-‹ÄĄQIÂňNTĐő5\čZQér˛˜)ť×­ h—4ɕČ9GYFgîDˆoL‡^ =“äč„•ůĚí­7p÷łť…<ů–ŐLöŃŠĂ:r×ĺ{´ŚŚXM@§0‘ZEŃÖ>ä‡Ő”×j3aI „,;-űƒ5ă.e'œ(!É` Čř‹Ćcq“Ťšż_Ţ\]AŞßÉ­ ęĺe‰Ü朿ÚŮIŽdßĎ~t˝ą;7ů+ó?â,â¤*1ˇ{ođżĎCxk˛ĚŠ€ţ@Ć÷*Ż8Ď|ő׎Ý÷B/0ŽxPěz§ü›SĄڊřÇ˝@{_Ŕ×Â< $}/JŸű‘óyĚżPöťGôŔЏžGꞀ ( € ( € ( €/ Ŕąę^đĚ"Xë>÷âďč†ÇëóC0t×\ů‚Xź Á~cń—Ş“5ľKRKŃŽ›{bŐę5ŘŽX6˛‰GZŰ`Ëç˙ôs9ŕ°˛WÇĽŞj¨…Fh‚MĐŰĄvA/ ŔŕĚ >EPËa 4ăÝ.ëînȰť3üŹÍűg_HńĚßţăşíˇđŕŖŘ˙܋Ÿź-˘c;ëq&Ël›7´Ű6óŰśíś-˘}ĄąĄšiĺšÄňţžÎ]•M™Î]=]÷7…d5 M°iI 9ýHK'S‰sËęAŞ6"™;`/Ž:ń‰űűÎ˙óŠ> stream H‰ÜW TSW~Y¤lMĐi‡âŠ „xeŃBŔ簙Dk“đ Oł‘÷)*$*‚VK]pĽ˘ś˘‚u).Óc<:.T(nˇ‘qŞuŠśhU@ç>(‚śvΙsfΜyďÜóŢ˙ßůîżäÁX† °Œƒx žxаi"âÔa˜XlȧAČáŽyč˝ĂxÜl[Žů<œ‹aoF´gŽŠ0űłýźĹdÄ0–ÖHč˛ţ˛m2aC§"‘FÄđ ă80Ěď ˘ß6šéiřhD?Â0v§ÉjĐÁUp,† ޏôfÝ ›ĂŤAúc<°Ů ŰlσȞ;†q_ŒŐ}3OLԅžbŹű=€NŃ}ž[HéŘҟÜY.ěj§čb]fłX2řßľg‡Íăap*_ĘgqYÎlˇZ Ó ¤Çwƒ_‰/Ű}§bzŒÂʘ #0­ŃĚ Á‹ö¸^Kjç_ot.=ŸXű4Vq¸Úéůt˛Đ f‹Eĺő'ܨ9üĽüčšEeƒ5A÷çXY\Éńąl|‹ĎIç D2;Š!s,@kĎŁhBĐVűtŮ@čĂE˝€[ R™†ôlöi’fhhŮFZr€†°ç“¨­VZ6†÷H‡Ś¤‚$\‡'áډ@ĄTŞŇ´Şx jŽ^ôýşG€rY8Ń5 ‘Q˛đŮĎä˙ţëúǜĹĂ8ŽE(îĺl‡;-÷Œ3%aR‡ďNţŽá^o÷ 4­ymÇ#BvyčöîđoV]G2×fNŠäv…é˝3žšËÎd;{B̛ůŲ­őÉănލ ؖąjś˙ZSiøÄÓę7Ežít ;]ľ†ÍAEýRIpŽhďľóxŁOÝ,é(:ťĽ˝Ž°“ך|Tnŕ–ĐĄW>ĺO%óYNZ­oôŽ)iß{@ź÷dĆŞéŽzՑ Ÿ^ó.ŰøĽźš™n–Š•÷~üËâ5^ŚĚ§ůŠĆňuW¸śľ!łt‹ŢćŽŢ|4[7jů˛€đ•ĺ ždšžýŕÔTżMhE˛}°/˝W_PŢńďHȜ[ޘPVtW<ő˙݈ëdC`Pażß†Ń{Rá+OúoA썏ŕńń†žĚ†‹ČˇĐ„ÝBĐĐQő‹’^ˆ˛0Ÿ)éZݝúm‹*+.Ö{O!/ Šő|YS󳲏ÎáŃËnžáżSľmÌIˇwTŠű„řý†ČÚ0ˇ+÷­CjÝÇOĺÉS‹›ľŠ-{%q­Â–EűŚ<ŰSŇŇVY_€Çy™NŻÜÁĘŘxčkéşčöâ͙›Î×?¨ąv˙ůÄ8ăťałşvłYœ_)hóԎUü„üüt‘-TčĆoô9Jłă? ysr]iŽÜ5ôᇗŻîŽźą°ćmÔąąnU;.,źŕł¤‘sÝ-(ƒ˙mĘ'‰ŸžœpfdĆ˙ŚCƒc‚›×\űó˜ÄďZ͉ů×ŕFϒćâ֘ŮՏ—‡ČB}žßš´ăfşÂ–&™ n›ĐňŹć°YlśWavĽeΎ–=Ź×-U őDnÄlTĐş_‰úŤ3e= y^JŤŮLŘ ¤Î4Ölş@g'@ZžŢDRFÂNĽ˘ť$GÂá˛HŸ—$C†GČŁäQ“ “őŢ„,Ć÷(*((ć#E )J Vó04­I[í…Ă”iƇŐn“}!PŮR S×Ň$m:™ĽŁIŤä‡Ë„ЍŃç‹Řé™z3„ŤH0AGQëŃV‹Ě zô„ÂEMd™­–,™ôe8ąOŸy%Âhľw›íÝžbźÜEN–;†řŽl'‹…ŐWœź9ëˇ|=3)R­!šÍŇßi6…G^=cü›ź ˝ľ˛“řZ#¸ÇßpÜf^vűÄçŰCŕęđ̙{śLĘYŐp­ŕ;ŢőďŰ*Ú&|cÓgąsm×Y'§Î˛zŞU |ÎcŻmÔzӊhačŽ˙W`qÔűú9źăovŞŤęŞ’*ĎĹŚdŽrÝu“gě66ÄŠ6ÄČ6v´.ďH?*ŮźńPpjsűŇ{œAE÷}˘ˇ<ښ6‡gÖß[(*yžÍ׃:ČóĹĐCˇš–ä=˝k˝6ŕaÎĚGó Ëë˛[Ç?é˛űw–žw¤}œÇíL]`rËÎ菍˘§›gN°}” jäNŢ%čäďÎÎ[".bPČźzrš6Ż:ĘŠĹu”ŔŮ%^E•?Šě2Žüqä KĚBçzĂĄ‘œďó{žß÷űť<żW!éE…$x8¸ű8jWéŁÝóĺŢ.řřĽ§ˇÄÉuĄ‡VÝ ˙ˇ“xŮĄ>îvŢ/o/O…|RĎ&‹\ÝÝ%ž Ĺöň’Üĺ= ž ů4ŢŐÎ}Şx¸.tő}ŤóÎXODĺ-q´›oç,WXIršX‹S{^h×p”ă,w2퍚….‹í‹aá*, !Á’¨č(mX…†‡+Ţ$‚],fF`&8$ő{‚;^"Q­PbDEÇJC$AŃř*¸gĽJ˘ Š‹y“ĄŃ1‘=9#ŽsÜŕ ŒT­ŽvVâýÖŠS˙›47m*]T[I$ÜúƒŇTiިŔ&˛éĽœč‚"]Ź*<t˜é\I’žŸIĽžRĂa}꥛b<çÝ šŞ‡Ůđޓř}M‘D„+­$ą˜ ˙Ü]BĎ%öAĽ3átĽ"ŹvřÓ§ďŃvj;Ý÷%ú´Ć.Ý<îL™äqDÍ×INI{Š×ž\#r1Ň´Ěňĺ›Ě5UO‡ÎHhÍ9Ň?Ő:w™KţY˜!VÔ͝.d˜G‚óÔ.îV1Oš×ŠŁÇäüy[ń;8ćQŒéE,ęX}PŇäG›=ł^§ošnaŐY6cşíÉ_I3“Ľqc°DčҸ˙ÁůńošÁ"Ý7¤Pž‡˝ëKŢłÔÉ>ŒÓţďt†éű7źLOűé!“⡆T6mĘÔ%˙Ś]yšŻîW­Ű.ź0ŘŠçÖ7¨Ö§Ę“ÖEúGNłOŠ˙ńŢľŐ݆úny~-M)őB˜§­ęYr[č4U!ňĄƒLŕ3áŐŠ‚rˢřŽęDáČě”ëKw>}”Ş*Ö/ďgœ˛ůüčôÉë‡Ö_ş'Io횜áŸxűš`Rž#Ď6-ËÜśűŸI‡Ř—Źă™ŢĎĺדօ6ßjöčŘRĄÂšĆ/ďŁđ6e;Ŕ@¸ýöžŤńňŤŔLłRh3×ĂÉßź˝ß\JËÁćÁx ľdxÁiá2Ábú)|Œă9pNĂMp„` `L’A"Á`/Ě䌅jp‡űşz0 ĆÂ, "0„0ŘCÚŔÜp p†LˆÁß pü™oˆaîž Ąţ?Žh-č˘Âˇŕ€™Ipnňöüf0€<8ĺP÷ˆ)%]ě‘P-4 C-K5řc•„mP‚óÂjĆö ĆB’đ{á˜˘őˆşÎâ^ω„ř’ ZĆ5Ż„(Ąy€6Łő(vˆĆbáÎl×¤J•ĐOhF_:0 +ŃD´Ď+Ó:Ȁ­ˆ˘Šá(Ü'Ÿä"yDŇTZÇ{éxčxôŤS˙ 8 Ďq0­]Ť 5ˇÁv؅š%¸×PƒšXbK\‰7É!›Čň’N¤×ék6ˆéąȈ°dÖÎşuyľ§&_sYđK‚œ‹Ń“ˆs!,…Ő ‚O!RŃşl”\dŻĽůŹCůnŔ”¸%äˇ$Œ¨H>9FjH-9KşČS:•ZәԓzÓ0şšĆŇ\ZIŤh˝KA+g19SąĎX;ĂÎą+Ź•n§äš8nWÉýŔ=ćžrx3+^ÉďUďÓ¸iü…ń‚(lrQî#Ç#Íx0G<^čŐ Źüaˆj5ŹAIDî6"˘]°šÓ˛w jŕ;ŒŇ3č߸ ­ˆď´Ă čFr´ř Éhň1‘!żsˆ3ĘôS&k T$V)âTEU×Ú>T›ÝÔľ= ěyôK=ĽžĆJO˘¨~đűjԐŚŇO‚šš!ú˘Č_j1•.˜ü^“źŚPˆ‚ۍjČ1T)‰Ť!Ú5>’ Ń8^ښߩuçűj oE֊-Վ§Ii1Ž4Ԓć@.ÄŹhš Ń2-ČR ź'”˘˝}ŃPĐévÇ|5”tj´Z¤›] Ó CĹN*™aÔQ68ŻŚkć’oeˆëCÚPâP”ň‰‹QŹcÜ -ýŢ]Ç3ˇuFĎ­ś:ůdČ1Ş21™<§Ň÷ű˘Ť­nÖĆb8úržŽx˛ Cż…U GTŒĆMƢ”LbH•Í„Íji~ĂZˆiâÇTš§uh#Écq\›ň$…}î™ňrc6{ ĘCj˛?ŞšiťS‹%‚ÓvH\f¨ek-žš´RźTŘôş˘SP¸š^ą™œŮqá}+•%,#íEÜTT1“¨†sjbÍp$›°^1‚^tWd”ćuƓJ Ó3jń(šš|¸´…żŻŐ$rŃŁ<Ʋ}˛˛×ĐžĚS]§ŐŐl‹H¸Ś˜c›)ďđՌg¸€v\Q‘`ů k›ˆľÔaůÝnśŔç3  @ĎôE—dœ3`Ôé1Ęřenٲá%f9łlYqk¸“Żŕ÷ `•˝+ż"Ľd}h¤…’’˙b^˛‡#Z¸ď@T %ăšÚ†ű×HKöŚ[ŽŁë;Łź“Ëqœ“7­¸)­tfB´€ ü‰ćŚĘH2îJSCÔ.ŞÄť—ÚXžŰý?:e˛Ÿ3/“Š•O˜e\}ýNřżŞěz x´CLĂ]ËHaúÄiŘ%6C7ZĐ֏đĄím´y°˙Ť9ú6ל͢~7âsD "‚Pˆbâűˆ>Ž~…8ž~ćĎ(˘Œˇ| vË~؄Ô&܃ráTŠNčn€†:/Ćßf)€ä=–Ó`—*˜OöŻ(ď=Řç˜ĂkŕŽCúśZ&Ąs߅ś&Ktˆ‡0Ţ(Áq~)Ţ'ǐîśQŮĎŕ˙‚c÷cˆ.ţ„Đ÷EA‡]ünœß đq?ƒN¤!´o@Ô ?Ĺ9é°y–#ň1¤ŁŘ§}u´ďÂz0×^ţŸpiŽ{˙3Ü ?KHçą˙váŹ'Í¸~‚Ť…>;ąV Š0+Šd+Ň!ÉűĄJşa˙đ2ĺˇÁQV;üćj:ţG1N€˙5Ë՘a3‹%|*ÜŕšeČ^ŔšŤâE\óÓŕĂÚ|SşGŢŔZő˜¸ ¤{pź&D#˘5‡Ë’°˘=‚ňnq 2H.h@ßZŒŐĎöÚśbž&růďÉĺoRĚłëXöwC5účź "Ť+x€çř?ǤäúœD˙6Ž˙ć~ąčämŮwxwx‰‚†üLŠžäl lW‰ˇ—óÂ)Á§ăˆŮ~ÝlŰÍśŽľ\ÝLË•ájgŢg¤fŚ˘ ÉfĂzťÜU_isů+™\j´~ťĘukşĚuńaeƒëMƒë,˘1Ž2ëW9]ĺŤ{eě‡cç„F()ÁUśËF†Üůč%{ž=Ż1•!ż7šĽÔoĽÔe)ő-)5$Ľž!Ľş¤ÔN)U+Ľt)ĺ‘R›%ťl“y\ ç˲,ʂĚÉ Ű3Ů[†Î~ť¨0" ŹL^áXËt|pDćđß]χšp¤ƒ6éጔÝGő0•zFӄLĹPKš73úŁ’eŞI'űjĎ!ŮÉ ÎĹH˜Î Bx@Ľ"Z†äă‹Ę˘uj C¸żĂ%ăíŽv[[qsWđ9M<×ęĎ.‡žú ÷N\9Éţ|‘—%×;ÓFP›2ľ)ŚM™ZG˝ŽDétEŒ60&[#—WSě×BÈ8=?>â gT5m\ÍźńÁFĂôŞ6¤†TӁSĎ1Ÿbć€LĂŠP4}ĘÎŒ@HKcłĐCŇŐSkÂýh9Ü,T“˙1CؐŐ,bĎÔs"N1s‹8Ĺ"Nąˆ=F14é áŢhZ†Ž~|Lz™łćăRŝîXG‰rźÍ\ˇVˇăuç5Č`Ĺoqžë Ěä ř̄†™Öą#_Îäx˝ŐíźF>șTk ŸÔżt˝Ć.p„Fƒ ˜ÉlvŽ;3cs5č1öáŘ'˙ýácŒ‹Öjź Jƒ¨łƒ<䋖AžçĘó$a@™\ŐäĐ{”ţ˝Oý=Ę#˙^ĺŠÚýOý ő[ÝĹîb6¸ˇá‰ĘĎ=1,đ~qćĚý ľźŒœ&Œ-žď->ÂŮ á^°đ•ŔŮ1áo*Ç3 Yˆpüo¸n–×˙9?Fďkd3~:Cţ$^ă^á^‡Ž<*{p÷°CY`7ڃIľ——-œłÔ:tů´ň‡3tçńý˘—;AzżłŘmyůń}ţă'ÍćÓ7¸›řvś‚{xrĹX—'AyĄXVPř™›M\| í{ꡝ¨mňîŘžs[C wsţÝ÷ćçß{wž ,ŃyŤá˙zŸýĘßÓ_ą{iEçđ,e1OS(Pr –"SĂěÜżYz¤Č˙PސMőĎťŻˇ2:łçˇłŮĹ6ůžlEŃş|Rű÷}#ëř endstream endobj 1632 0 obj << /Filter /FlateDecode /Length 20923 /Length1 33092 >> stream H‰\V P”Wţşß˙ĎPÄ Œ†ÁáP4â‰( DBDÄ ×eDŽx˘A–Œť*bÔĹ;YsiDĂ ŕ•d%ŤŃX–qUt-ŁťŃhŒĆ#FK`Ţ6“ÔV˛ÓőŞú˝×ď_wÝo@Z˘ i#G÷ˆž˜’š(ý\V_ʞć,8šĺC ¤ @5Ůs í:áýľ˛w°ĺäMŁqŸ­ź2óTŢÔâÜô“łžÂĺüđ=ů9ÎIGŰŹö´3}óeĄE‰uŕ"óüi…E­×f͖y˛ ×ÔŮN<L/”yÍ4gQ×%Z&x6‰˝}şsZÎâ°ďöóĎ悯ęŸeó/7ďĚĘ)(ît|x6— Ş$#PÍD;@_“qły¸GčFs î|ýo+§×ü6~ý…b–“Jđ&qSP€Q¨Â ÜŁ H‚!VŻŁ+âЄrb8ĹČl9lú„쟢oń 0Öc`6Î#˙€¨7BĐ_c°ÎƒżYžX„5ú_°}đęőeíF2ŢG= ˘ŃŞÔŒĹ˘‹yXF6Š ~4a‚Ą_ ŽýžŠE ¤â%d y¨1Hî4‘†*:§âĺŚL”ÓóT§wŔ.¨Â…ĄÔ—ťéx胁‚żb5Öáu§ÁŞ—ą6ńɉýäKԙęMIĹxAş ؎“8IA”Á=T–ů‰ű&|1C– çpŸźée*â}j§{ˆžŹwë#r:FîIŔÁ]‚ľâÝVěAž”˜ÔS'JŁľt×(4Ł›¸Ď¸Żę}­ëäc:Ţ@™äć]Â%|‡'dľŚCܓ/)_ă]ÓŚĄ73=0T˘U„ĹX"˛_N%;uĄŢTHçٗ[ńTžĎ•üŁ*SŐę?Ć÷:^oӇ%ćˇ`…C$ é’ŐÉÚ ÉÝ|ŠZěĂqü€{řY"9™ĘКjé1ˇá|Îh4ëÍ{złn„D;‘č)Ň["˜„ËtlL}…SR3Oń”:RšO‹i)-§5TAßŇ/źˆOóUĄ>Q.uÜ #ژl–›W-ŁŹNw…{ƒNďüĺŰ}„7ąĂáâk‰MÇ]؋ƒ‚í1$.ţâm ¤t*˘y´€VĐßč"'ódžÁŠT'ĺPáj‰dTgŒKć\łÜćŤťŁ™7ކ‚;SäĎȕ[抔KŞđšd똰ö–°ůä6–<űP[ ŚpJ#YϤ ä¤|*Ą¨’.Ń]öăvܙWđjţ€żáďŐLőŽÚ¨vŤłĘmhÓnjI1NJż•ćËK™u˜u˘uŤ××MMÇ›Ž¸[¸ŰşĂÝŁÝqŚ3őýşŢ˘ˇęşJ×y*U w; żě"áč.•“‚1AđOÁLáäRŹÄŰ"[ŇݨÁaÜ|ƒ+řVänJfo{|z„FńŠ9¨—đ%†ĆÓDĘĽšë‘7i­§ä˘ƒTG'č,] zş*ň =Ś'ü,űsŽáN⑜ÎٜĂüŻăü1ďĺ|T˛|ž/đuvŤ@ÉD˘JVR$"ĹjÚ˘öŞŞsŞ^]SO$6†ä(ŘpĄĆ#ĎXh\5ťHœ&™“Í÷DY|,“-U–Ý–“–›V‹ľ‹5ٚfýغ˪ĽRްJŞôw?aÜ6ęĘŻJE‡š†ŢĄSźË¸Ăž4–ć*p”)OĹ .SĄŤŠ¨ŁÔń[x•ÄЗ7sB<ŸJ—*î-<Ě0Ďmi+Ŕ‹(_úÍiáOŠŘ,Á„ęz´ĆŰz jÉ&•Ł×K-”R ŐI ĺńLţÁhT~ÂĐkę˘đć†Ô~ްœÄxî&lŒ÷€ţ’Ď+(&;wÇ8ŹWK$ÓÁhcŞ)=œ¨]ŘÎ\Ć5ú+~”ž7ÎH"WĽďG ˆnăSÁv‚ĎrŐÚB#C ň~CoFŽšM—ňCŁš?S‘ôŔčĽä5”<-ÄXşM^ŘAü„‚ą†JĹűët›ŻŁIs“ZÁůtœŽQwŁaŞ'Ü|& šÜ5mäĹ1RGáŐ ŢŽri#Κ‡Ôe#UíA§nTvN TŐOßA¨ĺ‰jé>§ă‘ŔZŻ2|š~’čĚÄE}DENcDCmĂiśŃ*5ÍĚÔÜ%ćBŽEŽyË:Ĺ/â´źEUˆ Ÿ¸ƒÄ=HVH¤lĆʆ…N|ĄˆVHu„ˆ'Ň9ސGŰÄ֔ˇiˆźOšRşfŞš-}fŽŰçIo÷çlygň),Ż„áy6Xţ=¤á yM+E{Îü(nhFܐŘÁƒčß/ćů>˝Ł{őěŃ=*˛[D×.áaĄ!ŽÎÁö ç:věĐž- m˙g[űľňmŮÂÇű/ŤĹ4"ó쎰,—ćHNŽjž;œ˛ŕüÝB–Ë.KĂ˙hă˛gyĚě´ŒËÜ˙łŒűŐ2î–äg„AQ‘öD‡Ýu*ÁaßGăFeŠţV‚cŹÝuÇŁ§zô•˝ĽčÁÁrŔžŘ.?Áî˘,{˘křœüĽ‰Y ňšjďxG|ŽwT$Ş˝}DőÍesT“-–< ŰT3źZ (WGB˘Ť˝#ĄK…&:'šŇFe&&t é˘řlÇDĂ\­şyLďšĆe‰wY=×Ř_möĺöęČşĽËöůý—öŞŽŞşÂç˝űŢîŠBůOřٸ&TBŇĘň“ˆŠ@wÓH7!P$hPZZ0-R˜ĺÁ‚€ƒm'ŃÎ&2˛ÁHm™Á´Ľ4@ bcnżs÷˝elĹÎ4“oĎ˝çܟsďýî9÷Qi 5ŽĚSVRě ‰?ĎŃ#óN ő]zĄßí*˙ÚDߪXk˘ćô{ÂÍŐ`p•;´{ş/֚Ŀ~?Ć@_=97ĚĹÔkyűĽĂvŸ—YÔOkóÝĄ{<<ó‚ó8„`ˆf,IŞMHđÖÉ?SBŽ;˜ďó$…Ć%zü%“Ôô˘ŕŒ%o÷÷şűw´¤ Ť‰ďŮ͚nÝ­B\×Řœ¨M•Ts.ĺ͈n§ĆyŚ€!÷l7<ńy°,ţ™“EÁŮYh†?ż†^Ą2ĂĄ{&‚ńŮŹçţ!39ŢăŢ ť§őď5%–Ć‘ƒ¸Čäˆň vťJM ĘźpNÄAÂÇoŤúˆ´aφő˞…ńnl=ęC7v:ö<)‰OuMŘKĽ¨„*§ű"u7•&֒7=ŐŇli°-˝ ŘRi[˘ÝĐw/ńW@ď+%úß=žOϜyŮ!­Ď1ωŘófzňŚůÜ9Á€ľˇyůj{VÔf•B='úD˘n•ôDĄŹ`bq´1W|q!#˙Ĺ䲰Ó**ćÎ Ĺ&G~ý]’’î˛SX^ĺ^JÜîfšĘNíX°C˝ƒ{qA‡=/ż(ěŇÁ–‹° ćzÜšÁ@°$,+K=îxO°oźPpaNŔ>Ѱܿ&1”ťÖEĚÓ˛ÁV&Ôx´ŐÓkźÚę™EžşxźlWçűjuMŸ˜ŕŻš6_›ČŤ´zTË57×(OÓku—2%Öyń ĽŹ†R¨úě°FJç˛uÍë]źŇá/M=đľ—ÔžCšĘŰĚśv×M|K9cßâMÇhm—tUô˛(ÖR ˘BGmtŒŚRí­+lkő*™dvŸ9—ęu’— ‰~9úhů.Ú/–n`ŕŚ?>DŸĽŔýă%ŕ(KčĹTbœ—;“f!Í&yĺSŔqł‰ÖŁţ[Ěß ÖÉýfĄšÎˆ2S(Ë yEŻŇćĄßp`¤XÇ:éŐGˇď€ýꠏőÝĐ÷ByĆ÷p;` Ú ‚LĂŘC1n+ěůŹGŰaX~‡bؚD&­Ó3ŠUdĘďůÔËZ÷+źn^ł˝&ĺħ;€qylo,"ţÝĆmßžgáÓ!Ÿ2°–6˝™Ţ2ŇiAíű˝h Ăyç^ĽmâŒ2ęď(ˇŔÇÉć^:cP„ţ׌ň”¸N^ŘR/Ńfč'ëŕŘŞŐDÉô]Ź7 ó™ĚěŰFŅ2ľo:ä ăŻň}”šžě¨uąöi'ďsĽĄ˙HĚu~´‹´ đCřV lb0:ö<€sß§śWcœŕŢ€o`]Ë"çÁáMЍGťA.˘ç­yNĹČSĚ˝XXçc㌠ľ÷UxQVQ#pž¤eč÷d:ô@ÎŃ>“ů ^\pSžĹÜß˙ý(ö]­üfŽETŸKż*€DŻZř)Ú¨űœe?­ą[™[Ě[ZÜ8˘WăĎëd^YRÝ˝s4Dů€ľ3ˇ˘÷ŽšŻäEÜi–[i s–ÇŒĘ&Ćđ}ÄŮŚDĽĺßOčłJ^¤B‹ëcliíĹá¨\'߁m™Ł/í22Áý0îŔę#Ž!Ĺ>ISů[ée}%őr^˘tœĺ4Œľ˝“ÜĆpśhó1^öłŃhŚíŰŒý>ŁE3ÍjyŃhŐĚj}9—ď”aˇeɈľ}Uý˙ýCłßŐňof‹”F mĆZÉyI¸m }-P uĽjŰ\ĺZŘY@ńŕÍu ÂđRśéçhœŃ[Ĺďdč „ý×(Ďx…i ZWQ Ľ8Şi(ŔĹ\ú‡´‚ÁăC.Œň(Âľl[ŢÁ%KÚ|í$rĚç¸kKu÷W-éëPĎŚoqnŕřĚůc4#ÂWůZ”—›‘C>şÍώ<•ˇbřů"ĆĚčĚËyŽ%çŽďœ[0˙,Ěż c˝ÎëWń1Žc$Ç9Üů‡íöe´•vńaŸŠĂÍTdßk€ďů'°=dĹÄaÚŤâa=î($żEŤx4™f™'Č­r•SZůKËpŸě\Şňh‹ÜÍŁĺľH<“GTź9(ëř~Şź‰üiîÖzšÇ(QŕEôuů~J٘Ť@ź‰˜Ű&C—!Ć"öB/.S‘˛ŚÁb1úr çDń$%ŤüxZVˆq4Nő])˝Ć§ČŰo WXăŠ6ćVpoG€ŞXPÄĄnv<ćłw–Ëwłä!G5šb=ĽôŹĽYíAX6Ş}ŕž}eď…3_n7e;Úü^ű”Ë:ľŘŁŘ˝Pš™ßÓQA[Ő~pŸôąË'/0ĚyôŹă3̃šĚąČ%d˝9AnRąŐˇëŒÜGc™÷ΧĽƒĺq;‹zJËäëf˘Üƒ˝{ŔŇá¸Ďo~ođÂü5ç~V}NâÖ…ź cxYNsĹ`u7÷ŕ-–/¨ˇB }]˛J,Ăű&ň>á7Bş/ň ł–†ňS>`žű8ĂˆĽ…ˆ%ăkäŻ ž ΍Ŕ~Oć9Vý…Ăh'"m4ö|ýŸÔŠr1ĘßÓëŏőzĹď@ńlĎË#ú&š\Fî5T.VČfń MOaźtDü\^ëĺą˝A‡ÄďäJ#‹Ţ3îĹXç¨QűíĐ˙A;Q<ćŻĆݤ żÂ đýbĄ|ľq§ĎĽz2ĹYţuđ—}ľý´}´ý[\fůÇëćqU?´1&ÓT"ů' 9"ۧăLŠ8ŽŤ˜•ƒŘăB,zœĆŔž@ôů5`/ʛĐö&pĺç€ ĘŤŻOĄÝu 3ŒúwŒzΊ3hŸ Ýý>?…ú ”łPnúľ} ů40ĺ[ômŚ… ;ú äš2,Ý´ß œAůUș]ŰŰ(wľä~` °ŽŢŻŢ%˙ů…ůčne§<”Ń9§|%™sW˛C˛Ď˙ˤ•[ŠďÖ>Řëˆńç?ĺźüŠÇVŽoW9śq<ĺx•˙f˝ęƒ›8Žřî­¤“?˲-É6֞%ÝŘ֝° “ąL‚b ˜t,žL[ÂGI mŚ)fڔɤŸi MšÎ0ˆFç“`ŚÎô†N˙ëLŚ0)Ľigi›2NƒŤž]šĄÍtÚz§÷~ťű~ď˝Ý˝ŐîěŠ|_cç |€–°x‹íĽl?c{)ŰĎě/ňó~‰ýě'Qă?űum‚~6ŸLjF0ÜĘŃZşL›á†U›LԐYt$r„eš…Ăg dVČĄ%ˆyĆň4rŻ‚ŐסPčč,ň-+´[‰rxĹź"™AKK^ůĽ­Ú‰ hŔö ţ“”\$G­.Z•đ’eĺÍĽ¨QÍĄ´č•żPüťRVč•]mşö]ĺœrYů…bł+`Ő:ľúŽe]]ħx!ŕôRĽSą]!Gٍ'2\´Š˛ÎÓ/SĄ‚śë0Ş?ĺ)ö$ťRŠ9QuäBŕ<đËΡAâwŒňó4 ‚álHk™Î!Ŕ&%cůeˆöűKţ°Žůa2ŘÂĘ\|rHÓÔĺz˘źř>É řô+Ά˙.]ş žůř€ćgŘÖĽšY¤VWaQňřŞncŐ'ÖFÂDrhÖ}Fe“PŰ5- ęÎ(W!y™ÚŘŹ¸ Š0ɰŠ0°VŁŽ6GÜAÎ9ášpS°!9rÜ$śguŠJÚHœ ‘QbŻJŹîÁĂ}äAm ă ĎňZÖFC !"Ŕš++ĹŮ*ć–ŃOYŘ˙‹XÂ=¸M¸!ŠŃèXŔ•a9‘× [ŒťÚi$*„CBE‘„{šŽqÝh4DĽSQ鼨´'*ĽŁŇڍôxTZ•–FĽ„KX‰d$ Lă‡\˙”ëő\/7déYş*KߐĽçeé ˛ôYY•Ľ~YJHxîDę庝ë&ŚńütŐ`*ť†çŃ ’ČLm˘BĽFiA¨ľÔ8€ÓňĎŇD˝ŕ€WB V;HÄś€QkÇ(Âvü1 âĎžeŠ-´€R‚,‹™¨Ăg‘Ęźđ‘+€o˘,Żż"__ŔXÁgŔíű eř{đI Î“´ÔV0?cEžŁ‰jźr˛ć=(ÄiIX" ă nAËš^ÁÍČ/°*šVŸ§óŕŻXôozÁ‰-úQ¨ d-úžZŔPűŘ^łčԌ úŰČúnäeú+ľ ŕ‹ô—ę zC)؀x)‰oŠ<Čy?4˙td;ýśzšžZŠ}"ÄI/Âdfz †4źC@˜ÁçčöR¨mAރ§îňÚ0ô`HçëT¸†Ž‰ěŚj–ŽŽÜ Ť‚Űi…ö‹ôąĐ ň\­AîŢâ‡ÁAO–łtI$KŸŠ]Á?G">6ZŌř%qݏKL‰†Ř)vˆ+ĀŘ,Ö:ÝN—s‘łŇYît:N›^fľ…âm^Ť0Şu¸8lLŰxŮ%0 Š)v đâg֐”î3cáTA,n4;Ă)łlý–‘)ŒżžĆ)óúçQęs˛ů`8XŔĺ6›ö`6Ý)”ÚÔç˛)|ľ€ŃŚ‘.2ăŚ{őœYŘ8~˛‘aúřÉtyĆ}q÷ŞęÇú˙ƒÚą Ă._řß/_“ů­ÔđˆyŽ)mjŹPlJ§Ě5Ăň֑áˆp(Ů?#f™Á‘äF֎úӟĐ`A,ęĂ%Zů Vw†Óś—hźŚ0`´łˆrĹg –ăMei˛ŠRÎą@YÎÉÚ”8 çÜýŽÝ…îrÎ]ť‹§órJ(”HˆQŚ! L…Üźá‘9X2)™póţGf˝d>W2Ÿsř˙t=Ý÷żÉ˝Ă}8ľ~dʉúŇŤˇ–Đă:°ŠŻƒę ˝“—ńbňkTN›ĺÁ>ł"؇âq_ŘՃۜ9*M´‰ ŒŢÝě{Ąń˛ Á”3z%4K ډ f‚ĺĚL‹ šjÁä{Ąť’œ]0š š’Ŕ:n†uš/iśěö§‘/šˇ~ 0×ÄÄÄŘŘřťŔAN™˝6LŠjŇŹßџ'}{űÇ˙ËřQĘl§8sŤi€ÓŘX˜ű…ĂĽÄfĹO_ăĽ6NEáąOÚ1‹;Ƣ„1LiĄř›ź1?u/„uŸÖgŕŤîč”[gä4gŢŤaŹ•ýĂŮÜp^Š(>-ŕ9‡Xv5Čn›#¨\´ÍaTďtŘçŕÍŻÍ—˝ń<—=ó=ë\ö Î÷ 8”]AEڛŤ›ŤP°™ ‡2šţĐ°Ł‘lť›I˛řěByTü3íËQÇ/”ŐW~ńŻž0D„Ă{>ŇÓX5ć÷ž@ÉÇ<Ç˝'ĺoz^ńž–T÷Śçuo֟“g„é:Ë3í}ŰMŐ|„ě‹ xˇŃP.Őg'%,Ő+ě$ź€Ü"÷I‘ŘIƒz7abÝ}°mđtzëő˝ř˝H;ކYĎŃ!–zsÇ:ź‡ uľ]‹uÔ¸ŤŁŞđłÉÜąƒŰw÷ ˍěţŐeÜÄuĆń÷˝ˇ÷ޤľ´’,˖lŮá#ČGN,ĄĽ@  ᅔÀ9OC \Ž' Žp˜„w ‰ąkǐ–$@K˜tŚéL;mÉÄZęĄM )‰~+“¤ľŹ}ťOš˝ßű˙˙ˇ‡nŢđÜđqÓăDVNnœÎ×~úŇéš{*üŸ^żúX_œY>#}ĺóô>Š]ŽZ@]śyŽEˆS‘B6š÷Š^x’. Ťé*öž…G× 0lœd“;ŕáVIa¤Š‚HźĐŒoĹ^{!…­Ű€)ŹŰl×0°ĹńtA?ń2K\ÎÎ&ź$jNł0щ—Ş­š6°u°˘¸ŞƒçŔŸŇEĂđ9RÁ‚DŞ#úYˆÜNôVß2ĹQS­÷÷5YK"kős‘,ťsýV_äk¸Eô>ĐĎM| ’•!Ş*3ŻAx¨(/ĚŠE!65Ýă‹ÎRR)ëdďg xÝIYaŔ[eňľ÷ţdh¨H …¨j÷—4°ĐXŐ1(?ŹĚBVyČę,˛Ę!mńŔéyużôŞňsŠE;#uiKť•›ěďÜ ×MƒSľœ÷‘ů4<wć0ĂÍšxÜÄAĚ.0ƒsq vP×äďq_èԴ3ÔŔbúŠř‰€mIĽďÚ˝š]pn¨eBoŸ~ťyčŠęšT/rţ—ôýƒč)Đ/ź#ĐQSžŠË6Śrš,›ăHbÚCe$‰@ ‚ úDeeÔԙ)3 ŤŹŠŇ_§”{kÂúůŰfäGĎ­Řp2ˇlĂšt'L™źČ‡ŕ@ĂŚÚMMú†ďŹ{j\ýÎż¤˙::fühʤĂČĽ„\ę$Žűgăc˛|5‰â%ĹŤ ×o/Ţ[üŚňśűDńizZlS:ÝgŠ­łČÎsÔ;(Oe›6˜ ĚĹ Š÷ßrŠœĂ᠎.śoßß ` v1T6vŮľö…bűŒ—V>böołíń,(͂Ź3đ)# ĘOe6Ôh-ͅÜn– Ľä<›ILëIô÷#ĘD˛Żßô‹ţޚž>{Ź´Ż7a˛J&!™ˆ@Ĺwşy€K]ć+łČ4–č0ĂOŁĂĚ/Běˆ'ç~oůÔPyóœŐť^8VťčĽ{[֍ŒDC^ŻžvLhzýÄăôjNhńř…lUW5lŤ›y|Täprí˝†úĂůĂ$~ŒńÉęŮŻ&НâČô*?ž(؏?XUXŁ‚JZ”TrUęJĽ‰o~ĂţÄY•ľyJ˝ÂMQ`žźéᆧ\Ŕ1^' Q4a‰^”˜*X4Ş „çŻ *ŽCUdůŽŚ:4YŇTIVTÍ"rŒ‚jłĘ§á5ü!mnc’ÄëÁ¸˘„ aŢÂNÓcř1Ľ´•ČŠŇwŰU™™ç;X¸MĆ[Ërҗ(´i‹ŚŞ§Ů`"ăýÔ¸*XĂŞ.‚U9ß 7ţŻäű#Ď\w)ęÍDwä™áD$sŚ›ŸáđO° "Ś5Dô>’…ßÇě¸šŠ†&Š$ÂŁO4•¸Mť°áC$˛"™LŕŢDĹ|–?(P ěj:u¤ŕč—Ľ]CXéŽT'ěäÇ˝ůŮô+P÷"ŤK§SĎŁĆÇâ~ü÷#Hޏ/‚ö‡ď€É+Ťó&ń“…Iâţiái1É%…•âFnٰYÜÉíqÍBיçZǁäsűF‹G„[pť˜ß´@rg‚NĆqwƒÄ ’ Ççˇs,´R†VĘeăÍ/­ť'ßß"uSóę|&=ôŰHaBŸžHŔ>ŕŚMšë7ŠdŚb1sÚ4Ç$I`ҰŠw!‹˙#eœz ĺ"ŞĂ%é…ăŽLßş`÷V­ž7"\^X12ěuć${ćíßȏó˜w\ýďś~öÚĐęĄţ’‚hE@•?;ľöä÷­¨Š ÷ŻsĺčäőŤ6ÉîśSˇŠÇńFĚ4bAg%‹:c9ůžńmT×{väîR_ńěőe',‡]-ţSŹUlsuűÎ9]RśátgłŃÜ´,l38§áôryŒĄöľćĺi€YŰNxď͒Ӂ¸Z*×ČÔ&çĘT6ýUž ŢŁĹ֍Ď#ů˜źŐß°ĂđíO$’ńĽ˛T†X4Jô Č+™@\hNˆ@2™l'U•0ÇöŒA\yKşç§uٟkM˙öÝ#ÇzŕńľiśŁnĚʏVMÎŻák‹ÂéűJ:ößL˙âćK°üŁĂŠĂé˗݁‰^˝Ţ0ô:r+ËTýŃNÂÝ?Űúč¤r,čĚșcţ#™ë¸Obt8ş§Âs\ˆkŒ:ŁS(Q2ëćS=čŒ]˜ş2Ôśç* xTŽîĆ Ď֜‚\ ´ËTŁö.ý‰j´Ä–ľe*Ť×ŽúůVU!“Čt'A (ˆů°6§¤IôőtOăœř`~|đnOˆ;T:;Â'°vţ†j0Pšeä|ŢA),ÔcbÖb­Ńhôp~¸%V4Öňƒ˘)0–óőkĘ6AŁ{SAă-CŞű,{}ű wyŁě¸Ţâk.x;t˘ě$tkݖ.ýŒďĆĐź[ÕÚ2CÄÇÎGî–@ ąé6jëÂmѸ:  ĎC%-Ź ž$Ů8gŠqÎvŽw^qrNď0ô˘o›˛ÔíŠŰô‘ő jÍľcëťö˛Şp €2ůP9؀.Q21§hëěi˙iožtěú´šöźÔţňĹş†•‰iKs†äě~˝iéŠý3čWľí3š˙ýáćäç-Ů>Śńě[˖žŇC?[2ż~ů´Qą)˝ŢhZŇxhٔNʰČ´/Ă4DŢď$$:ÁˆecqqÁQĂšő˘‡‰~ˇŰĺg#řqüüÜgÝŤsˇd˙—ď*nâ:Ăűv%Ë+ËZíŽdi'٫ݕlśed%ĆZH§Ó H€Ş™„3ĽđpB;¸€“4MKCĽ ¤Ԑ¤€÷5!tŚM‡ŇL'™IŰ)MH&¤¤SˇL°č˙V&ąË´>öí{űvWúżďű˙ďß í íPž×^vž\ˇßÚŻîŃN:Ëaąl5!9„k˘NŽoÇŃh”ŸpN˘0K ęĺý˄Ë-Č1EÝjźěA`[yˆL_ť}$„CDZ•Şąüż#L ’J;._S (e‡’ŚŔ™TŐUUÚ¸ťĎŘüöĚń÷ślۍňżÜľďTĺĚÁGŃđłK'Ż>żlŚi…ZŚ˝óý°pńŠhöÝoTVVޝÔLĎAáż>śŚrä˝5ë@eĚ­ßS”ă8¨Ź‰JRy´ĂZí3F ÉlŃ(fż—űzűşöĺ…ďfˇşwĆweć~ľyvĐQvŸ2ÎfĹŮÉ×´–OĽ’˘ěÇ"R(Œ’ŠTXVü˛Ź°z&-ś¤Q>­ARLg´ç4ZÓDD‹ľZ>™’;ăŠěcŮXŞ šŹÁ"„ďšHŠ᪹x”ísƒžŒ(X.$O§ŢSŽ1“,Ż [’’; Ÿ“/Ɍ ›Ę|GVFň1´âH'+ĺN÷ ´n×R‚@˘”€žî8%Ă#UžHî4ƒděŒ‡ěů‘Ě-ž¨öw=W†Żd‰DĎC˝H¤Ş’§AY&E„ ‹°RţČg˙’¤ŕ´yh´ wůşşˆJŚˆCťş ÚŐC9É8vëZgçča°Ř ‹e=kńNXE%řœ–'Ť mZS!˙öÇ)Ą|S[Ă(ŰŐęsOoSC‘x44ę4ăEW?űĐŔŮu+—ütŗ_­pő÷Ťq>˙G$ßߚ€/˝ń­~˝łň“oŒ˙ńߡîiL;cÌţŤN§Ň/Î[xlQˆ7čz^5ű™Ž%-Fbř"]î_źÂóé<練Ö=Í@Žžő&tź°(Ź=–tX˘Ÿ”śJ?—˜ÍęŚŘ ęśÔ^eoꤣ,”ŐŁ)÷buľş‰bœœŸ›*1í–: $M tË âŔĽr>ĺJz˝ŐbÖçsůü™ N×LĄé‡¸Fy"üXÊ#‰’F')Ÿ/Ź~]7ňé$ör\ IÓ¸VďŒşŻfŔeE…bƅ\ę€bC9?Š'ç”-é-)REd5ˇ+u#E§ä˝‚ś śűN0ˆ2˜I‡NG:ŮWçćt`I™Ű„Óƒz•pw!\˘×&œ^%œNˆ„ÓGGFB8Ý &ÜĐŐĄŤ$O$z†n&W2ĽÄ•*éHÚ ž¨vťřŒ­dw;˙DcűJőÔĺnţŹXÁŤ ĎPĽbÚIŤĂDm—2všnŻ.ŽeV4ßdo‹™13JoŰąž˙ń¤ńL\ˆŽä;E‰żwÍůKFß§ď×߯ÄĹř›ÚŃđ0g.Y›}ĹÉ ż˙•ĺw2‘“*Ĺ šě÷>˝ż˛Ů =‚Úź‘i›Ÿ3Fĺx:ŇĄ§CaÔE`Ô`TM)4Žďn%Áß(ݕszŢmć^ó´ŁĚ5]ČëĽŕ |ŠŻ'|iŔAÜ[’É<ÇąŰ| p~pČëŘ 8.ŒĂ~ŒĂ™´A§ë˝Ţ€A7jq6ĆŔĘeščßšţâ˘]ą-”™5-ó‹ćrÓiĘ­Ô8ˆ0¤!ŔáÎ`Ś#L˜eáÍYp˙+ŢE„* p~<?­:ŔţřޤÓŰĐ÷~}×˙‚ž…óČoäżý:¤ ŞGxk Ňćm¤m ´űКoÍgăܗ–^ݘ_ę„帨7°Ü>ĂăP˜uS ńgœŽákÓÖV„ŽŘř{*‹Ӎ¸ËpyÜÜÇ´Îď” Á¨ tÇ'öřÜŕěžwë˛óˇÎĽÔ8ęź5C´ü˝žŕ/´Nm+,ŠŹdWÖŻmYxÂóBäUfOŢqżç•&+˛ a9ŰF× <֚üĎiMŠ,g ŽŽ@÷uŒĄ-Ť˝}˸ ă]`°Đ-L$íIî­Y âŠFÚČÔđ~„X´ĽBTă"iÚŐZŽÓ`•!Фˇ ›œŻ-4ŮW^ŹüúÂÎ×~Ó6gîü€Üň5ľŽÎš{î“xsÁSż(˝Uů×úç˙źađÂVe¤¨ę\Z™5]d[ĺO×*\"¨4%Ą‹8CZł˛Ą2pwě%Än<€Ć˙ąř@V &‰’ÎA™ŸJ ŁFWh ͇ʼnÝT„k¤gˇ‹ƒ Ó׈h–Á4+ !$bIPÉyˇó!I łn?ËşžŚQ-‰ťY_č-R(ÁM‹Pމ›Ě°ëŮçX'Ű*° ŐC‰2mď`-3–#çV0ŢŃǞc/ą—ُa'Оľ@Ú,QO„eƒlÄÎŁâ¨< ŮʖQ‘`-ĄŽČZ~ęáôí'łbY+,ŘłÁF‘ŒśŕŘÁŮë\ŘŠ՛Ń"ŰÇIՋuÂíąŰŁöźĎbAĽŹ÷ŰWúŤJűSŐíçjí":őţˇŁY"ÉRo"aÜ)@—IhcËł}R7üŚwŚ’ 4E݇ĺŽ튳"ЌńaŁ”7l‘…3k™śE9Y qţiëo^ěHQ°?MQŽ€}+­J4Bä[wAôfŁšaZĐj;đdĺ>ü ú^Lnz˙ťcęŻ0˝oÂG0cb”Ň||7•…C˜œŹĄď™ů s'ŰŰÜęA*j¤ę@á“Ĺź_aӑŭ"6k™VÚF—ořü]¸@Z˘)[IŠőhk v2Ź3ś{4“płŕćą`DH–FČÎ҈Ć@@÷ˆ§„/UżŞ*Šd2 ű#‘° ŠŞiŤľ­óśË5¸‰ëŠă÷îęýňJ˛wĺľdiWHZkeÉÖĂB ŕĽ‚ÂC¤ Ś8@ĆŕNž1‰!˜0!-…‚™Ґ’!`üŔ<2ió˜é0ӒáK&_L) uŰ L›KôܕLBÓŃh};;sĎ9÷üŠB”ǍiŢËǁ/Ť˝ ´ä“ŮŠ´7íˇI•ţ\ž¤şŽž¤ŽĎ—§xUßmö¤ďâOZ^ĄöĄœĄÁ?UĚ^…ą'˝ŠĹšô–>ŕ-}ŒŠžä})Îs^Ž÷ĆMŮľŠĄŒ™źZ%َT,P§đ@­€I.Q"Ëâ•üĆËg&ęRű=ÜpďJwţOeýđşäąŢŤPYćvAî="\šĘ%ö-‡ŕ^uăUG Ş2'6ĉýôcĽ ˇŇ8 ĽŠ˝;h'ž˝Ţ)¤}ŮŞŕ3.cţcSŐÉ[ť+u}ămh7ښŤVE|~˛­&휇—5M˝Ţ:ˇcěäl9Tî XfÉŻhÇĂsšyc×!Ѝř„Íô}ŃĽ D=úř“oĄ‚Ý`[“JĽŽbЧ…žŔAáXŕ”ţm߀ž_0éL8LR÷<ЁÁU#LfhKŰżĄ~' X‡…Ť3+2ťXĆLńH&“G’ĚşâÜd7C—“Ěćj–ƒǙ o0Š Ż×Ž(‡Ý`ňřىc˙0݅4˜ë K7̄8ĘyÁą“Ĺ,é_5F–ckTőů{ꯊ?[ěE,ŠčE0‚ö“{ýŽ ;Žß1@ËÝ’Ý nوÄg€eü xÂoŘ âôśŹšřœŒ6ć°@ ¤NăCóXҨ`Hu ă>AĄŘĎţźŤ0vxĹ/Ö~bĘß6Ż]P7"eV~˛qú‹}ŤˇżÔ´R;§˙•5żß"öď űÂş@ ů­ŮóGľů÷ző#lÄÇ?=x˝łđŸÂśŢś.Ď^vŕđŇ÷WlţőďułĽąe)s°[L˜œU¸‰Çü‰/đ Œ7ßŢüuAşŻąęćŔȧűżXşţ5üîŕ°xŮÝÔ< yŒ)ťwG^ŽQ+Ź+l+ĘÖZ;leĚk—­Ťlłłvg´×zÜÖ[ĆH(lMÖ.Ź]#´Őn7lłuF÷^ żZ{ĚrÔv”9”x˝g9k;[v†9=ťˆŻZ.Ű>`ú˘ąŃj6ÚjžoY`]Vť0ŚÓ•sĺł,3mł˜]Q]Y­5ŞŃKȸb’Ú*ü„ šş„ŁĄ Ü´ëÉ$22˛ĂtĆWWWGŐÁŤýţŃ׉űQżW(4~g† }•UI2*Ub(…-đOÉgJ4ĺ¸9YÉţ7ŃT8Ax)\ ă”Ĺ çv”82×r NęyTur×šQ¨ ŇëG˙ƌ’&DItâڈ7rÎD)˝Eł Ś’*1’ß÷é]$Ż!r°- Ź‹zŰQöőîoěÚ*wôĆŰăŢg&élvOŘl5'şŰ_Y€ĺç^źś%ŰŢâ' ^üŻćş˝gŢzĄiâ‚ëmő­Kö˙ŃŹ9ŠŽŽ/LÉśÝ:FWáć[ËÖ|¸–•ËćCţßW‡n,`YńÓĆŹĐXű­Xp‡´[K÷Pžb°ăK´™@d՞T‡6ŘŃ…ŠbLĐs‹˘nt›Ő{•rD W0˘LN‡Ľ*Ćü™CŐjHĽ:ĘŃâčŻ)ŽŐždQ´]|˛‹“? ˘=DUŠFžăEӚ‹ôŹq–,ŚB–Ą!÷ó„ UŃç2|‰őČ8čpNá•xecŠĘ%˘“łc€1Ůlvź÷Ę[™ä°+&“ŮL&ĘaHi>ó¤CPWŃSK€Őô~'ŻŘOŽ´G4şŽ łV|}]áABiZňçÍüܰ'ƕ­?{ă9w@;§pdޔć€{léű5Áú@ Ňžäçô˛/@^Ź…vúc8—zôÉ* ЃO##őNżAŚ˘:ŞDmŒ4Ún!ŁA“ĆŒ6 :Ň(ṘœO0‰*E¤uz=ĽŃjťI—„žŞIKftÚ´¤G#ÇńÔéØŃSŕ/ řśH U"ƒ„áËSďEÜYŒ9ŽŠáĂsČ-“ł˜)̝žşékΖ<ܑáŞÝ% Lj–ĐJĎhšŃÔÜ@˘ŕoĽlř]śpˇŕĆlyĄ]OO˙÷k3‰ŤIÚŠ{ęŽď_â€ćńÖjşŒŘűüáÝOlc‰rŔţ’ôŒQőSSŞmHLSmK_,^´/ćHjƒq§‘!1ŞA0"t ‚`Dzl8dZ\PđŞ#Ր,Ł0UŠ ÂwÎ-+c).P[[ž„âŽą•ŒPK_ćÔ:…j”Ąć PĹaVT1JXHCxŇÔ˝ü7…g+° U¸WŽ]÷m~şnÓL˘ŔuîĐŇ{QtösĹeô„ޅw…á#Uż ‰žI Čć:˘ĽœĽźń${˛žjĎňQą2eą‰RŇFže`ŇČÍăžçč§ę°EĽEŠL]d?Ţ Ň˜Ňh0S ʰXŮP, °šúŠH¢)Nš ŠH/!Ć[,ݍƆţËwľ7q]á}I+­źŤ•VkÉZKBŇjľ˛lË­Œü?¨Ÿ0†ăB ¸ŕ‰Iڔ˜ ă‰ÉâfB384Mú $ÄŠRB Áé ?:ĺGŚŚ™Ňθ3Œ†Î„tú˛čš+’ţ¨FťgwĽ{÷ÎýÎ÷ďÜýdŠw"GÖB­őň61Ľ*"ĎN—]Â;0Š 1ÖOţR9'˘~NDυ#ILäĹ:‘üžˆĂŁĂsCšx‰˜Š}’Ř Ő&“>ŁÇ„fÓwxH›őÝöž†”čSLĂŐâĆŻ):pÔĄAkŐ,4”7˘§tĽŢˆöŇsXˆ…âý›î{]ŕČŔÍ;qÔČÝî˙=Żäóńe÷d1¤ö‹ŕ iřb¨ âŻMĄß- *üƒbąß°ěXßůŞĄžóÍë6?pÓî~„%áPď~ŠEď~ş>%ăNŇEΌšŰ¨Z˛Š L‚qĺlBŽÂÝD‡h3aԕ&T=Č÷Ż–“ŒĽŒŁŤB]'2ńxšřôžÁţž‰Ë'o['ĘęÝ㳝Ő{Ÿm'ŸYÚ<ĘZů2+ďőěڏկí;ŰY`b˙ĆÄ˝weëpanŞsđĚďţ2܏r/…rĎt˛^ĆM:?*á§­ë°MŚ‹•”‚6˛ŇŸDQ×+źI‡ z:ŮăÁÜ]Ü-ľźÎ=ŕań 瀑<őXÎŲ\Pö§ƒQŠf˝˛ÍĆFTŽĺý9ňˆn§ďçčßŇD€Ćéížw!‰Ü¸Œąđ˘Şş$‹(­jFPŒ€^ĎŒ†×_aŻłcI6‡ˇ\ˆ°n6ÂäˆŔ›Ľ„YŽ‹ů%ŕĺÍexó (ž–"žŕѢÎôůřđ/ڐ ?„4ÜÝ~œL!$Dź^,!Z#QQw :M ~¸íš5űžÍnM˝0‹×…ywíčŕŇąŃĚ؜b:ž4°Ł÷ÄĄ3…÷ç&)÷ŃË:iĺ_˙h:‚7ź´e×ĚQ¨­°÷{€÷*ÎęŤÁpYjĄƒGkŐ –Á›M™hF}–8|&z–řą|!0/óĚKxŠ “7PÍGüťŃéčkA˛Üd´VsÍĺF>jłę*ĄBl…#‡Soůd†Ž€bĚK|â'zȟŽDIvÍőHE”€l–dˇ˛” °ë­ !ěüfř)k4o5?lŚ›_6Ÿ7_1_7›ĚąřFĂPťnŽá (ćó‹°űń8 €=Í_+ö¸“ˆ1A`L-0ć"ŚřSF­ #%r8e‡A2D‰űޚ”v}ôíăłgńŕą˝{”ĘX fO0‚OŰ~Ľsýc;^řúLJžőňԋ¸úÎh{Ś:¤ú…5.›ČšŚŸ:ujüń˙@Qjä|ňúiڏťBöŹ „“ĂڧZ“ :Ů9)銂îUż-áREŤŕZ™†Ÿ|•• ˝“‹KĐpAFđwž"žŮü—é‰RʼnÄą´DRHƒ§ƒ¨E5ŸCߏď_xčЊŚí˙JʐjşOjDgĚ‚Q ?­tXYghm¨ű¤ŞöGż˙řúžţÉ÷^:řÍÔeť.ł‹Aˇ&őڟ,ÜnŻÝô<ţďŰüŒ“őlw)!‘’d ËNÚľŮV4ŰŀHˆŢ(ÖC Zť9€”;ŹŽÍr:L4Ëá\…żęYŽŔ˙\DÍŃ@Ţ0g`ÍĆâůJ˜Ńş h§QŤ­ ,°+“ľ”"˘ľ,ƒîç +2 6&,óŮý?´§ÍQ€ŞÔCÝĄŸÜÜ}ôi1˙űĎçđň“ăí›~öČÂócjőăĹ4Gľěô}–{x_yncËP˙ƒm1Ż#ÖôbWUňŕ ł…Őä5ŕz>ţFÂr6×dI´‡ÂpZXŕŚLügüeZ°R°_°9M .¨PŤ?Kč­Žl(Tł9D§.]X6[#F3E‡I‚6č`S%\‹.:ŞT“n*^”jn1–é #iâAç‰}=˝ťlŮŇZhŒH‘§­B|kok{ýun¨˝Šş%ŐűJw˙–Z9őZيlC‡&u““텞Ó7†WÉęŠD¨ź\ŕhŤ‰N=´łę3âŐv÷Ş‘ď´Œ Ԅëä >aáhFŐ&[nAj\+ŹŚâŔÎֆő㌞>ŃqĆůsálů+çžvŢyŮ10ßÁ8'ř‰žüžS}żč3;ěö@Ś×•ÉôÚ™^*ô(éiKŽlœŤĆ€g'ő@â׍r5Ý%{ěN‡Ť›HPĽ.• –…ńŞťŢu‰lŔ*ą:pÉYŻ[ceÍá=ąU͕ď‚=éĹb ľUZ %Ś]Q“| żţ_žŤ6ś‰óŽ?ĎńĹöŮ>ߝďl_rvür/žťÄ$>;š^S 𐴰–Ń@„—Ń”v+ĐÂLCđ U Ő:čÚаUW­ě…ľS+UڇMš&-bCkÄFUiq÷ÜŮş˛}¸çď{î|śî÷˙˝ü¨\.4śTvÜŇŘYŇĘś7É9a-DíŁZlöޞEčĎ"ć¸BýyY›šSĽ„í X4­×š€´čŠj S„hšś sËY¨Y°Y¸! í"ÖĐćp›ť6ż8 Ť=˘´$:Őć7čmăż~Ú`RKőjŽcâćáç?~¤ ňßm]ůƒ­{żü¤´^//?öhŻńř"šŇ˛r°{čÜяJ›ť°Ň“ůś}›6yădZ‚ş˜3úV˝\îzÂPÇzqJ•GňĄ#küUˆŸZ1úˇ=ĺożýĘÜŽôÎů ŐĘR?K Ś >!6ˇPŤń!ĺ5{Ęő”űał4ážöˆ{¤ĆAđŒč4Źd`Đč€Đ‘Q5 ĐLžŻuD6˛ů2Lę°œ b|œáů8Đ@^‹é­ŒŽˇ&ç9q]ó„˝|§ç[u’9D#—˝Hŕéř4LMi޲ẂMć?ӭ̋˘ŽU'š‚]š {Ľťfrv5Š˘qK‡z¤“çtŽďô´¨Ź5áś´{AŽZžvj ĐӍ ˇĄj¸¨ÂÖ¤ îćâşážDú_¸†ć[Ő–ŢnG‰-Ű;ńÄ|Ô ¨eL7 …Vt ń—K4ł€IT`BŞFwěž#űUGŚŤš^m#OÂNű7Õż_úx,k6=Ç˝ž`a~,1ą6‘nKî`#LszŃpřĺ ož€K“jŒJ‡ŽüۀԻ ;>ZhôS>m9m|o^[Z{ţ¸¤2a6ł=öçţÁ?8Ÿ}>*ť0ÉňŢGžú‡Łľ^ Ŕ”)q[‹ű˘AŠ&e¨f„Ď 0’„,§ôľŒČrV)`›k;iF \&„ˆ -Œ ´đ^!#ˇ$wˆE€žpoÈi¸x[˜†É_(›)Áä Á­Ř•jŕYŐt#43ŻžŃ4›Ë G‡ÉœńěŽayJë}{ËĄӇëaŹĎŽľw¸<37sƒŹĄmc}_°wfÉ:¸Ö´3f?rŠ3 ŚÇgĂWŕzÖÇŠ@3…š#żOšéű𬫻€đ÷™b—˘t;ĂĐž@¨PL.]´@ÉEžńl_[Ě(]]JŚXŮ1םŘO2¤>Č=šŘ˜—NÁś6ąM^„aÄĚ"fvŔ)3K$˜‚aú9Ă †I݇{#Ä*°?x–Ä;šٟâœ|:"FuŹfË1(Ąd,ÇĐ`€ ŠŒS&Úłe—ěIxzzţ5¤¸‚gÚ>ď° oJ˜Ăé„4đLĽ¤ „NI–‚2bž ?ë#œŢ,ŃQQ§a“’íG2áp,%2Š”8-ťnJL0(A ý0!A4€ĄӁţŽĘ(Šę#\ŠěŽGĽ„WUH_ÔĹŚáĺKá™Ô43#žľĄ^= dTxu˛ý3ĹV>§T%Á>EIEŠu•m ž˘ĄDr g§oÔ;5˜™ťqÉŔÜěrňj ĐSś˛HOw]ŞôGüŻşÂ]e°ě! jmČYˆzĘ^Éëx#ŮÝŘý’ľž`Ľ?yíÚ°ÝWvżBŘiÇlQL&;[p—MtÖ˛‹{á\1CäŻ7cyefűŐů‘Ô’^8ĺ)méŘbăyšf‚\Ž+šeg6ĂÉc7„M é$׎@ŮđĘ@Äç&=˘č”ÄRóŔ’˝”ĺ 89¸śĽ žŘ]9ĺÜľ!B‡ăž¤ŐY#öo@Ő s™@ Ä`̌ŤÁęŚ[ą/9§'îÍzMď ŻÓŰÜ‘›˛Í¨eЄՌŨCQĄ€—äEŢťqłç źŠ™2 ,M ~@}J9¨iŘez7ĹQ‚g÷@M-Żś#…€ăü=”-í‘ʔűěbš­îŇÉÚmAťŚuŁIňŐëHí[~íúŞwO… ”ÉÖX=†ÍÎÜţ|ěżĺá]ÇtĚƒ1ŽŰúâľ~Çc-éŔ;ÉBÍöáHď✥ňf„ö# +­č2Ď8 ´ˆ2׆ƣ‘a&Ŕ•ĄŘCĚ%R۰7wĂ1<Ç/ ”•‡GŤN˘×œÄi\×­°Ś"Ęjś{kՋv)ÚĹbŞV3s­JdÍFYţ- j–™k˙ĂĚŐňěĚĚmő›~ţ7ď&gˇ[˘fY:ů5O˙?–nMcă6{ą¸÷7ÔžJędý—ŕľýW;ÚţPós!ŇMžŘŘ`ą5­%v˛QşIZvf¸-Ö~âR<%хŹ ÷öBŁű‰ĘşĽ¤Ÿöe†čýIłťŕOJ&Ö?yuÍĆłŽíăŰâtĽwwŁžšˆzĆ"ŕ‚ůPŁĂš<Řëô[á3ü$5Éžv­ GöÓ? §O…ĎRxž.FÓK#k‡¨Ő4î!ˆ`ʋc \ĘéeŚą˝&…żXĚá/öGńÓ¸DýÖś,]fŻĐ LÁ ˛Ŕg@řW? #„îT*ߏ‚Už‰Â6‚Ç^,zYŻ–q8ď͡v0vŘď–Â.žŽĚ8x᧐ߡďgçÖ-9öĹúĽ‡żpŹ8QůÓůŸ˙đ”ĎżŐ?öxeݧm‚Ż!WřJ¨,Ă~‡ŢB´ĂAł´&Nˆ÷| …P ôűűCK2k\ýťüŃóňĺĆ÷”Ë™ëQobňcYK˜ƒžÔźvż°Q.ˆüL6”ěă§áŚ_Nd˙ĂvľÇśq×ńűÝپ؎ŸgßůîlߝŸçŘľ}ą?rą-}%iš´éƒn¤uZˇ*[iTTŹíŚŹĐ ŇŠ)eE Ż1şŽRZ4/­]P ˆJěBHdC„ŃNă—ß¤ůôťŸîüK,}?ßďç"b —„˜kR'`‡J8‰¨SDŸ ˆ‰˜ÍŽţĘ%Ą Š‚;3ƒ" :[˘q_§Ú[ŇŘ _.ŃP* ÓŇ#ôgéiú mŚg¨^ÄŤéËb4ÚĐą7ťK {‚ánƒčA o @ä 'lMŞvqË˝X‹+~证œ{aąÝľéÚ<ˇŸ0,îÖMĂÝa¨~‚š!ńŇŃ皍÷°˘—ň(K3ŔhĽÔűV‡Á™†2,4xgŐÓŻoŰv¸őÍtĺűYŽ8dmĽlcËc‹œ$‡ŠĎԟ*Žďٸź_˙Fżqô‰ű˙ŘŞ˛ÁVkÇJžxÜT9BúÄ0\djŚŽíŮüńŤXą¨HU„vŠř7\N"ŽTĐÚ6SŰ­ŰmSç¨óŽsď Ö…)ክŚÓ&2,I€XĽüMMĺ‰!@údR"’sGœ…_Üb´ Đ!I’Ÿ,+˛dSٝˇB눕˛ÎP"IÍɍ,W•aąŻ(ĂLI†1´"h!ű*Ă`¨HȀĎĘoË×ĺ›ňق¸ń+?MË\ˇĄyˇ–ŕI§‘?5´č>eľŃAŻ1>žéęËwł)ŔŽ‚‰SŢň'aJ˘ë^‚¸ËBĆŤ=`ŰŠ '7”D$°ŒSL$Ýa÷¸„Ň莎p—E>ý–ěň)ţ ľĄŇ@úŕĘd|…ž,,1–Ž'|ě̊ŃÜaňéńʎÓmEŐżł€üÂű¨úyâM뀋ˆîF‡Ýä ŘýŽZŇŹÚŁŽÓ• 0 v ÷×&hËÎyÚKŃ|9آ6ŔŮC1œ$fôÚ#€9gíşügůC™:"ŸDőť"›äéŽZbJ˜äg†,K˜GK‰§WdŕKÚ X 'i÷m<8ŢÝó0ż€h§ĄĎ/´ďcF7§QŠhw)ębŽm;yŁRQŚ€Úş.K"k_čćđs™|ż/n~r¨ŢŇ^X÷ĆÄÚíŠwď‹[ě^ˇÍźT8ąOœ{<é˘đß;´2Żč=_;Ÿüv¤3 V~ăđćşŃßÝ[ÚuĚL%s¨ƒˇ˘>azžË[„ ü~WՅĆ÷Ě7É˙:ŠÍâ$ń bĄń¨“rÉ!™<‚‰ N0™išĂ"‚ĄpŔ̛@â,ž7™¨—ˆiX;’n D–ĺYIĺY7Ůď˘$ŠźCj\&.ĐŽIç MR°ÓËžjń {%YßIVTé!f„-‹ý‹‹YɰB‹(EÍ㎞os fs[rQÍuŹĘ' ÂčçŞŃĹf]î9#v!<†ś@G?Q[٘dHnýˇU>łąRÍTäźl{ć돘žo}ŘXüɎ ÇőíᏕĺtĎ>ňSÉđÁ—0[`…źŠúU/Ɏ_#˝%mśIßË~Ńˆ=ď‡řßş9ťŠwŻ•ôo"ńS=„î'5U%_ˇ‚j˘ĄŤ;ÔŰţŘŰUÚ׍ëŒŐ–HVŞ5–3ü:“HŠ}ŮBaÉ+Ľi°%1şaô€Ó.2}Č-éŒŰ6iÝI5QŐEý i(|‘A!Nb†™ĚIć,cfšdvâ"̂l\žňŠmˇ„ˇK踹űüí=S4vČGŐb^„â´H‰|ŸUäý¨íŕ/ ˆ÷mš"ŒzĆ?@“‡÷‹lŰŮÝZs/'çŃ Ý5UČUé ŤĆ#iäD´ŔP,mŽÂ°Žáś řöŞ14éŹö˘•G+ŒÖ]GŽćą üƒ¸#ĚvW:ŮS~؄ŐÉr™şú٤ĂîI†‡G˅dĆá<÷ŢcY˜Ů*{lţŽipě‰çÔíIŢŻě˝řěr–ÚżxţŨ×#sĎő&2ŃHeŕăÖďBmđPÚ'vzÂ;ŮϕӹxĎW[?Ÿˆ2܊żüň÷ë0óý uŇę¤Ő îv`Ң ş‹čuÁ"Ÿâpœ˙.ř!Žëľž ÷Zč.ššÝĘłĘ˙+ĹlvvmŒR&^ČŽŽtÖu¨*R$úTÖťĐ{J+&WĎž&5%Íf#čŇl5™Í&ěŚ.žŽLžü6BFćäüް†€Čx /¨XČBü|öë0TŞ××Čč8é¸ŕ09„ľÝüš&đ]üögóîcŢj;hĖ7Po,`$ĚH{Œ›űÖŰ{@ßK¸8ŘbˆÇ@Ĺ$ań„Ţ—˘%bŘGE[˛˝/ń*ţާŒDËđ`Ć{SŸŽ>ž„ŇW0ćG6& Ôˇld‡?XNFťĘ‰Šâ_qf{_UUYŽ ÎN&÷žnćÖraęxą;=‘ßęśe•„“ˇşƒĹŠÖkĂ—đ~a}Ś‘ŠÖ?×w‡Ř¸’‘9wâ•9—÷1ŒěÎÖjęBśřč+Đľ’•řßÇżJ^&g„Ëjł{–š5]㯠Ž~q›ř”H™´|.gĽĂ‚&xLů\vYZ ŠŠfśĐV›˝łƒ3•&+ł>‚ŽÍĽ“a—ŇW`Yó@ťˇčňHŇŁv~žĂŽú7͑#ÜQîÇ%syôŽâúk•ţˇË Q.ď(Sĺ&…Ó{ć_ ó݆Ÿ‹§Š§´iíŚFhG5RÖňÔ(­I/Uť؈˝1ÁŚЎ‰=Ścžh,ţ˝ĄßZ0Řš˝Ş„ß Ž6]m;ő48X–cÄř*—¤ë&"1¤mŠlي.Ę@5 #‚#Ł(oĐěgo2ËÔÇ[żţĂ˙Ů/—Ÿ&˘(Œ3ÓÖ)`[PÚFJ‘RŇVÁňHĘcjyP0Zą@cy„bĂJLŒĆc4şPc˘+eaL$lü Ž\ş2Ѹr#Qâ[Ďt&RC Ť{&ż{żsď™ŰÎ9Ó¤çţŞb÷ńRÓ^Ń(j÷črŤĽsŽCMcW/\Ż‹ŢMšÚ†ćťlyůŮce‰ă¨äď\Nü|AíŇaż^ëľYöŕůzţňŁ€î6lä?đJ[˘śâ3ýĎ\´]€î# } e˛'€œ…ĚV6ÉF`şĽPxc+EĄM,<`ý p°Mţ’ öŤ[‘3S:”Ń\>8żŽBŔŽ|*(ŁďV=§Pű¨[|Ďęí@Ăŕ4Y7 Ź-‹ ƒÁ`0 ƒÁřŔƒK÷­&˛â̄MŘâĺĂh*(Ü ČląŽŻQçWć(GIőxUđV+őđÓhnim“‚'BččDw¸}'Oú2öޘOh´ĂFЧхZ4˘Úэ^ôă bˆc—0›JQŹ㥘ćtLzŇ1\Ä&1“JĽ>mŠ•Čd”úÔˇm#D Šg °ĐČŠOdĄKŃ:R^šâ=­xé‰ÍÀkŞhýžŞ5¤—U­ƒ—㚛ڼ`Ťł76MtD§Ă㣑ą i* îl‹ŇÖDi“¤$;)Á1Œ"Š:hœFăäG(•3E*Nƒ´Ĺ0• N+“;Œ@Kσ}Tžyz‹ň)ŮÜmÚ5¤do}Ćżnß°?ËŢ@Fż-fEů˜w˘GH¨Őçż ?6_É9›ëű!‰éč§ĹKoäůőŰçŽ5íŻ›âŞč!W~Ň'˙`űÖńá endstream endobj 1633 0 obj << /Type /FontDescriptor /Ascent 1005 /CapHeight 0 /Descent -219 /Flags 4 /FontBBox [ 0 -220 1113 1005 ] /FontName /ECMJBE+SymbolMT /ItalicAngle 0 /StemV 0 /FontFile2 1631 0 R >> endobj 1634 0 obj << /N 3 /Alternate /DeviceRGB /Length 282 /Filter /FlateDecode >> stream H‰b``2ptqre``ČÍ+) rwRˆˆŒR`?ĎŔĆŔ̉ÉĹžÁn! v^~^*řvD_Ö™…)p%•é?@l”’ZœĚŔŔhdg——ĹçŮ"IŮ`öť($ČČ>dóĽCŘW@ě$ű ˆ]ôý¤>Ěfâ›aˀŘ%Š {œó *‹2Ó3J ---Sň“R‚+‹KRs‹<ó’ó‹ ň‹KRS€j!îAˆBPˆi5Zh’čo‚Öç@př2ŠAˆ!@riQ”ÉČdL˜0cŽƒ˙R–?1“^†: üSbj† ú űćŰ'P endstream endobj 1637 0 obj << /S /GoTo /D [ 1595 0 R /FitH 795 ] >> endobj 1638 0 obj << /Title (TouchPad Interfacing Guide Addendum: Multiple-Button Support Specificati\ on) /A 1637 0 R /First 25 0 R /Last 26 0 R /Parent 24 0 R /Count 10 >> endobj 1639 0 obj << /Type /Metadata /Subtype /XML /Length 1296 >> stream 2004-04-12T10:28:13-08:00 2004-04-12T10:30:07-08:00 Acrobat Distiller 5.0 (Windows) Acrobat PDFMaker 5.0 for Word Application Note / White Paper Style Guide 2004-04-12T18:28:13Z 2004-04-12T18:28:13Z 2004-04-12T10:30:07-08:00 Application Note / White Paper Style Guide Application Note / White Paper Style Guide endstream endobj xref 0 1640 0000001590 65535 f 0000000016 00000 n 0000000416 00000 n 0000000571 00000 n 0000000726 00000 n 0000000881 00000 n 0000001036 00000 n 0000001189 00000 n 0000010206 00000 n 0000010227 00000 n 0000010569 00000 n 0000019317 00000 n 0000019339 00000 n 0000019731 00000 n 0000019887 00000 n 0000020043 00000 n 0000020199 00000 n 0000027061 00000 n 0000027083 00000 n 0000027456 00000 n 0000030932 00000 n 0000030954 00000 n 0000031335 00000 n 0000032662 00000 n 0000032684 00000 n 0000032752 00000 n 0000032866 00000 n 0000033027 00000 n 0000033155 00000 n 0000033276 00000 n 0000033391 00000 n 0000033509 00000 n 0000033631 00000 n 0000033766 00000 n 0000033905 00000 n 0000034044 00000 n 0000034122 00000 n 0000034649 00000 n 0000034995 00000 n 0000035149 00000 n 0000035247 00000 n 0000035337 00000 n 0000035490 00000 n 0000035593 00000 n 0000035745 00000 n 0000035830 00000 n 0000035981 00000 n 0000036057 00000 n 0000036147 00000 n 0000036309 00000 n 0000036399 00000 n 0000036491 00000 n 0000036584 00000 n 0000036744 00000 n 0000036835 00000 n 0000036926 00000 n 0000037017 00000 n 0000037108 00000 n 0000037195 00000 n 0000037282 00000 n 0000037391 00000 n 0000037500 00000 n 0000037652 00000 n 0000037761 00000 n 0000037870 00000 n 0000037979 00000 n 0000038088 00000 n 0000038197 00000 n 0000038306 00000 n 0000038416 00000 n 0000038526 00000 n 0000038677 00000 n 0000038769 00000 n 0000038921 00000 n 0000039031 00000 n 0000039123 00000 n 0000039215 00000 n 0000039307 00000 n 0000039399 00000 n 0000039491 00000 n 0000039583 00000 n 0000039675 00000 n 0000039767 00000 n 0000039877 00000 n 0000039969 00000 n 0000040079 00000 n 0000040171 00000 n 0000040281 00000 n 0000040373 00000 n 0000040483 00000 n 0000040575 00000 n 0000040685 00000 n 0000040777 00000 n 0000040887 00000 n 0000040979 00000 n 0000041089 00000 n 0000041181 00000 n 0000041261 00000 n 0000041349 00000 n 0000041502 00000 n 0000041612 00000 n 0000041723 00000 n 0000041834 00000 n 0000041945 00000 n 0000042056 00000 n 0000042167 00000 n 0000042278 00000 n 0000042389 00000 n 0000042500 00000 n 0000042611 00000 n 0000042704 00000 n 0000042815 00000 n 0000042915 00000 n 0000043008 00000 n 0000043101 00000 n 0000043201 00000 n 0000043301 00000 n 0000043394 00000 n 0000043487 00000 n 0000043598 00000 n 0000043691 00000 n 0000043784 00000 n 0000043877 00000 n 0000043970 00000 n 0000044063 00000 n 0000044174 00000 n 0000044267 00000 n 0000044378 00000 n 0000044471 00000 n 0000044564 00000 n 0000044675 00000 n 0000044768 00000 n 0000044879 00000 n 0000044972 00000 n 0000045083 00000 n 0000045176 00000 n 0000045287 00000 n 0000045380 00000 n 0000045491 00000 n 0000045584 00000 n 0000045695 00000 n 0000045795 00000 n 0000045888 00000 n 0000045981 00000 n 0000046074 00000 n 0000046174 00000 n 0000046274 00000 n 0000046367 00000 n 0000046460 00000 n 0000046571 00000 n 0000046664 00000 n 0000046757 00000 n 0000046850 00000 n 0000046943 00000 n 0000047036 00000 n 0000047147 00000 n 0000047241 00000 n 0000047353 00000 n 0000047447 00000 n 0000047559 00000 n 0000047653 00000 n 0000047765 00000 n 0000047859 00000 n 0000047971 00000 n 0000048065 00000 n 0000048177 00000 n 0000048271 00000 n 0000048353 00000 n 0000048443 00000 n 0000048555 00000 n 0000048667 00000 n 0000048779 00000 n 0000048891 00000 n 0000049003 00000 n 0000049115 00000 n 0000049227 00000 n 0000049339 00000 n 0000049451 00000 n 0000049563 00000 n 0000049657 00000 n 0000049769 00000 n 0000049871 00000 n 0000049965 00000 n 0000050059 00000 n 0000050161 00000 n 0000050263 00000 n 0000050357 00000 n 0000050451 00000 n 0000050563 00000 n 0000050657 00000 n 0000050751 00000 n 0000050845 00000 n 0000050939 00000 n 0000051033 00000 n 0000051145 00000 n 0000051239 00000 n 0000051351 00000 n 0000051445 00000 n 0000051539 00000 n 0000051651 00000 n 0000051745 00000 n 0000051857 00000 n 0000051951 00000 n 0000052063 00000 n 0000052157 00000 n 0000052269 00000 n 0000052363 00000 n 0000052475 00000 n 0000052569 00000 n 0000052681 00000 n 0000052783 00000 n 0000052877 00000 n 0000052971 00000 n 0000053065 00000 n 0000053167 00000 n 0000053269 00000 n 0000053363 00000 n 0000053457 00000 n 0000053569 00000 n 0000053663 00000 n 0000053757 00000 n 0000053851 00000 n 0000053945 00000 n 0000054039 00000 n 0000054151 00000 n 0000054245 00000 n 0000054357 00000 n 0000054451 00000 n 0000054563 00000 n 0000054657 00000 n 0000054770 00000 n 0000054865 00000 n 0000054978 00000 n 0000055073 00000 n 0000055186 00000 n 0000055281 00000 n 0000055363 00000 n 0000055453 00000 n 0000055564 00000 n 0000055675 00000 n 0000055786 00000 n 0000055897 00000 n 0000056008 00000 n 0000056119 00000 n 0000056230 00000 n 0000056341 00000 n 0000056452 00000 n 0000056563 00000 n 0000056657 00000 n 0000056769 00000 n 0000056863 00000 n 0000056957 00000 n 0000057051 00000 n 0000057145 00000 n 0000057239 00000 n 0000057333 00000 n 0000057427 00000 n 0000057539 00000 n 0000057633 00000 n 0000057727 00000 n 0000057821 00000 n 0000057933 00000 n 0000058027 00000 n 0000058139 00000 n 0000058233 00000 n 0000058327 00000 n 0000058439 00000 n 0000058533 00000 n 0000058645 00000 n 0000058739 00000 n 0000058851 00000 n 0000058945 00000 n 0000059057 00000 n 0000059151 00000 n 0000059263 00000 n 0000059357 00000 n 0000059469 00000 n 0000059570 00000 n 0000059664 00000 n 0000059758 00000 n 0000059852 00000 n 0000059953 00000 n 0000060054 00000 n 0000060148 00000 n 0000060242 00000 n 0000060354 00000 n 0000060448 00000 n 0000060542 00000 n 0000060636 00000 n 0000060730 00000 n 0000060824 00000 n 0000060936 00000 n 0000061030 00000 n 0000061142 00000 n 0000061236 00000 n 0000061330 00000 n 0000061424 00000 n 0000061518 00000 n 0000061612 00000 n 0000061724 00000 n 0000061818 00000 n 0000061930 00000 n 0000062024 00000 n 0000062136 00000 n 0000062230 00000 n 0000062324 00000 n 0000062418 00000 n 0000062512 00000 n 0000062606 00000 n 0000062718 00000 n 0000062812 00000 n 0000062893 00000 n 0000062982 00000 n 0000063071 00000 n 0000063160 00000 n 0000063249 00000 n 0000063338 00000 n 0000063450 00000 n 0000063562 00000 n 0000063674 00000 n 0000063786 00000 n 0000063898 00000 n 0000064010 00000 n 0000064122 00000 n 0000064234 00000 n 0000064328 00000 n 0000064422 00000 n 0000064527 00000 n 0000064632 00000 n 0000064726 00000 n 0000064820 00000 n 0000064914 00000 n 0000065008 00000 n 0000065121 00000 n 0000065234 00000 n 0000065347 00000 n 0000065460 00000 n 0000065573 00000 n 0000065686 00000 n 0000065799 00000 n 0000065912 00000 n 0000066025 00000 n 0000066138 00000 n 0000066245 00000 n 0000066348 00000 n 0000066455 00000 n 0000066558 00000 n 0000066665 00000 n 0000066768 00000 n 0000066875 00000 n 0000066982 00000 n 0000067077 00000 n 0000067172 00000 n 0000067267 00000 n 0000067349 00000 n 0000067425 00000 n 0000067504 00000 n 0000067599 00000 n 0000067653 00000 n 0000067732 00000 n 0000067811 00000 n 0000067906 00000 n 0000067960 00000 n 0000068039 00000 n 0000068118 00000 n 0000068213 00000 n 0000068267 00000 n 0000068356 00000 n 0000068445 00000 n 0000068558 00000 n 0000068671 00000 n 0000068784 00000 n 0000068897 00000 n 0000069010 00000 n 0000069123 00000 n 0000069236 00000 n 0000069349 00000 n 0000069454 00000 n 0000069556 00000 n 0000069661 00000 n 0000069763 00000 n 0000069868 00000 n 0000069970 00000 n 0000070075 00000 n 0000070180 00000 n 0000070293 00000 n 0000070406 00000 n 0000070519 00000 n 0000070632 00000 n 0000070745 00000 n 0000070858 00000 n 0000070971 00000 n 0000071084 00000 n 0000071197 00000 n 0000071310 00000 n 0000071423 00000 n 0000071518 00000 n 0000071613 00000 n 0000071708 00000 n 0000071803 00000 n 0000071898 00000 n 0000071993 00000 n 0000072088 00000 n 0000072201 00000 n 0000072314 00000 n 0000072427 00000 n 0000072540 00000 n 0000072653 00000 n 0000072766 00000 n 0000072879 00000 n 0000072992 00000 n 0000073105 00000 n 0000073218 00000 n 0000073323 00000 n 0000073425 00000 n 0000073530 00000 n 0000073632 00000 n 0000073737 00000 n 0000073839 00000 n 0000073944 00000 n 0000074049 00000 n 0000074144 00000 n 0000074239 00000 n 0000074334 00000 n 0000074416 00000 n 0000074496 00000 n 0000074592 00000 n 0000074646 00000 n 0000074742 00000 n 0000074796 00000 n 0000074892 00000 n 0000074946 00000 n 0000075045 00000 n 0000075097 00000 n 0000075203 00000 n 0000075271 00000 n 0000075352 00000 n 0000075441 00000 n 0000075530 00000 n 0000075619 00000 n 0000075708 00000 n 0000075861 00000 n 0000075952 00000 n 0000076043 00000 n 0000076134 00000 n 0000076225 00000 n 0000076315 00000 n 0000076405 00000 n 0000076495 00000 n 0000076585 00000 n 0000076674 00000 n 0000076763 00000 n 0000076903 00000 n 0000076964 00000 n 0000077116 00000 n 0000077242 00000 n 0000077303 00000 n 0000077457 00000 n 0000077583 00000 n 0000077644 00000 n 0000077754 00000 n 0000077874 00000 n 0000077935 00000 n 0000078032 00000 n 0000078184 00000 n 0000078750 00000 n 0000078904 00000 n 0000079030 00000 n 0000079110 00000 n 0000079170 00000 n 0000079228 00000 n 0000079308 00000 n 0000079368 00000 n 0000079425 00000 n 0000079505 00000 n 0000079565 00000 n 0000079623 00000 n 0000079703 00000 n 0000079763 00000 n 0000079821 00000 n 0000079901 00000 n 0000079961 00000 n 0000080019 00000 n 0000080099 00000 n 0000080159 00000 n 0000080217 00000 n 0000080297 00000 n 0000080357 00000 n 0000080415 00000 n 0000080495 00000 n 0000080555 00000 n 0000080613 00000 n 0000080693 00000 n 0000080753 00000 n 0000080811 00000 n 0000080880 00000 n 0000080960 00000 n 0000081020 00000 n 0000081078 00000 n 0000081158 00000 n 0000081218 00000 n 0000081276 00000 n 0000081402 00000 n 0000081482 00000 n 0000081542 00000 n 0000081600 00000 n 0000081680 00000 n 0000081740 00000 n 0000081798 00000 n 0000081878 00000 n 0000081938 00000 n 0000081996 00000 n 0000082076 00000 n 0000082136 00000 n 0000082194 00000 n 0000082274 00000 n 0000082334 00000 n 0000082392 00000 n 0000082472 00000 n 0000082532 00000 n 0000082590 00000 n 0000082670 00000 n 0000082730 00000 n 0000082788 00000 n 0000082868 00000 n 0000082928 00000 n 0000082986 00000 n 0000083066 00000 n 0000083126 00000 n 0000083184 00000 n 0000083253 00000 n 0000083333 00000 n 0000083393 00000 n 0000083451 00000 n 0000083531 00000 n 0000083591 00000 n 0000083649 00000 n 0000083718 00000 n 0000083798 00000 n 0000083858 00000 n 0000083916 00000 n 0000083996 00000 n 0000084056 00000 n 0000084114 00000 n 0000084183 00000 n 0000084263 00000 n 0000084323 00000 n 0000084381 00000 n 0000084461 00000 n 0000084521 00000 n 0000084579 00000 n 0000084648 00000 n 0000084728 00000 n 0000084788 00000 n 0000084846 00000 n 0000084926 00000 n 0000084986 00000 n 0000085044 00000 n 0000085113 00000 n 0000085193 00000 n 0000085253 00000 n 0000085311 00000 n 0000085391 00000 n 0000085451 00000 n 0000085509 00000 n 0000085578 00000 n 0000085658 00000 n 0000085718 00000 n 0000085776 00000 n 0000085856 00000 n 0000085916 00000 n 0000085974 00000 n 0000086043 00000 n 0000086123 00000 n 0000086183 00000 n 0000086241 00000 n 0000086321 00000 n 0000086381 00000 n 0000086439 00000 n 0000086666 00000 n 0000086792 00000 n 0000086872 00000 n 0000086932 00000 n 0000086990 00000 n 0000087071 00000 n 0000087131 00000 n 0000087189 00000 n 0000087270 00000 n 0000087330 00000 n 0000087388 00000 n 0000087469 00000 n 0000087529 00000 n 0000087587 00000 n 0000087668 00000 n 0000087728 00000 n 0000087786 00000 n 0000087867 00000 n 0000087927 00000 n 0000087985 00000 n 0000088066 00000 n 0000088126 00000 n 0000088184 00000 n 0000088265 00000 n 0000088325 00000 n 0000088383 00000 n 0000088464 00000 n 0000088524 00000 n 0000088582 00000 n 0000088651 00000 n 0000088732 00000 n 0000088792 00000 n 0000088850 00000 n 0000088931 00000 n 0000088991 00000 n 0000089049 00000 n 0000089166 00000 n 0000089247 00000 n 0000089307 00000 n 0000089365 00000 n 0000089446 00000 n 0000089506 00000 n 0000089564 00000 n 0000089645 00000 n 0000089705 00000 n 0000089763 00000 n 0000089844 00000 n 0000089904 00000 n 0000089962 00000 n 0000090043 00000 n 0000090103 00000 n 0000090161 00000 n 0000090242 00000 n 0000090302 00000 n 0000090360 00000 n 0000090441 00000 n 0000090501 00000 n 0000090559 00000 n 0000090640 00000 n 0000090700 00000 n 0000090758 00000 n 0000090859 00000 n 0000090940 00000 n 0000091000 00000 n 0000091058 00000 n 0000091139 00000 n 0000091199 00000 n 0000091257 00000 n 0000091338 00000 n 0000091398 00000 n 0000091456 00000 n 0000091537 00000 n 0000091597 00000 n 0000091655 00000 n 0000091736 00000 n 0000091796 00000 n 0000091854 00000 n 0000091935 00000 n 0000091995 00000 n 0000092053 00000 n 0000092122 00000 n 0000092203 00000 n 0000092263 00000 n 0000092321 00000 n 0000092402 00000 n 0000092462 00000 n 0000092520 00000 n 0000092597 00000 n 0000092678 00000 n 0000092738 00000 n 0000092796 00000 n 0000092877 00000 n 0000092937 00000 n 0000092995 00000 n 0000093076 00000 n 0000093136 00000 n 0000093194 00000 n 0000093263 00000 n 0000093344 00000 n 0000093404 00000 n 0000093462 00000 n 0000093543 00000 n 0000093603 00000 n 0000093661 00000 n 0000093730 00000 n 0000093811 00000 n 0000093871 00000 n 0000093929 00000 n 0000094010 00000 n 0000094070 00000 n 0000094128 00000 n 0000094197 00000 n 0000094278 00000 n 0000094338 00000 n 0000094396 00000 n 0000094477 00000 n 0000094537 00000 n 0000094595 00000 n 0000094664 00000 n 0000094745 00000 n 0000094805 00000 n 0000094863 00000 n 0000094944 00000 n 0000095004 00000 n 0000095062 00000 n 0000095131 00000 n 0000095212 00000 n 0000095272 00000 n 0000095330 00000 n 0000095411 00000 n 0000095471 00000 n 0000095529 00000 n 0000095655 00000 n 0000095736 00000 n 0000095796 00000 n 0000095854 00000 n 0000095935 00000 n 0000095995 00000 n 0000096053 00000 n 0000096134 00000 n 0000096194 00000 n 0000096252 00000 n 0000096333 00000 n 0000096393 00000 n 0000096451 00000 n 0000096532 00000 n 0000096592 00000 n 0000096650 00000 n 0000096731 00000 n 0000096791 00000 n 0000096849 00000 n 0000096930 00000 n 0000096990 00000 n 0000097048 00000 n 0000097129 00000 n 0000097189 00000 n 0000097247 00000 n 0000097328 00000 n 0000097388 00000 n 0000097446 00000 n 0000097547 00000 n 0000097628 00000 n 0000097688 00000 n 0000097746 00000 n 0000097827 00000 n 0000097887 00000 n 0000097945 00000 n 0000098026 00000 n 0000098086 00000 n 0000098144 00000 n 0000098225 00000 n 0000098285 00000 n 0000098343 00000 n 0000098424 00000 n 0000098484 00000 n 0000098542 00000 n 0000098623 00000 n 0000098683 00000 n 0000098741 00000 n 0000098810 00000 n 0000098891 00000 n 0000098951 00000 n 0000099009 00000 n 0000099090 00000 n 0000099150 00000 n 0000099208 00000 n 0000099277 00000 n 0000099358 00000 n 0000099418 00000 n 0000099476 00000 n 0000099557 00000 n 0000099617 00000 n 0000099675 00000 n 0000099744 00000 n 0000099825 00000 n 0000099885 00000 n 0000099943 00000 n 0000100024 00000 n 0000100084 00000 n 0000100142 00000 n 0000100211 00000 n 0000100292 00000 n 0000100352 00000 n 0000100410 00000 n 0000100491 00000 n 0000100551 00000 n 0000100609 00000 n 0000100678 00000 n 0000100759 00000 n 0000100819 00000 n 0000100877 00000 n 0000100958 00000 n 0000101018 00000 n 0000101076 00000 n 0000101145 00000 n 0000101226 00000 n 0000101286 00000 n 0000101344 00000 n 0000101425 00000 n 0000101485 00000 n 0000101543 00000 n 0000101772 00000 n 0000101898 00000 n 0000101979 00000 n 0000102039 00000 n 0000102097 00000 n 0000102178 00000 n 0000102238 00000 n 0000102296 00000 n 0000102377 00000 n 0000102437 00000 n 0000102495 00000 n 0000102576 00000 n 0000102636 00000 n 0000102694 00000 n 0000102775 00000 n 0000102835 00000 n 0000102893 00000 n 0000102974 00000 n 0000103034 00000 n 0000103092 00000 n 0000103173 00000 n 0000103233 00000 n 0000103291 00000 n 0000103372 00000 n 0000103432 00000 n 0000103490 00000 n 0000103571 00000 n 0000103631 00000 n 0000103689 00000 n 0000103758 00000 n 0000103839 00000 n 0000103899 00000 n 0000103957 00000 n 0000104038 00000 n 0000104098 00000 n 0000104156 00000 n 0000104273 00000 n 0000104354 00000 n 0000104414 00000 n 0000104472 00000 n 0000104553 00000 n 0000104613 00000 n 0000104671 00000 n 0000104752 00000 n 0000104812 00000 n 0000104870 00000 n 0000104951 00000 n 0000105011 00000 n 0000105069 00000 n 0000105150 00000 n 0000105210 00000 n 0000105268 00000 n 0000105349 00000 n 0000105409 00000 n 0000105467 00000 n 0000105548 00000 n 0000105608 00000 n 0000105666 00000 n 0000105747 00000 n 0000105807 00000 n 0000105865 00000 n 0000105966 00000 n 0000106047 00000 n 0000106107 00000 n 0000106165 00000 n 0000106246 00000 n 0000106306 00000 n 0000106364 00000 n 0000106445 00000 n 0000106505 00000 n 0000106563 00000 n 0000106644 00000 n 0000106704 00000 n 0000106762 00000 n 0000106843 00000 n 0000106903 00000 n 0000106961 00000 n 0000107042 00000 n 0000107102 00000 n 0000107160 00000 n 0000107229 00000 n 0000107310 00000 n 0000107370 00000 n 0000107428 00000 n 0000107509 00000 n 0000107569 00000 n 0000107627 00000 n 0000107704 00000 n 0000107785 00000 n 0000107845 00000 n 0000107903 00000 n 0000107984 00000 n 0000108044 00000 n 0000108102 00000 n 0000108183 00000 n 0000108243 00000 n 0000108301 00000 n 0000108370 00000 n 0000108451 00000 n 0000108511 00000 n 0000108569 00000 n 0000108650 00000 n 0000108710 00000 n 0000108768 00000 n 0000108837 00000 n 0000108918 00000 n 0000108978 00000 n 0000109036 00000 n 0000109117 00000 n 0000109177 00000 n 0000109235 00000 n 0000109304 00000 n 0000109385 00000 n 0000109445 00000 n 0000109503 00000 n 0000109584 00000 n 0000109644 00000 n 0000109702 00000 n 0000109771 00000 n 0000109852 00000 n 0000109912 00000 n 0000109970 00000 n 0000110051 00000 n 0000110111 00000 n 0000110169 00000 n 0000110238 00000 n 0000110319 00000 n 0000110379 00000 n 0000110437 00000 n 0000110518 00000 n 0000110578 00000 n 0000110636 00000 n 0000110762 00000 n 0000110843 00000 n 0000110903 00000 n 0000110961 00000 n 0000111042 00000 n 0000111102 00000 n 0000111160 00000 n 0000111241 00000 n 0000111301 00000 n 0000111359 00000 n 0000111440 00000 n 0000111500 00000 n 0000111558 00000 n 0000111639 00000 n 0000111699 00000 n 0000111757 00000 n 0000111838 00000 n 0000111898 00000 n 0000111956 00000 n 0000112037 00000 n 0000112097 00000 n 0000112155 00000 n 0000112236 00000 n 0000112296 00000 n 0000112354 00000 n 0000112435 00000 n 0000112495 00000 n 0000112553 00000 n 0000112654 00000 n 0000112735 00000 n 0000112795 00000 n 0000112853 00000 n 0000112934 00000 n 0000112994 00000 n 0000113052 00000 n 0000113133 00000 n 0000113193 00000 n 0000113251 00000 n 0000113332 00000 n 0000113392 00000 n 0000113450 00000 n 0000113531 00000 n 0000113591 00000 n 0000113649 00000 n 0000113730 00000 n 0000113790 00000 n 0000113848 00000 n 0000113917 00000 n 0000113998 00000 n 0000114058 00000 n 0000114116 00000 n 0000114197 00000 n 0000114257 00000 n 0000114315 00000 n 0000114384 00000 n 0000114465 00000 n 0000114525 00000 n 0000114583 00000 n 0000114664 00000 n 0000114724 00000 n 0000114782 00000 n 0000114851 00000 n 0000114932 00000 n 0000114992 00000 n 0000115050 00000 n 0000115131 00000 n 0000115191 00000 n 0000115249 00000 n 0000115320 00000 n 0000115404 00000 n 0000115465 00000 n 0000115524 00000 n 0000115608 00000 n 0000115669 00000 n 0000115728 00000 n 0000115800 00000 n 0000115885 00000 n 0000115946 00000 n 0000116005 00000 n 0000116090 00000 n 0000116151 00000 n 0000116210 00000 n 0000116282 00000 n 0000116367 00000 n 0000116428 00000 n 0000116487 00000 n 0000116572 00000 n 0000116633 00000 n 0000116692 00000 n 0000116939 00000 n 0000117076 00000 n 0000117161 00000 n 0000117222 00000 n 0000117281 00000 n 0000117366 00000 n 0000117427 00000 n 0000117486 00000 n 0000117571 00000 n 0000117632 00000 n 0000117691 00000 n 0000117776 00000 n 0000117837 00000 n 0000117896 00000 n 0000117981 00000 n 0000118042 00000 n 0000118101 00000 n 0000118186 00000 n 0000118247 00000 n 0000118306 00000 n 0000118391 00000 n 0000118452 00000 n 0000118511 00000 n 0000118596 00000 n 0000118657 00000 n 0000118716 00000 n 0000118801 00000 n 0000118862 00000 n 0000118921 00000 n 0000118994 00000 n 0000119079 00000 n 0000119140 00000 n 0000119199 00000 n 0000119284 00000 n 0000119345 00000 n 0000119404 00000 n 0000119532 00000 n 0000119617 00000 n 0000119678 00000 n 0000119737 00000 n 0000119822 00000 n 0000119883 00000 n 0000119942 00000 n 0000120027 00000 n 0000120088 00000 n 0000120147 00000 n 0000120232 00000 n 0000120293 00000 n 0000120352 00000 n 0000120437 00000 n 0000120498 00000 n 0000120557 00000 n 0000120642 00000 n 0000120703 00000 n 0000120762 00000 n 0000120847 00000 n 0000120908 00000 n 0000120967 00000 n 0000121052 00000 n 0000121113 00000 n 0000121172 00000 n 0000121263 00000 n 0000121348 00000 n 0000121409 00000 n 0000121468 00000 n 0000121553 00000 n 0000121614 00000 n 0000121673 00000 n 0000121758 00000 n 0000121819 00000 n 0000121878 00000 n 0000121963 00000 n 0000122024 00000 n 0000122083 00000 n 0000122156 00000 n 0000122241 00000 n 0000122302 00000 n 0000122361 00000 n 0000122446 00000 n 0000122507 00000 n 0000122566 00000 n 0000122648 00000 n 0000122733 00000 n 0000122794 00000 n 0000122853 00000 n 0000122938 00000 n 0000122999 00000 n 0000123058 00000 n 0000123143 00000 n 0000123204 00000 n 0000123263 00000 n 0000123336 00000 n 0000123421 00000 n 0000123482 00000 n 0000123541 00000 n 0000123626 00000 n 0000123687 00000 n 0000123746 00000 n 0000123819 00000 n 0000123904 00000 n 0000123965 00000 n 0000124024 00000 n 0000124109 00000 n 0000124170 00000 n 0000124229 00000 n 0000124302 00000 n 0000124387 00000 n 0000124448 00000 n 0000124507 00000 n 0000124592 00000 n 0000124653 00000 n 0000124712 00000 n 0000124785 00000 n 0000124870 00000 n 0000124931 00000 n 0000124990 00000 n 0000125075 00000 n 0000125136 00000 n 0000125195 00000 n 0000125268 00000 n 0000125353 00000 n 0000125414 00000 n 0000125473 00000 n 0000125558 00000 n 0000125619 00000 n 0000125678 00000 n 0000125815 00000 n 0000125900 00000 n 0000125961 00000 n 0000126020 00000 n 0000126105 00000 n 0000126166 00000 n 0000126225 00000 n 0000126310 00000 n 0000126371 00000 n 0000126430 00000 n 0000126515 00000 n 0000126576 00000 n 0000126635 00000 n 0000126720 00000 n 0000126781 00000 n 0000126840 00000 n 0000126925 00000 n 0000126986 00000 n 0000127045 00000 n 0000127130 00000 n 0000127191 00000 n 0000127250 00000 n 0000127335 00000 n 0000127396 00000 n 0000127455 00000 n 0000127540 00000 n 0000127601 00000 n 0000127660 00000 n 0000127769 00000 n 0000127854 00000 n 0000127915 00000 n 0000127974 00000 n 0000128059 00000 n 0000128120 00000 n 0000128179 00000 n 0000128264 00000 n 0000128325 00000 n 0000128384 00000 n 0000128469 00000 n 0000128530 00000 n 0000128589 00000 n 0000128674 00000 n 0000128735 00000 n 0000128794 00000 n 0000128879 00000 n 0000128940 00000 n 0000128999 00000 n 0000129072 00000 n 0000129157 00000 n 0000129218 00000 n 0000129277 00000 n 0000129362 00000 n 0000129423 00000 n 0000129482 00000 n 0000129591 00000 n 0000129676 00000 n 0000129737 00000 n 0000129796 00000 n 0000129881 00000 n 0000129942 00000 n 0000130001 00000 n 0000130086 00000 n 0000130147 00000 n 0000130206 00000 n 0000130291 00000 n 0000130352 00000 n 0000130411 00000 n 0000130496 00000 n 0000130557 00000 n 0000130616 00000 n 0000130701 00000 n 0000130762 00000 n 0000130821 00000 n 0000130894 00000 n 0000130979 00000 n 0000131040 00000 n 0000131099 00000 n 0000131184 00000 n 0000131245 00000 n 0000131304 00000 n 0000131377 00000 n 0000131462 00000 n 0000131523 00000 n 0000131582 00000 n 0000131667 00000 n 0000131728 00000 n 0000131787 00000 n 0000131896 00000 n 0000131981 00000 n 0000132042 00000 n 0000132101 00000 n 0000132186 00000 n 0000132247 00000 n 0000132306 00000 n 0000132391 00000 n 0000132452 00000 n 0000132511 00000 n 0000132596 00000 n 0000132657 00000 n 0000132716 00000 n 0000132801 00000 n 0000132862 00000 n 0000132921 00000 n 0000133006 00000 n 0000133067 00000 n 0000133126 00000 n 0000133199 00000 n 0000133284 00000 n 0000133345 00000 n 0000133404 00000 n 0000133489 00000 n 0000133550 00000 n 0000133609 00000 n 0000133746 00000 n 0000133874 00000 n 0000133959 00000 n 0000134020 00000 n 0000134078 00000 n 0000134163 00000 n 0000134224 00000 n 0000134282 00000 n 0000134367 00000 n 0000134428 00000 n 0000134486 00000 n 0000134571 00000 n 0000134632 00000 n 0000134690 00000 n 0000134775 00000 n 0000134836 00000 n 0000134894 00000 n 0000134979 00000 n 0000135040 00000 n 0000135098 00000 n 0000135183 00000 n 0000135244 00000 n 0000135302 00000 n 0000135387 00000 n 0000135448 00000 n 0000135506 00000 n 0000135579 00000 n 0000135664 00000 n 0000135725 00000 n 0000135784 00000 n 0000135869 00000 n 0000135930 00000 n 0000135989 00000 n 0000136098 00000 n 0000136183 00000 n 0000136244 00000 n 0000136303 00000 n 0000136388 00000 n 0000136449 00000 n 0000136508 00000 n 0000136593 00000 n 0000136654 00000 n 0000136713 00000 n 0000136798 00000 n 0000136859 00000 n 0000136918 00000 n 0000137003 00000 n 0000137064 00000 n 0000137123 00000 n 0000137208 00000 n 0000137269 00000 n 0000137328 00000 n 0000137401 00000 n 0000137486 00000 n 0000137547 00000 n 0000137606 00000 n 0000137691 00000 n 0000137752 00000 n 0000137811 00000 n 0000137939 00000 n 0000138024 00000 n 0000138085 00000 n 0000138143 00000 n 0000138228 00000 n 0000138289 00000 n 0000138347 00000 n 0000138432 00000 n 0000138493 00000 n 0000138551 00000 n 0000138636 00000 n 0000138697 00000 n 0000138755 00000 n 0000138840 00000 n 0000138901 00000 n 0000138959 00000 n 0000139044 00000 n 0000139105 00000 n 0000139163 00000 n 0000139248 00000 n 0000139309 00000 n 0000139367 00000 n 0000139452 00000 n 0000139513 00000 n 0000139571 00000 n 0000139699 00000 n 0000139784 00000 n 0000139845 00000 n 0000139904 00000 n 0000139989 00000 n 0000140050 00000 n 0000140109 00000 n 0000140194 00000 n 0000140255 00000 n 0000140314 00000 n 0000140399 00000 n 0000140460 00000 n 0000140519 00000 n 0000140604 00000 n 0000140665 00000 n 0000140724 00000 n 0000140809 00000 n 0000140870 00000 n 0000140929 00000 n 0000141014 00000 n 0000141075 00000 n 0000141134 00000 n 0000141219 00000 n 0000141280 00000 n 0000141339 00000 n 0000141421 00000 n 0000141506 00000 n 0000141567 00000 n 0000141626 00000 n 0000141711 00000 n 0000141772 00000 n 0000141831 00000 n 0000141916 00000 n 0000141977 00000 n 0000142036 00000 n 0000142201 00000 n 0000142329 00000 n 0000142414 00000 n 0000142475 00000 n 0000142533 00000 n 0000142618 00000 n 0000142679 00000 n 0000142737 00000 n 0000142822 00000 n 0000142883 00000 n 0000142941 00000 n 0000143026 00000 n 0000143087 00000 n 0000143145 00000 n 0000143230 00000 n 0000143291 00000 n 0000143349 00000 n 0000143434 00000 n 0000143495 00000 n 0000143553 00000 n 0000143638 00000 n 0000143699 00000 n 0000143757 00000 n 0000143842 00000 n 0000143903 00000 n 0000143961 00000 n 0000144089 00000 n 0000144174 00000 n 0000144235 00000 n 0000144294 00000 n 0000144379 00000 n 0000144440 00000 n 0000144499 00000 n 0000144584 00000 n 0000144645 00000 n 0000144704 00000 n 0000144789 00000 n 0000144850 00000 n 0000144909 00000 n 0000144994 00000 n 0000145055 00000 n 0000145114 00000 n 0000145199 00000 n 0000145260 00000 n 0000145319 00000 n 0000145404 00000 n 0000145465 00000 n 0000145524 00000 n 0000145609 00000 n 0000145670 00000 n 0000145729 00000 n 0000145811 00000 n 0000145896 00000 n 0000145957 00000 n 0000146016 00000 n 0000146101 00000 n 0000146162 00000 n 0000146221 00000 n 0000146306 00000 n 0000146367 00000 n 0000146426 00000 n 0000146554 00000 n 0000146639 00000 n 0000146700 00000 n 0000146758 00000 n 0000146843 00000 n 0000146904 00000 n 0000146962 00000 n 0000147047 00000 n 0000147108 00000 n 0000147166 00000 n 0000147251 00000 n 0000147312 00000 n 0000147370 00000 n 0000147455 00000 n 0000147516 00000 n 0000147574 00000 n 0000147659 00000 n 0000147720 00000 n 0000147778 00000 n 0000147863 00000 n 0000147924 00000 n 0000147982 00000 n 0000148067 00000 n 0000148128 00000 n 0000148186 00000 n 0000148259 00000 n 0000148344 00000 n 0000148405 00000 n 0000148464 00000 n 0000148549 00000 n 0000148610 00000 n 0000148669 00000 n 0000148769 00000 n 0000148854 00000 n 0000148915 00000 n 0000148974 00000 n 0000149059 00000 n 0000149120 00000 n 0000149179 00000 n 0000149264 00000 n 0000149325 00000 n 0000149384 00000 n 0000149469 00000 n 0000149530 00000 n 0000149589 00000 n 0000149674 00000 n 0000149735 00000 n 0000149794 00000 n 0000149867 00000 n 0000149952 00000 n 0000150013 00000 n 0000150072 00000 n 0000150157 00000 n 0000150218 00000 n 0000150277 00000 n 0000150405 00000 n 0000150490 00000 n 0000150551 00000 n 0000150609 00000 n 0000150694 00000 n 0000150755 00000 n 0000150813 00000 n 0000150898 00000 n 0000150959 00000 n 0000151017 00000 n 0000151102 00000 n 0000151163 00000 n 0000151221 00000 n 0000151306 00000 n 0000151367 00000 n 0000151425 00000 n 0000151510 00000 n 0000151571 00000 n 0000151629 00000 n 0000151714 00000 n 0000151775 00000 n 0000151833 00000 n 0000151918 00000 n 0000151979 00000 n 0000152037 00000 n 0000152165 00000 n 0000152250 00000 n 0000152311 00000 n 0000152370 00000 n 0000152455 00000 n 0000152516 00000 n 0000152575 00000 n 0000152660 00000 n 0000152721 00000 n 0000152780 00000 n 0000152865 00000 n 0000152926 00000 n 0000152985 00000 n 0000153070 00000 n 0000153131 00000 n 0000153190 00000 n 0000153275 00000 n 0000153336 00000 n 0000153395 00000 n 0000153480 00000 n 0000153541 00000 n 0000153600 00000 n 0000153685 00000 n 0000153746 00000 n 0000153805 00000 n 0000153887 00000 n 0000153972 00000 n 0000154033 00000 n 0000154092 00000 n 0000154177 00000 n 0000154238 00000 n 0000154297 00000 n 0000154382 00000 n 0000154443 00000 n 0000154502 00000 n 0000154594 00000 n 0000154654 00000 n 0000154767 00000 n 0000154828 00000 n 0000154887 00000 n 0000154947 00000 n 0000155032 00000 n 0000155093 00000 n 0000155152 00000 n 0000155223 00000 n 0000155281 00000 n 0000155339 00000 n 0000155428 00000 n 0000155487 00000 n 0000155546 00000 n 0000155605 00000 n 0000155664 00000 n 0000155768 00000 n 0000155898 00000 n 0000155954 00000 n 0000157465 00000 n 0000158610 00000 n 0000159438 00000 n 0000159575 00000 n 0000159672 00000 n 0000159757 00000 n 0000159898 00000 n 0000160041 00000 n 0000160184 00000 n 0000160327 00000 n 0000160468 00000 n 0000160618 00000 n 0000160770 00000 n 0000160803 00000 n 0000160851 00000 n 0000001592 00001 f 0000161091 00000 n 0000001635 00001 f 0000161194 00000 n 0000161555 00000 n 0000161695 00000 n 0000162177 00000 n 0000162415 00000 n 0000162858 00000 n 0000163105 00000 n 0000163713 00000 n 0000163945 00000 n 0000164584 00000 n 0000164810 00000 n 0000165278 00000 n 0000165309 00000 n 0000165352 00000 n 0000165375 00000 n 0000166201 00000 n 0000166224 00000 n 0000166915 00000 n 0000167226 00000 n 0000167385 00000 n 0000167408 00000 n 0000168146 00000 n 0000168169 00000 n 0000168811 00000 n 0000168834 00000 n 0000169509 00000 n 0000169532 00000 n 0000170223 00000 n 0000170246 00000 n 0000170899 00000 n 0000245768 00000 n 0000245791 00000 n 0000246514 00000 n 0000274338 00000 n 0000274418 00000 n 0000274659 00000 n 0000274867 00000 n 0000314283 00000 n 0000327739 00000 n 0000334529 00000 n 0000355545 00000 n 0000355754 00000 n 0000001636 00001 f 0000000000 00001 f 0000356139 00000 n 0000356202 00000 n 0000356383 00000 n trailer << /Size 1640 /Info 1589 0 R /Root 1593 0 R /ID[<8e51ef209f5a9d0dfc35c49c5425dfe0>] >> startxref 357766 %%EOF 1589 0 obj << /Producer (Acrobat Distiller 5.0 \(Windows\)) /Creator (Acrobat PDFMaker 5.0 for Word) /ModDate (D:20040412103129-08'00') /Title (TouchPad Interfacing Guide Addendum: Multiple-Button Support Specificati\ on) /CreationDate (D:20040412102813-08'00') /Subject (TouchPad ) /Author (Synaptics) /Keywords (P/N 511-000024-01 Rev. A) >> endobj 1590 1 obj << /Type /Metadata /Subtype /XML /Length 1460 >> stream 2004-04-12T10:28:13-08:00 2004-04-12T10:31:29-08:00 Acrobat Distiller 5.0 (Windows) Acrobat PDFMaker 5.0 for Word TouchPad Interfacing Guide Addendum: Multiple-Button Support Specification TouchPad Synaptics P/N 511-000024-01 Rev. A 2004-04-12T18:28:13Z 2004-04-12T18:28:13Z 2004-04-12T10:31:29-08:00 Application Note / White Paper Style Guide Application Note / White Paper Style Guide endstream endobj 1593 0 obj << /Type /Catalog /Pages 1591 0 R /Metadata 1590 1 R /Outlines 24 0 R /MarkInfo << /Marked true /LetterspaceFlags 0 >> /PageMode /UseNone /PageLabels 1588 0 R /StructTreeRoot 1594 0 R /PieceInfo << /MarkedPDF << /LastModified (D:20040412102826)>> >> /LastModified (D:20040412102826) >> endobj xref 0 1 0000001592 65535 f 1589 2 0000390733 00000 n 0000391085 00001 n 1593 1 0000392632 00000 n trailer << /Size 1640 /Info 1589 0 R /Root 1593 0 R /Prev 357766 /ID[<775ea800c2fd14356bbde5ba9d220ec3>] >> startxref 392947 %%EOF gpm-1.20.4/doc/specs/synaptics/www.synaptics.com/decaf/utilities/ACF126.pdf010060000017500001750000017060001077613005100251260ustar00niconico00%PDF-1.2 %âăĎÓ 763 0 obj << /Linearized 1 /O 765 /H [ 1435 1181 ] /L 494555 /E 15256 /N 91 /T 479176 >> endobj xref 763 45 0000000016 00000 n 0000001251 00000 n 0000002616 00000 n 0000002895 00000 n 0000003041 00000 n 0000003188 00000 n 0000003335 00000 n 0000003482 00000 n 0000003629 00000 n 0000003775 00000 n 0000003994 00000 n 0000004181 00000 n 0000004644 00000 n 0000004833 00000 n 0000005528 00000 n 0000005715 00000 n 0000006096 00000 n 0000006284 00000 n 0000006397 00000 n 0000006781 00000 n 0000006962 00000 n 0000006984 00000 n 0000007713 00000 n 0000007735 00000 n 0000008465 00000 n 0000009037 00000 n 0000009232 00000 n 0000009254 00000 n 0000009930 00000 n 0000010523 00000 n 0000010720 00000 n 0000010742 00000 n 0000011531 00000 n 0000011553 00000 n 0000012274 00000 n 0000012672 00000 n 0000012873 00000 n 0000012895 00000 n 0000013563 00000 n 0000013585 00000 n 0000014140 00000 n 0000014162 00000 n 0000014642 00000 n 0000001435 00000 n 0000002593 00000 n trailer << /Size 808 /Info 751 0 R /Root 764 0 R /Prev 479165 /ID[<365a89889ff20675953961862f695481><365a89889ff20675953961862f695481>] >> startxref 0 %%EOF 764 0 obj << /Type /Catalog /Pages 753 0 R /Outlines 666 0 R /OpenAction [ 765 0 R /XYZ null null null ] /PageMode /UseNone /PageLabels << /Nums [ 0 << /S /D >> ] >> >> endobj 806 0 obj << /S 1747 /O 1849 /Filter /FlateDecode /Length 807 0 R >> stream H‰ĚTklZe~9Ľ-öœś°&Űvl“nĄÉ!PĄťŔDYŤ˝ YĹRťn™q ]Ť™ŁľY똁dŇní.ŠÓQšŒC¤6Ěő"ôâŇjbŠüÔą3ő;çŔ9tŐ˙~áŔó˝ç}ŸďyŢ÷ PPč‡"Š@ÜB!ŠňAŕo–É `Ÿ¸WW%ë-SôŠI ŹĘ­ăżRȗ̀ř Üťđ^žŘ đŽöWń˘âŠłŞ1Łüës5đ…đĆÔňĐ ľěŻă/ďŐnŞî–ÍŤOˇŐT6ž<đ(­|Ô4űLݟ-–Ă'÷ýęl‰P9:RxČúřüŇô Č°Ű˙jËŔGO5F^#š”éßť/‹nďřm׋g¤?5ZůŠáĹYý˝_&ß\žÚžüăć qUŐô•ÍÖ/őKcűű+ďÇ0Fżjé_=rJvĺTrâš÷ĺ“Çr˝ör{.:máq§ůČJpĎŰŤSÁëŽŐ• Ëlö^7Hn"´;-GgÂvsŰlđ´ :-Mż6É$~ôBZ“)Ż—\ ĐŰډ´&” “;;}"yŞY1uŃÜçŃĆÚő6ŕÁBCĺN{Ď5*_ęd4Ţ`őgľ­#mŽ?>=´ÖIŸŘ†ź#‘ť+á]Íňa×řjŕ–\şă’ćŚó/Íg›“+aćua•óĹM|NŐoŽeFđĄ‘<ݍ” sŻiSr*Á }iĄžˇŰîp$ŹÓ-3Íwô,1áĎüßrăŰvr%\׍ÔŰĹ^Q:Á4‘ŚÇm6Ąq‡ÎŤbiúşĘV7ő+@N!^5%(Č7@.ŠŐQ~_ACuRďuîl=dŞ€ Ňô ?MU É’Ňœ8N(ćURQP˛ZW˛j€ 4Ňu€œF^Íâź0VC˰ą2l,$”j7+Œţ˘ęX݌•Ź Ž%Œ6wíž9Ą€SŸŻ‡ 3PMg㎛ćËKlEÔŃź ‚kčW×U&ŠłŃm0[†ř”š˙ű?9ß!°=$’B™XüNńw§ŠOô›’ćŰ%o–4ż^Ňa‘>,Ř Ńěƒ'?ż Ř߀Mďp‡{0 đž-8ŠPlD/•ô@va>(ŽŽ#Đ °×űÎős› endstream endobj 807 0 obj 1062 endobj 765 0 obj << /Type /Page /Parent 752 0 R /Resources 772 0 R /Contents [ 784 0 R 786 0 R 790 0 R 794 0 R 796 0 R 800 0 R 802 0 R 804 0 R ] /Annots [ 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 766 0 obj << /Dest [ 91 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 480 408 488 422 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 767 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 329 336 343 350 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 768 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 265 300 279 314 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 769 0 obj << /Dest [ 428 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 491 278 505 292 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 770 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 479 110 493 124 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 771 0 obj << /Dest [ 501 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 222 88 236 102 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 772 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT6 781 0 R /TT8 787 0 R /TT10 791 0 R /TT12 797 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 773 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -628 -376 2034 1048 ] /FontName /Arial,Bold /ItalicAngle 0 /StemV 133 >> endobj 774 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 278 0 556 556 556 556 556 556 556 0 0 333 0 0 0 0 0 0 722 722 722 722 667 611 778 722 278 0 0 0 833 0 778 667 0 722 667 611 0 0 0 0 0 0 0 0 0 0 0 0 556 611 556 611 556 333 611 611 278 0 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 ] /Encoding /WinAnsiEncoding /BaseFont /Arial,Bold /FontDescriptor 773 0 R >> endobj 775 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 96 /FontBBox [ -517 -325 1082 1025 ] /FontName /Arial,Italic /ItalicAngle -15 /StemV 0 >> endobj 776 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 190 /Widths [ 250 0 0 500 500 833 778 0 333 333 0 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 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 0 0 0 0 0 0 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 0 0 0 541 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 333 333 444 444 0 500 1000 0 980 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 760 0 400 0 0 0 0 0 0 0 0 0 0 0 750 0 750 ] /Encoding /WinAnsiEncoding /BaseFont /TimesNewRoman /FontDescriptor 779 0 R >> endobj 777 0 obj << /Type /Encoding /Differences [ 1 /copyrightserif /bullet /space /Delta /plusminus /greaterequal /degree /multiply /Omega /mu /minus /lessequal /arrowhorizex ] >> endobj 778 0 obj << /Filter /FlateDecode /Length 306 >> stream H‰T‘Ënƒ0E÷|Ĺ,Suí$$‘‹&”E*M÷Ć"¤`!‹ü}} ÔWă3ă;éţt8šf¤ôÓwŚä‘ęĆYĎCwó†ŠâKăH*˛çSTÓęžŇĐ\އ‘Ű“Ť;Ęó$ý ÉaôwZ”÷śęŽĎâ‰ŇoŮ7îB‹oyţ  źőý•[v# * ˛\'éţM÷ďşĺž[#—ó…ĺĄ×†˝vŚ\Č"ˆ-ˆýŸKärjŠęé<×BŽŮaW  J(°ˆ"”X!†(%2€5@ń"2ÄYŹČÖ€ÍTglG‡ Ŕ1DI‡j=ľÄâ*•ńÇ €™nYŘůÝůqű††ç˙˝N`-#ÍÍűŕqÜ]´†6ŽëíťţáK~řʓ6 endstream endobj 779 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 34 /FontBBox [ -568 -307 2028 1007 ] /FontName /TimesNewRoman /ItalicAngle 0 /StemV 0 >> endobj 780 0 obj << /Type /Font /Subtype /Type1 /Encoding 777 0 R /BaseFont /Symbol /ToUnicode 778 0 R >> endobj 781 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 116 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 556 556 0 0 0 556 0 0 556 0 0 0 0 0 0 0 0 667 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 556 556 0 0 0 222 0 0 0 0 556 556 0 0 0 0 278 ] /Encoding /WinAnsiEncoding /BaseFont /Arial,Italic /FontDescriptor 775 0 R >> endobj 782 0 obj [ /CalRGB << /WhitePoint [ 0.9505 1 1.089 ] /Gamma [ 2.22221 2.22221 2.22221 ] /Matrix [ 0.4124 0.2126 0.0193 0.3576 0.71519 0.1192 0.1805 0.0722 0.9505 ] >> ] endobj 783 0 obj 649 endobj 784 0 obj << /Filter /FlateDecode /Length 783 0 R >> stream H‰„TKOÜ0VŻţs´Ť×ď7 Tß*Q6,ŠÔ]”]@üűŽc'phŠVňŽíń<žď›œ%˛NI„tO¤ä1FřŤf\h­@ ~“őůÁBw˜ź:˛žź•°=t2BꈀôB~Ňóý#k—ô•) GGfpX#×tËrúŔňzv—ŽÉúk­ÄpÁӗŞ#ôKżŢŐ)¸ĺşÉI…ž’V+g…ĽÜb*Ă旑{şŤ™[Ö8néăqč+ȇôŠ)őÎŁăPÎqUQP+EƒŃEĐŔii*;Čŕ˝iˇ,‡ď™Ć¨XáÔĘE" !p5XĹ­P`´áÁŔş˝‚ą'÷älbŔT<ÂlĄ Ú3.JnL0™ąŔŒu 6Šç<4Š›°ŕ"Ռ‹6—ŰW°˝ŇŚA $wIŇXţą~Äs/öĺâŠ{(Ć Ă°‘ś›˛…Ť]}ُ÷m7ÔÝśŢ^>c¨î}Ľ8%W{5ŘWĽ×j+ëyˆ›UŚ627[H–s3Ś’üF ‹VHљđӒ ˝â•űňĘMrʑXfTúnżŰ ‡šÂĹfŔ@†űÝRôGÄz˝ ňoôt‰zzUÍ啳ÜŘóŤâűA‘SoˆřEöžÜءÇ~s‚L˘ &ńj'¨â"‹Ő Ażľc÷€(Ż@˘ś*J i—iŤÓűŁˆŔ CNj*DzsŹëIEU¤qÝ=ľ#k|žuVyEɐ>cź›qŘĺârU6”Ńňöă0J­Ę(Ď,˜KgFÉx´;÷†Sý<(mŤr$‡ďĎHs ýXţńŁdPüý´yÁŠ|ťű#ŔźöŢ endstream endobj 785 0 obj 650 endobj 786 0 obj << /Filter /FlateDecode /Length 785 0 R >> stream H‰\TËrœ0ŹJnűsDŠ#Ř]CΊrJ•šĹ9ČBR€(!źńß§ő`cťö°zôôôôŒ j~ NMwŕ<Ťëšrüâ˛Îłź, :ËŒŸŞ’šéâ,çXĘĂžş~%M?°´ĚÎÉĘŇ"ă =ł*ťO6–ňŹLâ]vŠZw8É \˜xR+őúĘŇÚQH=…ăełaĄĚJbnIÇ}Ż đ;—}Ż rÎ!éÎňuB*ŠG:ömż‹|ĎD݌ťRfąDˆšűÚWjô&űŸ,u`ŃfDě7ŒmžŻňÓî•[ŻuƒY-­JÚAĎŃžŕ,łüxR,˝d°[ CŃPyňĚjÜ(œ#Έq„ŢËW}dČ~‚ łˇv˜CéE–ŢăFřx{ť™œ.bŽÔ)aˇˆtű÷%ˇ’ŠPš`‘Ę*#|Eˆp}Z\cћ“ëBîĘ–=ÖÝMHá…\u¤ë`{šÄěĽÎú:Ťę‡Őj3HW+”4k Š#nZ„ …ŹÇV ů űr“} ˛_0PN­ä|FËů =őy˝hĐ_źÂ"Yě C›`ë­#^ą‹]ŒZ}Ţ*‹’HĎęH1 łń˜<(ú¸ˆg…ÓGdć„ÁŤ`čˇ8#ՈŔîuÜD‰Ô‰i˝ŮŐ@ëś,ÚXźzyWŠ”őÓRůi,F[-ő¸R§MPˆ8mó E}˝˙őňsĐëđC€> endobj 788 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 34 /FontBBox [ -558 -307 2034 1026 ] /FontName /TimesNewRoman,Bold /ItalicAngle 0 /StemV 133 >> endobj 789 0 obj 596 endobj 790 0 obj << /Filter /FlateDecode /Length 789 0 R >> stream H‰ŹTMoÔ0•ŕśżbŽśDÜ؎7鹨B ąšQnâ6ě:Z;­řđƒlvUőŔ“?2Ďó潙lH; íÍUŰ6ŔĄ}ŘpÖp(Ą˝Ý%+yŮ@Űmž‘/;ZđŠŐä WIýŢ~ (qB]WgTYVuÚ=#ćŁőśłŒ> endobj 792 0 obj << /Type /FontDescriptor /Ascent 891 /CapHeight 0 /Descent -216 /Flags 98 /FontBBox [ -498 -307 1120 1023 ] /FontName /TimesNewRoman,Italic /ItalicAngle -15 /StemV 0 >> endobj 793 0 obj 709 endobj 794 0 obj << /Filter /FlateDecode /Length 793 0 R >> stream H‰”TËnŰ0źç+öH#Jň#ÇA Ŕşľ=Đ]ąEƒ¤íäďťKŇN‚öҋŔÇîpggGýˇ›*)äúǛďl>îˇĆƒŰAďŽz|VŻd-VŹ ĂŤÓvg5˜—tźfŃĚÁş9€~´řODźë{Yƒ„~w#ď…ě &pühúœoŘף ďSd“ѕ¸Şu]ˇ)şŹÎX &hoˇ&@ ž9=ţqFŠaňŰŮËl°†Íę­âĎéל–×i,{r!Ä#áů§L@W4ň )Dł™z˙„cƒˇčmŽüúv1×ŠüÂŰ4Ř#üĂ8ć.ÄtHŁyNvôdą? |dlV endstream endobj 795 0 obj 641 endobj 796 0 obj << /Filter /FlateDecode /Length 795 0 R >> stream H‰tTMoœ0˝ďݘŁ-Ç6ßÇJ‘˘TŞi‘zČöŕ€7¸%€0ŮmţTcÇ6˒D˝ŕĎ{Ěźy6@őmÇ!L¤PÝî8㜗PŐťčžw¤Ó4a99…ĽcűáHcV’™"6&gĺw&˙-dACŁ’ ň:Œ:$YĘqÎŚëŕiAź ďL?ëO´vůś°cĚí ?ą››Ş*@@uÜɘńřĽ/ťžxč¨^kš!Aű@EŒŤj.hĐ ‹ËěpČ^ýڐs&Ó°í•…'_"÷‡Űɜ°×¨ đő–äţ^n‚ꉋč_@œ´ć™şV[”šŁ‘'ŠbÉŇëŕÇZ/.ƒ;éÎ 9rRk”KÍđÝÔÓŕ Ňdd8ÎđĂĺŤo†łő*ËK射2/X–ć),BŕZ˝‘ź¸äŻSJV–ĽG-Ą,‡!3\Súv ĆąŁQâJIH­ć5z ľęáŐb#ţƒ+5ö/ŠJň[ƒë zR=Fn7l>kŽ <ąPt°O$2&ĺGaÓUŘ4ThG]Ձz2™śŽ{dKXBŢpf)éŐ8›Ú‚ł[ű P}ƒi^ř”lłĹ6˝Y&ŠC&ÎGĎ܁ě52tş_°ţŃő”Çě@Cńţ$r­[ŠëT*,1őz:xâRÉ-˜tň8MkŐôvsß7úĎűflkž­eËdTŽĚ‚8ű&Řl^úś2‚ĺ6úhúĺUăń–Äâd:/áŹël{SŁĆhŢl‹žĐaOM€†Cäq4˜aězž^Ĺöœ‰ë-@î^MŁŠňO€řy67 endstream endobj 797 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 121 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 250 0 250 0 0 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 0 0 0 0 0 0 0 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 444 0 0 0 0 0 333 0 0 0 0 556 0 556 0 0 444 389 0 0 0 0 556 ] /Encoding /WinAnsiEncoding /BaseFont /BookAntiqua,BoldItalic /FontDescriptor 798 0 R >> endobj 798 0 obj << /Type /FontDescriptor /Ascent 923 /CapHeight 0 /Descent -282 /Flags 98 /FontBBox [ -178 -340 1192 1032 ] /FontName /BookAntiqua,BoldItalic /ItalicAngle -15 /StemV 133 >> endobj 799 0 obj 588 endobj 800 0 obj << /Filter /FlateDecode /Length 799 0 R >> stream H‰\“Ën1 E÷ţ -Ľ"Ł’őÚśifŰŮ5]F¸pœ")úřű^‰˛ëf3#qx/I1›ˇë ›ő~|n†Ěz˝ÁcˇąĆ­ßú1ĎóĽúbbőIzĚBž(ÄyZýÚ|ąŸÝ’=Ű?ýěqŤŰďşýᖈÝ~÷re>őhçűşŢ\ř¨žľŕ„Ě\ ‰ç\LH=͔şş *bu ĹćKžÚ;×|´ĎXťwœ}ąÇ 1׎`;Ď~*ěńbŐ™…= „{Oş ŸšÎzˇ&íŃÜ YśOŸdű26wăčĘź‡‚X <ěďWÔýôěţŽ{ĺĆq„Ń–30ÇůV'뛡ߝLý(Şk]FrqdЧ[ąźuƒQdqÜP.ą2ŚË"KŒ§"óżŚŐř¸ESŞýÝ;TʁdÂ[¨B†ŰPéŃ።BśU…ÜTćĂş Ă/Ů"ßB5 ÁWîM“j ěۈ‰>×2I‰ ]g’ÇW¸St"Ň:Á@ó˙1(—™ŃWž$xIŔHëZ,هáYXIËJp6Hö$'RGžâĂ$ićÁß2żĘžv‡˜Až1Eý4-(iڟﵓHa’čŤ('4óDÔ,Š“âŠŚN˜|*ŕ‡ÍJp—Z'čĆ$ŃÓ$U”ŕ+bJ¤sAí2bZ~Mŕ`8ŒŞ%4aőĘĄL?čóŹ‹A´v>׎}.ç> §ŮŢŐq[.ćuę> stream H‰”“ąŽ\1Eűů ×)ś1ŕzş•RMĽ‹RDťUŠü~ŽýĆł]4Íč< — ¤t+˝R6MĆBĹ-˝¤•M$Âԋƒüúrűz˙ÓŇý‘xţ÷[No)§ß‰ŠHú›2§oéűN?Œńţ¤ĎŒ™T|ÖČÔgL%]:2Y e~Ż” o"}#ÓטNľŘ™9gʋ’6Tđ&}ÔĘBĚzö Ň5žM˘Ä˛‰Ď<†žƒ´•ÇŠ­WJ>ćŽNƒXč) ƒôđ§@ťRá}J.AP+7śňTô,m#ö6Hfj6ˆĂ Ձ‹TâE\‚jI˛ĘWAď2cş~&P0 Ö¨%< ăß'…˛ôŔçŐW‰ŢóŐ{řl—ĎĚmš1\ŰrĚk;Ÿ1/;§]÷Öj‹Ý~ÝăvÄü˙ö?ĐGCT›[֐éc’VŸäý…„ęAĘđsbąsŞ Y7™S Eá‹o2˝?bx]Ďłžľ "śœnőŐ!§’ĂĄ}aśîIŃŤű í.›Džvy{ěqť~‘íâóUÄŕŞŐ_ň`kąŠYĄËݗBíƒ@όŮ})v˘?vJąꞎÇ0ĹäöŤpue_łĐEdźú'Ŕ#ţo endstream endobj 803 0 obj 400 endobj 804 0 obj << /Filter /FlateDecode /Length 803 0 R >> stream H‰\“;vd1DsŻ˘ă 8’ś3ą÷ťńÜíôžRń+˝^_ʋlΗ%őýú9ÄŁˆí$ƒI.q.2HN‘mE„,‰‘JĽŁA&rńŽ5|‚l’[k§f1_rP=Č ă&;‰ĐńD8}­‡Xjœ„›ř ˛Číƒ`š!MŚQôóáŒŢUü˝ztj~{> Dmö;׎WbtÄß&]â´d&qň$Đrę˛1ĹźŰŃĄlž‰ż$7˘Ţ>š18›}ÖÂkë~Fö7m˛îź{.™5Š?DCżĺţ~/llÔć 2bMF̅diíľrϸ_͝l2ii]yI“ň˜˘’5Ňi1ëÔUVϓ1A?33ÖŻŞéd2ŞA_Ď/—HĽ˝ÎUä&ŮŞŸňŤ1ěšČýŹWł1Wt<Éž>ČŘôœb§ ű}<'-MOŢ<˙jf§÷ńy2ŽIV_ŽsA?W#ů—ƒčŐhn,ČŽ[D$ű ň˙ß׏ŚÔԈ endstream endobj 805 0 obj << /Type /ExtGState /SA false /SM 0.02 /TR /Identity >> endobj 1 0 obj << /Type /Page /Parent 752 0 R /Resources 55 0 R /Contents 56 0 R /Annots [ 2 0 R 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 2 0 obj << /Dest [ 765 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 100 674 176 686 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 3 0 obj << /Dest [ 1 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 661 223 673 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 4 0 obj << /Dest [ 91 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 104 645 219 657 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 5 0 obj << /Dest [ 91 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 632 286 644 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 6 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 621 194 633 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 7 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 610 211 622 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 8 0 obj << /Dest [ 100 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 599 260 611 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 9 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 588 282 600 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 10 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 577 258 589 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 11 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 566 262 578 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 12 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 555 234 567 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 13 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 544 262 556 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 14 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 533 222 545 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 15 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 522 253 534 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 16 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 511 262 523 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 17 0 obj << /Dest [ 159 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 500 226 512 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 18 0 obj << /Dest [ 159 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 489 258 501 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 19 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 478 198 490 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 20 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 467 246 479 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 21 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 456 261 468 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 22 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 445 254 457 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 23 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 434 228 446 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 24 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 423 265 435 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 25 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 412 251 424 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 26 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 401 275 413 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 27 0 obj << /Dest [ 213 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 390 301 402 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 28 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 104 373 199 385 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 29 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 361 231 373 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 30 0 obj << /Dest [ 229 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 349 239 361 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 31 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 339 227 351 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 32 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 328 223 340 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 33 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 316 228 328 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 34 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 306 298 318 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 35 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 295 215 307 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 36 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 283 210 295 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 37 0 obj << /Dest [ 270 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 273 311 285 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 38 0 obj << /Dest [ 270 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 262 244 274 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 39 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 250 257 262 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 40 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 240 213 252 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 41 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 229 253 241 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 42 0 obj << /Dest [ 305 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 217 259 229 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 43 0 obj << /Dest [ 318 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 207 243 219 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 44 0 obj << /Dest [ 318 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 196 262 208 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 45 0 obj << /Dest [ 333 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 184 282 196 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 46 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 104 168 204 180 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 47 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 155 231 167 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 48 0 obj << /Dest [ 372 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 144 275 156 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 49 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 133 227 145 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 50 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 122 215 134 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 51 0 obj << /Dest [ 385 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 111 210 123 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 52 0 obj << /Dest [ 385 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 100 259 112 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 53 0 obj << /Dest [ 388 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 89 282 101 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 54 0 obj << /Dest [ 388 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 78 301 90 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 55 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 56 0 obj << /Length 3190 /Filter /FlateDecode >> stream H‰„WŰnăČE^őýH§Ż$űqŽ› 0XcG@v䁌h›YÔHôLćKü ůÍÔ­IĘ90`ŠěKUŸŞ:uúÍfőjłąĘ¨ÍÍʘ"ƨ4üÉϨ íœU•…Ž]T›űŐŤˇ§ ÚMÓęÔŽ^ýň٨ŰÓ ćj ľŤuúů}őĎěsž6ލłšŐ…ÉöÍaěaůfxhﮚ­Ę×Vgs˜ƒ9Nť|]ÂóxÓ´ý>_Ç"fˇšÁ!őËCżĺ/Ž´°žĆ”FgŸťvŘoŐűm?öĂ^ĺ˙Úümő~ł2ŞWŤş.BtpSë•wž¨˝WŕieŐą[ÝŹŢl^ŔŐEôśĆóăŮLÄcj>ŕŰᐯkpNŤ˛cîá^éÂĄăřń.Ç˙#;őęƒ î ś6ďpŤv•ý)ßü{đ-ň0ęɨüBËĘ"Ę †Ŕž‰E ˘eŸ5ˆb™ÜAfk3ÚB~ŔhuŒ^ĂîşÖj­^ăĄ,EWé쿜RꪚÍŃH—;\g'”ŕ`‹ í|áhţ˙ښÖE´U9Am,ü(ň Np/Üvw”˜[†›Łn‰ťg¸#™$g°ńX÷?p$ cło<<|˛´;=ć5ďˎnţĚNšŮ)ONŐâ”a§ŹÓŔ/´sŕkr*PDqŤ\dÁßĺů'74í|ƒŽOŒţŐě_âšß=O*Ÿ<÷)>Jˆ‰ë÷#’6€Dţ!>Đ!Ł„c+euŞâŻ’)Ýą—pÓÂ;Ýč—*-•ş6žüúČ;M0Î8˛eÎşŁ—+ě#%ň¸aÝ'zŰÓ¤ąż!&í[ MŮ GJ8€žę% rf­KÁ™z†ÚŚ$‘‚űńŢQ¨ďˆĂŐuOďœËsЏ'égSD‹˜o “T‹(KľčČL¤Zt „cÇA˘¸"oáŒ^ÄÓyŸaa´™qŠw’1vŽŋbwöËč ’÷˙ÉĄąC*j6YG˙UŰ`˙Ęě]YżëGњ$6ú>žĄ1ahÍŸ†eć;CŸ|†ŕ3e”ľ;z2ű!ëî(Ź`Ę Ań~˛T͖J˛Üřqk×PL ŠS°CŠß's# Ýńˇ‚ jfˆkjŮjp+cˆN8cüäÜúçö“^¸—~"#\Č×?đĚçÍ[ĽŠÎ‘-焟śăă"~kŢěŠpýVf-żvô źƒ„e-ů8:4Ć.aQxČ2łĎXä, ) ĆĚNQťĆhéÁ†ś„j[#l=)É=Śç-eć "_Ľďô­;JŹřJä řނŒđłOĎHm*U[/H­fŤą‹/ŢŚąČ—2řĄß@Ş{ťÍąŞż ü8‘ř셳jâ,˜´ĺ7Tz¨›GŮ_óă,œ!Lœ˛ˆ&sJ@č*ăŽnV€RŐÚ7 ­=rGŕ‹` ćć9|šuÍÝg´ź¤–2{‘ăfý2ťă9[,Ţ( Š›˘GŽÂ8œ†üÉgrCć!úw ‘ăB=sLşŽUVŔ™łgŞĹMľ_ĎŢ2Ë8š%QPq3wО,u'zš’Pm%ËZ$"< =M ş ˛ËžikÂe֞ÓŮ ˝%|Xv‘YNÄcNd)†yÉF„a­AĹÂůSžŮQş9] H]EŃĘŹ,h­’ŞůJj˘;ö"¨×Š„QS$Ď’Şž})g_ř’N§]q V˙œíVţ÷ôĎ]ä–j9ůë¤Â i&éXxzýrÓ~z…p¤*¨wD¸,˛–‚kNěĂp\âD‘ţBü3U&°žŞz7Ťúwt—eU/r„tP†'˛ô”ç܍šö Izů*‹0=)¸–ƒ‹…˘ šąŔäaŇXtłdOlÁMD˝ć^t Œ!Ş’^2ŕ]T1A#ůƒÔeĎ|‘Ž‡ŘŠ2->Šö"ˇ*q Ĺ 7˙œœÎšŚ™šćTŁ5Mˆ“¤II—˝WO߈ţ#Ţ×đ­CŤ‘ˆd~ۧťkIĹŕ)KiŸĐÂöÜL‰Oź{1Ę?kÇyŃ*6"Đ/gŕct=4Ç-°ÇYC8ŠÔZ6’#Sü˙ˆ/ƒ†a ßyŠťФκ>$¸Ŕ^ RLšşOÂë˙ż“t+Űiâ˛.•›üľ]űs’–ŞkŃâ'ZŘDW“DCŒŞ*ô–hůR ÝŁ;j5mág5źÇ=Oƒ˜ŁÍĽl/tŹíČ&Űcţßá÷ŔMF-ŃQýQc’°˘†.ťX2ĄZӐťĹ+Fr•NL„SDőč†R…ú<œúZ.ŔŠü NĂŹ8FŽu[ŽaÖD/o˜/MőÄź˝eÂň-5BőÉYŠ {}s nzf’† çą§:ÁT˜šÂŠŽĹDż5)bNˇň?täWœ,t#W ›tč 2ćœ#Wâœp‘¤P˝sEóĚM* ť’ôn‰as ŮvMŠ5 ŚOÝÚ<;…A€b$}2´•YžÓRÓĘeŮGAĄčĚ a:‡­ľţ)7ź-ľž ˜âœ@nD`ÄHq°@ÍQą^z˜Ůƒq7!#´ç†_´ű˘Ă‚ĎÚ_b#ŔÄCŠ0Pᚠ=6T芰S…ĎŢśÚ™xW[šťęG3řFK267? D˙qö endstream endobj 57 0 obj << /Type /Page /Parent 752 0 R /Resources 89 0 R /Contents 90 0 R /Annots [ 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 58 0 obj << /Dest [ 398 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 708 293 720 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 59 0 obj << /Dest [ 402 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 697 270 709 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 60 0 obj << /Dest [ 411 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 686 289 698 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 61 0 obj << /Dest [ 415 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 675 277 687 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 62 0 obj << /Dest [ 419 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 664 213 676 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 63 0 obj << /Dest [ 419 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 653 253 665 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 64 0 obj << /Dest [ 423 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 642 259 654 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 65 0 obj << /Dest [ 428 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 104 625 200 637 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 66 0 obj << /Dest [ 428 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 613 231 625 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 67 0 obj << /Dest [ 431 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 601 227 613 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 68 0 obj << /Dest [ 434 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 590 215 602 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 69 0 obj << /Dest [ 434 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 580 210 592 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 70 0 obj << /Dest [ 434 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 568 230 580 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 71 0 obj << /Dest [ 437 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 557 230 569 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 72 0 obj << /Dest [ 442 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 547 230 559 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 73 0 obj << /Dest [ 455 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 535 230 547 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 74 0 obj << /Dest [ 455 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 524 213 536 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 75 0 obj << /Dest [ 455 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 514 253 526 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 76 0 obj << /Dest [ 458 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 502 307 514 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 77 0 obj << /Dest [ 458 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 491 259 503 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 78 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 104 475 188 487 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 79 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 462 198 474 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 80 0 obj << /Dest [ 477 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 451 297 463 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 81 0 obj << /Dest [ 487 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 440 221 452 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 82 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 104 423 190 435 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 83 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 410 271 422 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 84 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 400 251 412 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 85 0 obj << /Dest [ 497 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 119 388 276 400 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 86 0 obj << /Dest [ 501 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 377 232 389 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 87 0 obj << /Dest [ 647 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 367 285 379 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 88 0 obj << /Dest [ 647 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 112 355 268 367 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 89 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 90 0 obj << /Length 2616 /Filter /FlateDecode >> stream H‰ÄW]oŰĘE_ő+öqYX ÷ƒ\˛oą›ş€oŒ+Ą}¸čCюnQ ä¤ţ%ţ ý›3ł+Ęqœ{ -PüŘÝ9{fćĚěůröjš´Ę¨ĺí̘źiUĐ/Ţ6E^8gUđe^ÔŽQËOłWűRu{V¨}7{ővaÔÝ~Fc‹‚ęfótűeöŤ^dsăňZ?dśČŢśťĂšŚ/‡űîĂMťRŮÜú*Ł1ô1ÐCŸÍ+úoŰn˝ÍćMŢčťĚŕ“z{ż^ɛ3-ÍĽc*SčEß Ű•złZÖĂVe˙\ţmöf93j­fu—Ł˜ÜXŻźóyí˝"¤ÁŞąŸÝÎΗß!ŔŐyămýcoŚÁ6 ŮŕŰËć5ŁŇ,=fžŽkBUäŔńňC†ëA@˝ú)2îsGś–—XŞ›é?eËßNüAŘů,„z6ď`YY°ŹŔ0­DöM“WD",{݂ĹJ3Ýg 4[{2˘Ëă } MĄKSĚiő˘.Ô\˝ĆŚ,>5.úßDœRꌽË`¤Ďćš#ˑŕŇćea_ŕ—ÜV6–ůˇĆÔyíŠZbÉú*$†}} $SËn}Ž_ĆÁ„íX˘|‘Uy 0äfe^jľä=5z ÂŔŠuÇC>ČĂM6/‰/ žëaŐďł[é2ă§iŸŕś2ýľ9ŤˇŤGňm­ËZśM4+Eíم@í&ÔnB]2jwDý Y$ ŁýMF¨Ż.‰ĐŠP 0ÉvÉŞ%`یăh\A€ÓeĚŠćGŃTŽ Ƅ˘Š'cXo sH)ˇŚőƒn7ü§~Îűž ˆČ—ú=îű‘prЙô>ţľź ó¤Ťâ%–Ę ^9á ĚRůaÍă]†Ř…ˇŒxŠÔ„x->.9,%ŽĂV PPËŽ´éŻÍ$x"së‰Űy §ĘnŽ]Ű|ž”,ôE¨vř—"č’}ÓfP2` ń^ež@ΌýnĺÚŻ[x™q˛l#cGĂϜJ7Ƙɰ§^˛ŁÄ‡ˇXś‘ń F‹7âӌÉÝľÝG|ęăŰ8i€{Gv€'ŞH-jÝŔ‹ÓěSű‚O+˘`˛9l4š$ÄŔˆ2šĎŔî Źé ^ÙëYRět,ňňIŕUi˛,`ˆá?GSިI¤Łľč(œë)g‘@ä=u¤3Ař,sB Š#Ďa „yçč˙fC‡QřQÎ3ě347Év ›%CŹY͙Â%spž.źŮôÝa\wí&Ĺ Ő=äçĄcžÝÂ[m×?&ƒĎ’ž|#łňÉ\¨s*NŘԁÉîYŽÄ–źšBľ ˛FdZšś˙$ž\C0áÁ†žÉu͓\˜Ćă"ÍŞĘ‚¤œrÇ$„šƒŹżždśfpH×1Ęř˘€|%žr 0L|>öňˇóË?‹Qw4z$ŢłQbŕ‚‹ŮŔńTCŹ\Z?IPŃŢB"mCYšXÁ'/ K†Ÿ§ďoíÔÚdČć˘ű ˛ň÷jVR śéu$˘mté5;ŠaNŽĂâ\G|–ÇVĆlřІĐé÷ňĐŤhf„ňKť —ąĹ^4t˜ŕľ{á˘.}…íZĘŇŠ<–éŕÓnEJ ŕ"ĂĘ\}PŽŹ×; @&•ąćLu{7wŇ͎§3šճ蚼ÍäßżŽ÷TJŃÄ#ži†–ą0˙PŰ{–tęÁˆűZ˘¸č„€îˆT3JGO`9>Ôä7$u(üPbîŠ#ř÷z5ĎX>÷ҜáôQé9úȈ^!F $e˘ď9x<cÍ=Č8D˘Órö|dĄ>b|&ŔÓyŠ('|"ŔÓyé§vĎŃsŕřS7‚nÁć^ŮIi-đŢ?tă˝j;ř5°ö͑ˆ'ŞZő÷ëĽ9łGĎJĎa&Ďže—ŽyŔ†ƒ–+J¨”$íđ&9ZKG‰ÚšRWéŽ˙—;‚DŹyŇĺUŠ1›\×{C‰˝vé ˆŽĐ~éoٓ=ÂĹQŽÚf Ž8ů‹˘”œƒĽ~ľ•eZż“§ĂşŰŤÍšzu<Ă˝|űÇFî ů{ÁĂĆ%ôé,ŕ‡ô¨Ý>=q}˘0/¸‰…q›Ą¤ řw ˆŇ%Č.yŕ)VBxç …ü}-HÖŚQýâmCpłĘyĘ0HŐ>Ńư ě€XţvŞ Ř2ÍhĂň‰_Ôvzńf93 ż}7Ťé Bő„ŠRŢQL[„—6HŇ5öłŰŮůrF•ˇl,يˇM™Áe* ‡X*üö‘`¤:ӅôŽY`Ďń/Šć\Tâß5 ĄČĽ„k Ŕ\s[ś':ű• V‡ąˇý' .Róń#=ƒ/+pňSMĽioâŹŰ u=$ńfűdŠżŻG<ţ!oÔ˘ăŘ͆N‘'‹<ľ|#űO Č>I&¸b^@EĄęd'IKÚą?­é%D’ä×Gɏ%´!ڑóŹŇłš”ĐŠU|´…4§fŚÍÂe/Ł>ŠÝa§ÎᦒPŤĺيŕâS+fXz¸`k<ţ,cz¤wn4ÜčoţśŸ‹şzÁ¤Źťpęî)Îŕ††źŇĺ§üWĆżWçRpŽÁ \¸R7âöE*\ÄslÓÁ6ƀí2†ÍďŸýbˆ1č\R Ĺ°!ě)źć\b(ÝNămŁ"Ę{ô!Vü\E2°çńC´FQô!âĺjšFŠ8č‚Ëî tŠlĆóŹx1BűŤž^SĆďš> endobj 92 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 93 0 obj << /Length 4325 /Filter /FlateDecode >> stream H‰ŹWێŰČE€<é+ú‘ F4ŮźˆĚ>Ĺ{łXŹdë<ôP­w(RiRd?#käň›9UŐäP#ŰńC`ŔC‘ÝŐu9uęôëíęŐvŤU˘śűU’DUUŠ˙ücGqšjľÉň(.ÓJmŤW_šŞ^ŤĄ^˝úć]˘†ÖĆ1 ŐŤőôř´ú9xŽ“4*ƒ†:Ž’ 3§ąÁömŽߛ ×:ž ąCZ2Úp]ŕŻŰ›şéÂuUÁC˜Đ'őÍšŮÉK;5öâo’Iźłußíԛ]36}§Âżo˙şzł]%ŞQŤ˛Œň*E I”čLei•YŚŕéF+gWűŐëíg–Q•é’â§Ř’ŠÂŒ%ŔŻűS¸.á"ÄŽŔ…ţoŕUĽä8˝<„ô˙(N˝zë3žE)ÎÚţ™LŐŤŕwáö—E=ŕ[%Ÿ%ĄęŸčdĽ)ˊ2 K8?Š˘I¤“łŔP‹€Ó}GI˘4k˝XQGţ_7UäIź†ő¸ŒŐZý‰‚ŇôŠJ7qđá(ő˝y錴/›łěœë(ő'ň‹Đ2ľ y-KIľžr]T[V&”l<ńë´đëHmĂMĺÁŒ"ĆŮ[kĆłłƒĎó@ťŘä@DUΧĹ՜ćJNŰŹĎq)9&#cř{eÎf¨fPFúŚ›ŽŇÜî켊­Taß;UËţ>\ӎăéh:ßüńoMǖ`@6ƒÖ8YcŕpXŁú=ŸÉ/랃”ă\`=šú@gr$Ű?HÎËg)%†Á˘ĄÚm}‘g5öjŤP›ˆóuüßĎ5ŻúĽ6ÔĚÍŁ”ľoĎŹj}čÁОŁ0ęâuE<:ĺéÎîü/Ð đ2÷îű‹§@Óy|íÔ˝ÇM’-Cs\Ójł‹ćý˝Ş˘P°ÍTAŽęYŃN’÷(Ź8]ë׿ďœ„4XsÍO<íF~lhúürżár;}˘ŸR+zúȸ}yu`î*Ňç4Ţôüߤ÷d2m` >ޤŚiXR&ŒŒç5>cŮÜĆ/2–sĆҀšń›wÓcłoxňBŮě—(–hf˜Äւ{œ§&!—ł$áÎcG@<Ďôލ§aş6ČtŔa÷YţŤg'ŒÝ§f<¨aD÷ˇóCŒ{eç ÚÝ0™žm‚őôHŠäaŹŃtIĄśčĄG\‘ ˙ЍŇ.T-ß8tŹËYŘúeťŰśJŁ˘ĆxFëĺ4úśjKsá'ůM'’f§n¸IŐ˘ŐfÔ&ÚŚ ďƒ{.$Ýé ĺgßP¤Ěáôú!¤kîXôĹ/ ú‹iš“˘´Ů k Zá_őԟ“VYÝĺ/'đ Šg a\AGnng)ŻNÖmóH^ŕÔŽ†I„s=:6ž9<âő čgčÉ”Ňůź<ń_ýňŔŸ*˜Y đëÉqź^óţ ?šń“{ôäˇTŤ‘eó?C%?~ŕÇź0ŸFyţćő˛ťf!Ł}l?}ˆ$.ľeŠ™s÷]6Q™.#éŠě3LĆ{⚦Íîȗ1Ÿšűţ,śľű‘ŁrĂÉXôCzD"™ťŽÄŚ–ÔýyĂčŚěh ź˘(cĺ ŻRôŞ.ó¨,)Ö#;š1$ 8ĘĘ7ňۤ…ąŇňŸz'ż KâŃ0ĽůQVĐ!hž0Ą[ ÍÖ1´nä˙1QŒŕ}(+(܊dÚŚ{iœ¤őž t˲ú‘Ăył]ašC+]–0˝ŔZ­ůgWű/ú^ĺĎßs,ßW+ňM¤uůi ř^eĎßł2Ú$WtŒ É>eAǛ(-Ÿż#ęb“_­(ţK|Ő,ˇmÄŕKű{”:ąÂĺ?I;饇ŒíKfrĄEÚâ„9$e'}öűŘ]ʒ–Éäҋ(X‹ßĹ&Hü6=Ëfzc#ÔĹ)K˘Ż żˆďŃgGBt`éؖ’¤8w”cv„—Ă]ÔÇ1Űéăx?Wűľ,6yŔˆ4ÝDa”s–/vš89i<ÔV`Ă÷MIo&"ˇĄUÎ4gBźÉ#,67'ŹĚö뚢$‰ĂY‘ČŇaĆҐ¤î7Ëŕ^B0Ÿ{I¨ |GCeżŚ~Đq“ˆ5óó@m""ȕpľ1†łLkŞ4ŕó>˜Ő§îżiꇎű`„”ňš5" ":TŸľPŹľ'ulSHíќ7ҝŘ˪΃MG&Čh°ůYŐú•Şľ6źŕ*‡M× K\š„×çtŁîňœ —t ›Ýyŕ>9'(†â*‹qÉâÚĆBFqĆáIjéš"rŢŢź§Ńňpœřę:‡łÓËńŁí s( “č§Úۧ˙ť˝1ě°űƒ\w‹ŃÜ4ľ*`Ý5ÂąkgôÄëóÚl(áiř ]Nֆ@Z–xzum+ŒL+•Ö™rעóŸČW—= ă;Ěc?Ň0ô…Žä“`‘†Ą/ ‡4 }iř$X¤ačKHcÁâ($E/•š—cž¨—Ă]ÄÇ1Űéă@Š]Ť0Ě* đFzÄiî`˛žw - ű—Œ˝ZöŐGJÝisŢÜDyB™¤éoŇΨn TćoMĹťujŽ”ň¨Ug$ŠV>\ßďžQ‚jŔl’ÜđWJ~Ś ˜CNČ/§z!ĺ WdŽŃÍ;n˙–_ŞĄ|2 ćY3YTM´Ě†Vř@°ƒÖž‹:‰ńĚSúBř$Ř:1ô…:ńHpubč uâ“`ëÄЗędÁâ(äPšÎH7ŽÎëÄË1_ÔËá.âă˜íôq\Żĺ4ĄuRc$aŸ|˝NJR'ˇXdCł>í(q ł$Rm$˜…Ń” '1ăRyHĄđn9\•mj¤XB–ŮÂĂń”O~Š2* }Ľë‡é†Ś™7› }!›}l6úB6{$¸l6ô…löI°ŮlčKŮźŕqz^ÍY4ƒ g\ř%,ĐŮՆžäjŻ –çĂĂЗ‚áÓá8<:\¸ })\^–çĂÔĐęSâ8Ńź-VŞU%_Ć扼QçrÚ*ţŻŚŽ @ΐ—ĽmůŃ1uo4öüfő>´†őĽ™vł•ňř*šqjFŤÚwîNěť@‘'‚ůÂÂŕ|ţGné‡nęś]ű†ÄŤúŤ˝ůvR[Äł&€Ąqžé4"–Ěx[#Šđ‹â É™zRĎ%0ŠXĄŰdĆăĐíźaQV°őxşż8ąĽv:ĚşóńÎŚ/‚AÂ+J˜bőr€ŽséwőД-ęŹRďţ  ôĔJϊ7Ÿ× ̈ëżČKh endstream endobj 94 0 obj << /Type /Page /Parent 752 0 R /Resources 98 0 R /Contents 99 0 R /Annots [ 95 0 R 96 0 R 97 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 95 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 431 637 490 651 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 96 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 623 152 637 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 97 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 326 510 343 524 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 98 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 99 0 obj << /Length 3359 /Filter /FlateDecode >> stream H‰”WےœÖ­źöWœGHu#ŽÝP~’ŮQŞœRY]‘mM §‰hŔ˜Q~#ÉKž oůĆŹ}žŒ%;5UÓp8—}Y{íu^íW/öűĐfX—e™ńń§™ďůQš]œx~efZ˝řÚ&ڰ<Í7śX˝řö]`ě s}ŤÍüř´úŕźs7AäĽÎßÝĐ÷§ÍűąĆň}7ǡyiÜMč;o\ĚÁG—ŚŒ•ťŮâw8äEÝş›Ě˜7 OćŰŠ.e¤˘•!Öâ7śďźŤŠŽ-Íë˛ëŽ5î_÷Z˝ŢŻS›UšzIÁ‘Ŕ ÂŘÄQěĽql`é.4Cľ:Ź^íż€(ő˛8LÉň-ČČM_üşëÝM ăŕ!V9ƒă Ť|/"ĂiđčŇ˙QŒzńF<ö"œľ˙mUŹœßšűż]äśeňYóĄúD'›˘l(ÂŘ ç™ˇEéäŘÉ)Š[‡Ă˝Ś Q˜ĂđbFáéžî2ßIƒÝýÔ7ó’œ éSí|ç?ĄcŢć.Rš­K–(k€“ĐKüđ˙ŽďÎĎźĐß2ŔŘŮ Ľ'rö 2dہ&ó˝ťÁ°#tňî†ÎˆAŠ|ě<ƴƜč­+Ťľéz¤č‡śĄ .;É óšĂÍ @u=ą×)tviJ}ëôł5mÇóM>ńŻ~`“ŽÍ-r6NVId€čĹ˙(’ÄEAš‰ű) łŢ‚~…DGwËŕˆ QeüV‘™ű‡Ëţˇž=2%%°››_ˤt-k5“œçí `şO:ZŸ€††{íÜ?cýä č–śŘ °ĐrXŰŢß´]­ŽC>5ÔŐ_-Z;83䯃Ć*Fjœľsvçţ"YSŐŹ•łvž‡S×U] Řl ŚŚËÜ—RĎT:ÁڜťD&nĐ}@üźƒĄ oć ´R¨Îő’;WęčŘYđ¸˝ěŚűŚb˛#.8 2EEé*ęĎT™ě%¸4 ÎÁâbşČ[v‘7QűdœXîőű徔ş9mł‰ŸĄŸgʁ0vŹĽ‡ľycł^%ÂĽŹČY!ŔhR?T‡JćƒÜ)÷ó.$o8€gq1˘˝)`ˇ“‹S×Q3B(§Á‚É˝u ŞÎ_ŞÁ2áá–ČݜÚ+ـË7>2l\ çśw,̡#ćŁLÉ˝ =P#ąćŢˎ55ľ ,Ő=Y6%Ĺ"‹řVĄ12łőăĚÄŰĚŰů[šˇ‘ú_‚éóËH%´ ˇĂměé.Zn#ĎĽ¨ÉՆě°ŕ'L˝ôVƒ?Kî{Iť‘ŠćĎűĎx$évˇ312? ~›'Á6 eˆDvLÓä|Ż –{U ž.ăşaőĎW֔oŹä 76Œ |K‡?péč\Ð=ڧ€k# -LI‚0Ĺ@Îß']J\%ƒS!—CpŽŘ3Ĺą—ćČźŠ-Ly Z\gćÉ. d§Ârčf"šj睄ƒŹěqœ§ŮůR*Á=îˇ^ą>VUoŚ^¤qĂL é )P%Ä_BGŻg'Ě弁ÔnDŚ3)–ł^¨´ŇY:ŐIC›7‹jăԆgŠőꄞëŒôĎЋC§nP˘‰3Č 6¤›GĘz9/Đ\ "˙D˛2‘Ć<÷œţźXöCťÇ9Ńvˆ0 óxŒ´+ ´őpą@ĺü™GGRy˛Œ?ɤQŇČ2Ÿż7ó[A'Ň˅[9Ň@łŐÔćfž•ÁŇ5Ł ńŹ)"Ľ¸y醱s/÷Ű5¸zĹ|ăŁę NŐ/ŠŠ ÂЄ—š:^L/y‘AŻ —×ԓ˘ ťËmkĐ°Ł‹Ţ|FÁ|ÎË{6ťrch: um.×äškŸ CůľŇĆČ —uĘomžŽ2VÍbVęU™|”Üč3FUş"iؑB °f%I:ż#Óô,dtYăáR~KŞü˜…3ý‡śuäa@ôtŹĺӑ¤-=ô$I.qГîiű9H4 2ŽŤTáDŘŮZ¤m{ŢB­(q/Ĝ¸żŽÍBřw.ĆÖ7ˇŤgŠˆb‡ťĹą“´„ľ¸ü™NUuuD˘p’(./ŠAu%ü ;x‹ŸHú)$ęVšĚęnBĽŃőĺ‰ }C>YäÎčR DíŹ řsq“ýL‹c~eŠoÁrgŜŔc8_óř˛ƒ0YóK}1KŘޛOŹ‹´ošY!tý"”XĐŰŇ„u{͏ˇĐ;ׅ\ßW_‘×D{_Q3.vž"ő(Ů~TŒ FÂŞ 5ÜďBŚTâ;˘%}á$}ëď„4Fĺé9(ƒ+LŢ9?ŹĹ„×ć'–)e꘍WŠ– ŠâGŰčTâĄ" ×DzÚĄ˝ˇ6}Œäčg śGn° ţş9}šQŕC॰!œëVÇHÉîD(ŮBw蚆nü]‘gĽ z/o f´Ÿ€÷ b¸Ęe cÂĂaz]ŠŹVńű;ůďçĘüƒóĆ H>ˇT:[ľqĆ CDšö^p1ÓÝ|ߛѨ×8^’Ĺ kBÍ5Š}-•ÁőŐŤr—š˜+äŔ:žŽĘł˜ŘţŻđ*Řm˘÷~G#šVˆÝÔę˝çâS› ŕM@!€ľRżžď͛Ĺ`§ęŘÝegfwćÍ{¤_2’[‚ÇzŘ&Ąv‘5sšĂ]‚k6Š˘ńľťR/4„oăŠ_ö˘bAƒ‡¤uKůD†é$ë1ŠˆůjoXÔóćŠeýR—yƒĂşßGIťÝĹÉNJrĄ IK";8ˆ äAhϞ„GŸZó1úča`ş˘)~Ç1ąÂî9u˘vşik˙†qkŐE ÍĚÜÁƒEíšJ¨pˆ+Hú…“v°îçˆçž ě@Hł hĺ"‡ţG¤ ܏ýÌAăÍÖyźžŻJo0fuí˙ Ć}TĹŞYĂĺ/Œoň}ŰĄašb…oieoZӋ ň‚œňJăEiőJÂ-1GA ˆĺĺÎvĆk•s† MsŸ›"[ Í ­ë“˛Ę×@ăћu0ŸWČ Š‘ŽT<÷|˜š+LD„îrCűU7NŤ>¤źůźLœźwŻŚžÁŕoÂ9$‹űĎ]!ŮüEřÉâTŻĺĽýžůԄ0ŮV´F+Ţľ}˘ˇ1˝Űeń%™ęwߎˆÓÖL}PţuÚ\Ž%ݚ#l/==yŇYrýkjÉ˝u[źSV BZĽ^6B怇‡ g"‡8ú°ůcĚ3E}OŞ´ňh^Ők,‰ošx1ąqőÉh—ř bbłÁö°ô䪲ĚGŰĄƒôâ“uˆŸ€“H°t=;§ň›ŤVmfŃ7í$˛Őžóá|Őy\ ˛Œź=äu; …;ŚMfޤnˇdwßäÄ÷Ó§żţIí endstream endobj 100 0 obj << /Type /Page /Parent 752 0 R /Resources 103 0 R /Contents 104 0 R /Annots [ 101 0 R 102 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 101 0 obj << /Dest [ 305 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 237 275 263 289 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 102 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 199 204 225 218 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 103 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 104 0 obj << /Length 4110 /Filter /FlateDecode >> stream H‰ŒW͒۸Ž\ő8’Ї ’8ěÁöŽ¤6)—­ĘŸG˘f˜U"ǎ÷Aň yÍ|ÝHiDĐkW‰tŁŃÝřžFăőfuťŮ(!Ĺfż’21ƈ˙ÝФIšeJ”šNŇ*3bó´ş}ÓkąíY-ývuűîŁ÷ý şi CŰŐÚżŽ>EăľĚ’*úŤ4‘ŃĄ>-–oşçíĂűz'âľJŁ?ĆЁ0&•Ą‰×ž§}˝mńÚ$&ş%‰ÄťçvggZа_) ™F›mw؉ŸvíĐv˙kó§ŐO›•­XUU˘M†@d"U.ň,OŞ<đ´TâÔŹöŤ×›…dUbrUQü›4fj|Óăuç!VE§8Ço ŻŇ$#Çiň!ŚßÁ:uűÖe^gP˙[ ʏQ€é‡úpßpś˛B"Ä?Dž 7Şvýá~‚Vš%ŠřAž§…ŕhĎbţ-rŁ'š†zY\hč2Q^Đä&Ÿäy•”ň‚J@‘-(¤;Ť&9˘.J}ĄQ˜$ŐaH^–“\ĺe’ƒ"g*Z–‰4aߓ‰ÂUĺĺ˛H´6/ÔÖđ5F?ƒŻĎ+ęĘ °śa ™p0ĎôT9 ‹óż†yZ* PfgYV˛é ę(§IYfĐţCwjíďŁJŤ¤RÓú"EÚőź†ľ0Łáňq”|ĺKĚËłőčLićUœ‰k•‘l ˆ˛ˆĂ–WóěeQjœŸV@ă,Wó“Ÿ! …ĽR€T”ă}—ĺS!p÷ü?|!ČÎ Aî A>‚čŻÍ ×˝§ž´Ô7Ě霩Ÿ3őľ§ţDüŇ)ńó3âK&>-¸ë†Ą{˘"ťf}QĺpŘo8/s:hÁÝp^žáBü çĺá.hÁÝp^žpĂ-%Â& ßĘ,Ü`a)Đ ĆHHcň3¤+ޤNçIn¤Áj&° ÖRCEYçYEýREˆ­ňŒŤtLÍťć~ŤŞ˘÷§†n Ůßg–žѝĖŻ3Ă÷LŐ[űőŠŠoŸ`1z= ć´ËœERfa˜ZńJë=H­xŁóëGˆZńBë=@­x Ÿářü $…KiPá<Ây…łfÎ]œU S㝄7G˘ˆˇšń؜*e‘ů7¤‚Aĺ\QMÁ˜”Ú>%ѐEoă‚oš "˝Ý˘ćDX%Œ}ą6sÂÝŔŸRxjQ‘Ĺp'ş3˝’đŽ=ž&öáQFľý4˘Ľ÷YƏąhO¤) ĚP§÷,CŠÍĐś9}ť+)Éƒ-Í×đÎŃź!mA|;ůŔC<|â #Ɲ|ä! ĺNžó…DŘDĄGŇjŠ 5Ś@ƒc !ÉϐF쨭Đ.襤qń;°çrDť”î?ڍŐ_S]äËźâňXE\‘ľŚ‡ Š{ĽTtą†ç”m7>ƅ[RŰ*łł$íĜůăáX˘äŞNŘĽY´%VzG J=kŘö—ĐÍÝ Knb†xĘÚ\îyÚ)ůěýQşšía´ťÁóëq´ Ŕ'4ŔќŢ52̛…űÁÉř˛ŕůăä ü Xůăä ü Yđüqň%ţ,$Â& MáxĚň'¨1Ô iL~†4ćů#QtJŻ&ÔŰ[xţ ˟q宂,ş ,ŮνMŚËŠÚńďŇ ´‹jűąâé4kŰq§ˆz+&Ú°ŕîů\ĎţÚű@[ĘL™"rÍĎ0[ňŃ6ąĽňí/ą ôl!×çĺ×,‘´łÄÉX˛ŕYâä , XYâä , Yđ,qň%–,$Â&*‹ôK‚S A1ĆägH#ŔHü |nĘĽ[ć]œńŁR1jˆś2?__â‰Ěč>úe6Üý ƒg‹ÇۘűľÝŠžˇ…ű^îˆWŽşÚŇ^;îÚö;ˇôňĘp׌ëńŇŤ‹f~Ù-~ť{/YĽ ”ł"Č*/ł*hÁąĘËĂŹ YđŹňň0Ť‚Ťź|UK‰đ‰˘*~¤„5Î hœ2ŻqîçźF€UxáĘÔ]ŕęČŞ‚Xő‰^ŽA:xěЋ 4ř[f=Q㐟6g€ízśÖÂÓ /đ{bVdž#„ďqѡ.×\ťJqGWa`;ů°C<°|Ř #°|Ř! ŘNžě…Dp˘JƒÇ@5w]x_cÂäœj'_HuŘŻÚÆ“/FpQ#°Çx\Nžp\á=źFh Nžt ÁMFŔ&ߓقÜn62ç6H­LŇĚHŽ&~ʰ]ĄxşKšďhԕöţůÔ¸ËO­UBÄëśî0 <€ŻîŰS=€SúSźşłŞ}÷řlGC#Žľnq6ËsxYNŠÄúHCw2BĽŹpŞŠ›mnŹ~DmŞL"nŹÓčŐmMŸ¨S6T°hÇ]#úĄ†łöÝH’FÜľ|˝r)Ĺç˝RÖŤTPŒäüčś.Ç­KťőćĄӎݎc]+o†B:܈Çö—F ĐýĐ<ÖCűeÔ˝ĐÚ"šu{čEß|iŹ•ř5ÇAÎö°QťÜąoňĚ7=úŚ­o§ć؝ŢĄĂżŽ÷ŇŃ>Ś^ŠwĎŰGŁŃúDˆWŃ>Ńşú0ˆ]ťßł#%ŒśčŠœíaŠšŒFÎ [dç6ż%ěřŕĆCĹŕv`üč¨ĹK…œ!/D}˘SAN„ O”ŃąsKOCłCŽŽ^ŻfńĐ UŠRĺL‹ýŠ{C}´.şs9ěB;ž}‘AlÇv§~xö;÷7âëCă˙rëzJŔS÷Ü7kî§hŰ=qśw/NůFÜ7d°A`Ž Ŕłč2Öą>ľ˙qRD7täOÎţ¨y=a1ŚźĘ¸ GrčÄW‚v[•cĎŁń8÷fěźiHǰ‡]âĄţÄc:<ÜËe$ş¨épúýĐÚÖŔ Ľßśőžčä˛˜ůą…żpîjVřlmŰšG;G§Dßoą"“7˘Ýżp€Ďƒ˝řŠ íds-šóŰZ?öäłoă5?s™wÖćŁýÚőÎť‹$˝NlŠě ‰-7+­ýţҋ†_bęY\9BÄk”tx'#bK<şqV.Ă8¸}œ#ŠÜrBDÁP3‚šŢ~5h‰ůM˜ßvČeâ<0ĽĆČhHĄş$ő[ Z@×˙)ŻşŢĆm řŢ_ÁGHŒČ˛}6úÚkQ -ŠË×îE–蚨L ˘tžßŃý˝ý d9 Ú‚Ř”)’ť;;3źYc`đ&=¨oî‘'z˛`SöéF~žhg›M´ł;|5Q"Wđ'BŽ@xe=řgşŮpťmě‘xw…Bi˛ůđźU}Ezc"_ď–T>Z‚)íŔóúscŇDŢ.śŽ¤¤~ÝŘÔmŔęۢ<žB Ďt§Ą*e@h"K:$•Ž‚{a\:ogŮAGŢ8ˇŐ-ůî{Y@ĹçrĐô:żÂŮ~iz'üz"€ŒEäsɑ°HÎˇźˇĄh{_FóžĘăŻEEXăĚS€ŮhކˇPaIÔˆC+ß!M˘0KYÓŕ`rTË1 îăňsjŚ7űŚč061]AĐṉCŰÖ*5œ) ŸqCxc㞨@őŽ Đ;ŕ|IśtĽ–Mr>úň(ęƸČÓşąw'SéK” ¨Œ'ź­ŃŤwňđňhĽŒ žŽ˘|ď˘ď B˘€÷)OŔfNwŚ.ö|‚Čé~4Ž}Á#c4ᾇžaßyíţé[#(Z šĂĺ87öŞ(hçý¤żtŤŽˇš8‚^1ĹHq(çÖ:ŇŠ[żBŹDMCŞČěĹśE;‚ ŰNgŘ{›r<¨ËK.ƚ†Eé*ń%[SŞ9;ť-Š{§ć˝ťěއćäŒô ÉbN˝ˆĄw\ꝝ5e.‘U&BŃ(я?uďΞ/Ojě0'~şa83IxŠŞň˝o…ƒy‘`˛Ń ej†j nÇšÉěŢéĐńpů­ĺ żąOü„ ”;óńťćô7J M1ćŕŽKC^%HIŚŃĽ´îŹ~ĐYźöE×óňK„_§iˇ˛Âő‚:ľƒüh ú W’Všă+4´ŘťëN,ÓĽ—ŞôVxyť˙âŸŃ‘’­v=“muĄuXR˝Lžż™Úü?Áł%Ž ÄƒÇćL ÝäÖ.‰ĂąR%rŸ.ŒkpŢMěŇ‘H~ϲĘ132ÝÔˇä,řZŇIÝI‡D#[ţ-yz‘ŚƒďNgtóyŕN§ýM^UůôŕŻvQ[{G¤Eqüv(ĺmgôËQ.HŽü‹|„żâ˙ iĕś¸‡6űbGŮeżÜ‘ÁdŮd`” çVŇežvz”^0IiSW”€ĺúŸüŢ ćańŠKٌGÚLřA|šäWý4űmM5SéVb'Ť=˸4âgßőCQ?™˝óA&\sgŚ4ΕĺűH1]BśVŸżœĘgň#źŽ&GŻ) ř¨hwŁIr‚ńĺBEełX1ÔO "NJ#ëŔŔ+°đ;Ł)äżғ{éżÜ#Š]T#]‹ˆIC-ʐ‰žg •ÎUşę*şŹ‚ŚĹažD6~żMŠńÇ­ů8 ä2ĹŰ1­2‘AĐś#jb:ÍrAĂÖ ËđŮđŠ~_d’9 ĆÄ6ěýYŒVěv4GÝ[ŐÁ§v‘Č/ŕă7*’:Ć-'ŒŐžQH’33ůŻ œAƎÁwz!•ľ=ŇőŽ,(8ß醩 /¤t2œEŻ€Зô(]4]şľ'F”K7“с„ÍÔî*Ő-÷TĘŰ,Œ| #ŸU'Nů Ü9빀 rňßÍg'”¨›RçÄ„Ť&’§…¸*CԞÖ­¨ßKdamŮüúkgř 7tçđč˜ŸšëI1Îc9œ9˛ŕ…'!ëvŽ NdÉ0 dĺ÷|ŕJyîíűoţŚIş= endstream endobj 105 0 obj << /Type /Page /Parent 752 0 R /Resources 107 0 R /Contents 108 0 R /Annots [ 106 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 106 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 458 660 511 674 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 107 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 108 0 obj << /Length 4672 /Filter /FlateDecode >> stream H‰ŹWŰŽŰĆE_őóŕ‡a`ќám˜7’‡Â€´NÜ‘:š”"^|lFřú›]{.”Ž$§@s9ÎěٗľŻóÝfőbł‘L°Ín%DX‹đŻ[QĹądy’†‘Š ś9Ź^źRś YĆíęĹoťV "0ÚŽÖ~ů°ú…ż Ö"˙Č(ź-ŁĆőM7m÷oƊkńĐŕ0 ’ąÖ~ű]šŐm°.‚ß‚ŽŘ“ŽěNM7%îâWˆLDüm˝íڊ}_éQw- ţšůiőýf%˜f+ĽÂ´ˆaˆ…LX'ĄJMsÉúzľ[}ˇy€X…E"ŮOś‰‚ĚŒŹŻşc°VPâďƒ5´ŠÂ˜§Í}@GŤÔ‹×ń$Œ!kóWbľ]ń?›_ĎüÝ {lMŒPˇ"ÉLƌ'ČE˜D’œđ’P̸ű9D0KyFą ݧyńTDkpTÄÖě%%騈óˆ˙GBWĆޔ÷ Ѓ˜îĺ3ĘŕT†i$đ…iꍥ)ÜĚ őˆ‚&Ą ĄXœFüĺÝĐ5ÓXł°ÎÇś]×Wş-ÇzphŸek&é ŃbF´°Ź7űŁœ8Jüm&đ끅žŮ9vŽ و{;ÝŢ×ýż uéőjşmiâ˙ŮřĹm˜ó)X.ˆvb/{VŽP„˛Ćľc1Cœ™Ąf3”5ƒ|$)cţĄ†X}¨CĆţöDÜQťF͟‘Wœé}ŚCx•÷Ýs! eŰv#ť3Ö*CĂHS?đf;5ť2W†ÎYß×vŃ×&˜ˆ…Ş;6ßXý…đú çaŇ ]áѲŸaâě/,r‘ěäĽŮ ĐuVǞNŘ45(ćŘ;Öčši댞$ä>Päف űîĄeÚÝh­ ěu"Rɖś*űĘ&Jć"Ä ËŒž ęś;4U^š]KŮWä)iÍÄ÷0°ngd•Űq*6čĎö–=÷§^ ťŰ]‡löz¸°*­J­UeÓtŰwÈŘݍ5ĚÓFÜ‚›˘#őŔÉŚů˘Î1Šą ćcÉô¸ďŚ‘ľu]é֝’•)'Ö˙ň[݃ĺwJéŒRú~Ü; “ő)'ëŔZĂ­Œ`–&„ĚŃąf#ŢĄjWb&d;‚)œË ˆlDűL iŞŻ[Š}!–‚Ľ VÄyâËoŹNĺ×E2!'EB9řQŁŮ‘†ší"B2‡ÜwAŠżWçŽW*ĚĐŇ" Óc€>šúc‘… †° #—(f–N:,Q g?+YfÂtęőŠU›¨quü坝ä†Îţ6“ýEÚ 1Řľ;ę‘>H´Ň~š{M@u=TôxŐΊ@ËÔOP›žfé4`ćŸ(0ľúK&ě"Á(ÉßógîÚÓBň/ĎMţ:Č9ý˙>¨TŇźe4Ňý?y^dDŽŕ2ĺI¸>ÇTŚÎTLŕŠn“8%ŻI|Č.(9ßÖńěö-c„kšŸiˆ‰!Q7)ź‚WsĘ,9ĘűŃŤSFĽéeÚ.RœYq›ŕ¤Ă…ľ˙Hľ7FÉ)…ç7FěŢ›O&OL?űŰŇ~5ěÎ.jęű1˙\7ËY*•‘ďłôÔR¤k)@ZR†(ţ%Mě6=J'ĹSęŒż˛/ÁČ%ö3Gđ>09ި…ŕRŽcâ8“—Ud_g3/‘EÄĺ"+S´ZzŠ-4"wüDŇ-0˜‘ç°Üˆ8řF43XnDKFxńěJ‹§Í"ĹŹăÁI‡%Š?ą1œŻŔËÍ'¨ş>˜€ƒŘՃfl„ÁQcn§ů“Q]Ý×ě€6Cséš^^}@Żš{űA”­]/Í˙cCEĆą ¨Ť0βˠK|HťŽ".Ňl_ÇR]…o&/9Eçœ.‚8p)ˆÝńAźŔ`bĎa9ˆ8ř ž,ń’ŢFx/7*˘'i( ëŇýĽc‡‘;~ Ł%fŠ3Š^Ć(.Éđ "<Ěł„'`^1S,ČřÚůă<qÂ$ş_Kźť˛L,Đbł8÷™]żD^ë{ź\ń˛*8“ë8¤$ŔŤƒ˝źĂŔiÖÍ4˘ÔĽgx°´vżb˘YŽڰď9{„§_ÂŰŇ~Œőu?ƒ…EáuŚeâX˛DA”JĎşéŐ{ó=˙[7Öß2ö۳ߙn+íŢiîńiűúăŁeUoőżśËQwmčSŰ<1Nšr$NłŻpłďHP `2ţâa¨†ů:šwMm~Ÿű#űyőPĚB„ŕ\ńěp0Ď $˘ŇŔđŚ4Îb¨ďúą{7 \b‡"ľ ­Ś?­—}MŻČEšŕ9 Ľ:G9ďÉËvŹëŠÝuS[ ŹkÍ[÷=:=U3AŤpźUáÂJ¤łÜ(Ÿ“[ÉwômCÄzÓMnw WžSV ˛ëŢęhFĄÂ4óŤ[ݓ6ţÖtƲÝZÚÚl !c¸„÷“섡ČO.ujŽŸŽ™ÔD‡‰ovW›ĎĎö§š{Śâ v魗g°—G z‚Ć›ěŁYR*Ճý!‰ŠöŁ6bIóň%ÄŮ qć žýFyˆ dűڂ—qśÓ-|nĘ Ź{ÓżAžc‰§ƒ˛SOGCgƒţl RI&čôXœřRŕž-šl`‡ÎI™ZŠ ÝZ˝7ߢdé%ó;Goy?Ô,9Oá1s†ń)ś}p[߁UL‘Cmşq3IŮßëöŇg¨NĹY,œBÁű )K0­IMZ˛aŇŁÝľů-7’ď‚„Ł"‚:Ᏺg[óWÓÄ#yEč#ŘƒľubK6Z‚}íÄ%ž\Ěާ9N\zż˜­/ŹžÎżÄ~Ćż§çDŽ+:Íc–LREęÜŚ'ÇgljښvÍE §öşë] ÉJ5{wŐU”#’w˜ú]iĺoë?›ŰĐk–kx"ťĄ”š˘ŰÇ|ÔÜtˆ&)´ 6&ží€zШžípÄÝŽśöœC@l]^{ ¸žwkÓtށ†58Ϛ]ÔąÂřÎ]ÔMcś†‘6­ŕў '-?”łĎłn˜ŰyŽÓyűˆ•3á[k^dČĚMŚsúß;e,1$d™éö&vU˜łůőFÇ/˘eýüš%ţÚxá Ż–Ý6n(ş×Wpiötřr–ąŃ, tĺěę.$Yi\H–ĄQâ"żŃ~pĎ}CÉM ֐ź/>îšçö éƢMôŠŻôÂĆůBă˝|r€=Đo@„1wÂh€S•&ž@ĂÓV śž´ôÎ(ýŽ–ŕ2\ˆ#KŠ"ŔPëŔKfÚ¨Źn–ĐŒo›‘ďr ˆ6%ÔmÍ5ŰjÍ&‚bá({Vüq˘—Ÿ%ąeS‚@ŃYé˘dźáeQÚŠŇZtžmKí1˛Ž‡ÁhÎoňuŇU3íŐĚÎ<>ĄBň€N(¨ŐüÄfÄ؁—÷sœüŘ˙n÷ ‚_XpűO#%Fqq,źÓ­‹%Ş3źĐ¤[gś3ŤĹŒŻp‚Ttždü¨ăŐNĆ8o„7™ńĚ]•éĂËöYUž9w$*˝‘k‰v˝ÝŹPÇLăFüHQ#ş đhŽÄbÁÔ|EźG&”LÚÍe˜Ěs‹ă•ŽJhĽÔÚ3…Ë*çqČ-ƒsą&ëoŔÔgډéÇeœ?[„4—´  Ľ áŹ& BHFëŒGF„˙%rZgźđ)° ŞŃގŤŠ+ˇ4ół>™Ă3r…ˇËeŕ [‹]J-™ľÍQź běˇrœžO8˝9ěmlőkˇPHĘXŠQ„0lŕ âßď G›Ö’BӒň  ľŢ)VhŠ‚§É×őœśm‚KĘŁŔJú˝˘4HšD ,ݟN?F„—m>¸Mrw,mĚ<ą¨şęW+2I˙%9%ŰŮ ŹźětbAĂ*(Ô҂ˇœâ嶒š:ŽŇô掛•äúN¸dRˆ˘ŘÎąÉŰ%ْďéóáő٬ևŻŰëÓĹňЙ()k'*§3§ł;<÷K‘¸Ÿ{!ęćŰáYž”3ţüžGBÜć˙´Yüt7EswĎěĄ7÷w k~Áǟox5Ŕˇ_Íoż÷ćqaî,ĆëúœAš†ÎAČz lŸÍqť¸}}ú›č˛ĆŽÇšBŒŘYČ âŔ8ˇ}@#jU­çšö?LŘ9Ž…#DrÎx—;‡fh?Ď ؘ9Ž4Đ{€÷Hc¤ç07%h6ZľPĆęcł˜gđ‹™júĂ4Î>t E•(qŤ…‹}lëw ç#=iЌŇćĘ̈‘~!ąâ{‡Ăˇł“c /…V$Ęš eŹ>ćÍšŒv‚řłZp [ _őQĆĐĐ(ŞD[-\ěƒ7wűq1vc?1ý´˜űç€ĘiQű˜ëÓߤ‰î5ĺmȅ‚?×IxęŐQd%ŕ÷˝4y8$ @ ´dáU*l`­ Ç62Űđ„6ˇlą¨FśÇתf˘kŠůĂŐ`Ò;Ý?, I´ĄłŢŐjąńńÁĘWđEďĎbLq4€ÂPŐ}QďUËł–tO“łfł7Ë‹Ú$˝ĹÍř I ąof€TŇ¸ď<§5zĽšďç1Ň0ኺV"uÔfU u,>HŁĚ¤/I žsšő!chÔ(T˘FŠ.öąY|zˇđCęFźřčťěk?Oä7ŢրąöLÄ9.W˜{Î8Ş#JnjŽ5‰¨oĺ0š3„;´"Ľü̆]şOZ™ćŠŕ Źn!|×㑺LŘƖQR I&‘qÝ`Š9ąsŠĺ5ćМ…AEyF6z.#‡QeôźfËTĐ$ž˘Uff-—ŽçR&š3$_Čĺ4€Îáœ,ĘvŠ Ę(.˘ăd<@×ĺ<éy.˸QÎ03ÂÎnA° řr…L M*2Ő5ЧÎĚ2Ek–éŠ$ś„Ł0.œ Í Nf>Ő:3Ë­*sϰ˘4—§y"aď™qz N“™X’ŇŽt(8Íâeˆ76Ú:ë‚Ó<3çuŐö’/Ĺş §Ů{Y×؊öYěŒÓTŹ0™*^3Ő2ƒűĹ ¸‘ŘMĆú `vóXJ¤h dfn-”ąř 2ƒ~ĎŔ65>dźYĚQ¨DR-\ěƒ7÷ďs°— endstream endobj 109 0 obj << /Type /Page /Parent 752 0 R /Resources 116 0 R /Contents 117 0 R /Annots [ 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 110 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 386 706 439 720 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 111 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 678 148 692 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 112 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 212 678 239 692 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 113 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 212 656 264 670 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 114 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 287 643 313 657 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 115 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 587 152 601 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 116 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 117 0 obj << /Length 4070 /Filter /FlateDecode >> stream H‰”WŮŽăĆE^őýH#Ůܚ0ü`;'b°`ÄKx)jDC’šű3’ żßĚŠ…Ë]¨‹ŕW$ŤşŞşN­_î6ow;k"ł;l˘((ŠÂ„řÓÇ" Â8ś&OŇ tqavçÍŰŻúÔT=ł…ŚŻ6ożů>2ďű xĂ‚ŞÍv|ü¸ůŮűŢßFqŕźß|‘w)ŻCƒăťöVż+÷ĆßÚĐű‹}bj›áˇ;”UsńˇEPxďýˆHć›[ł—/5´8‹ß(ʢĐűžŽÚËŢ|˝o†Ś˝˙ťżnžŢm"ӘsAZĸHD61Iœ.I ,Í­éęÍaóĺîŽb‰utş[TĐ5CšŕWíŐß:‡â”×ů ţ7°* b2œ>}ú?ˆQoߩǓ †ŽÝŸHTľńţŕď~]ŕŰ !‹CVŞO¤ŮXň˛!CôGEÁ‰¤9ńJňb湝ߐ“ČÍÖ.8Ş@@͋ĐKŁp éĄ ÍÖ|A—˛D*â<ôţkaŤ1ߕď}RRű1s“—ŐÁŠ ŇĐţßţÍĂ"°aVŒ‹9Ž šě;?÷ZÄ98Ćó/ř9÷ŽüŠĽ˜ˆ”2ČOÉôfř7˙šVž.œUó×Ë ż{–bvtçŘChňWÄç‚ 'Ga77BA¸ý(Ž-?‰ MoŞŢŠ97ƒ<6Cś“b‰v[ÜDeZ°ĺoą*č$”… pÄéŮ™¸ŞÁľşęX ΙG%^˝˙LL=´Š?)­<_O5ß —z¨'}ŽáľŢÉč5čD)smťĄ+›Á\‘źŰŰic&JT^čţ“$‰ ŒťűŁMÁ%#ž żŮB‡˙7Ć&ńşÚX<éŰ/ž$Ín…’(Fv‘7œ‡ŢĂÓäI—šO>ŠEý/žiŚgđoE%CSÖŘ ŹiN§[ŤuĎî™.ŢvM}J:Č-ˇiZ‚ĹŮ;°ě ¤jŰnß\ĘşěähÓ-°ÚŇtrÜ@0ůˆXśňąbÓ>ރ\`#b0ĽAĐ䚣ÖëŰÓx†Ë"n˛šýľÁMĚší˙žžÖ—}ó8`VÂí™+!”ýsT˙ą!šGžĽ„¨(pRŻ<™žů]žÉ˛Ô#Sř`šG¸üBő›-$÷Ç˝~ǗŐpĂižUŹgéVÄ,ąšo‡úý2<Žż0ŸŹÎąŰ}}ęÄX$LLE2¤œť˛Ü܃MĽ™r“¸ÁĽN”7ĺe/gD­M3(ía¨/ŚoĎőÇc9€¸,rŻŞ÷“…œs猴s>P5*¤­ őIń)<Ń$ĎüźƒźTüˇ“n&!žĆHÎÚ1_#/<}i›^u•üƒëş kzŸnŞrNŞ~m†AŠĚŔçĎćĎm?Ŕ bjýX.UŰE&JÇVŠ“Q*dxlhŐ˘ëuźĐČ::ógrŠ×œŘGňĺjÖťP/ćF¨KfůŕĂúX2žđBŸ¸Ý5ßIÍ˙@<ň~ş šŠü odu%6MJ´[ߨŁÔł˜f„ąPŰ ĂՂkŰóhŁB>{-Äű)Ą2Ô3JęXŠIá}@Ą°Ô`ú¤QÉÝ Ěb\˜3ż‰J˛Hçˆ\ßşňôĆ0,¤ .űÚhęý\Ÿę7u (UťVß4Š}>ŠöqLeőišż´Ăă‚GšEšéč zÂ(ŁŰńő´¤šÉsNC­ě —X™Ř;Tȡԭ-U\Óš/ÂĆąŃ:ď 0`C՞Ż(%oĚAŤ­S9ľVím{­GĹ~Œax”•Ú%JĹ嚪ăă’Î%$•{P˜ĽÔŇúĄä‡ŸĘVsjőűo~L_ŢđwÝK-Œ”—Üzˆi !™-3ááěL˝˝fQu•ᾏ*gyRŞŇ))Ů⍠­řľé)UöeˤV_;Ő%o(ŞíT6Ž` ,§‚A&Ä ÇAoç‘ÓŠ÷@ĆʊÓĐű⁠{mδŤXžE­ˇ× úÉĎ)?”¨˝vŃIĄbžÉî„M*˙DšŃ`@y4‚HO8[‰˝5ű@EăhDSŃ3EBŽĘ1ŕ¨ąšě#ĺ\iˇK5Î58řTć?ű—'݆ô‰î= RaG¨Ëƒ);­ĺ彟ł Ýđ^„‹,¤F ‡nňŞ'G˘ňöTÉ`e‰ŢOZX˛m“÷0Œ!Žűڰĺ4`“q˛ˇ‰ ŁWtđţÖ)ÔŮ_Č~xI%úIČŁ€Q.ßyyĺ…/ł1_˜ŚśXśéËűeŸ%•íDłÔîѨ [qâéÔ~”ţÁW‘nJŠÂü:óúâž„ŇÓ¨LS]Ë-ýŹüĂă&|ó“ě˝Ô(.c…śĘB§‡ŕYŠ/‚"-,/ˆúeTýs“dŘ\O "ďč4Ř'´ŰýPR—Í<wéˇ6šČśĄŤV:󷀺áK]Väi´Ž˝Ňď`ż"aÂ^é÷°_5b62ŒŁ{ ˝ĘąÔń2Ç}ěăŽHqpLčlNčlJhKéěéüm۝iM ą ĆŹ„ÖND^k‰9›;@Ć ^é¸,›š†•Ňď`ľ"aÂJé÷°Z5b42 \nďĺé*ÇŹcăeŹĐ2›'&Śé!§Eąr3VnĆ*`´"ŠžYžprR2ÖžNďŕÉdFDJSMuJ0-Š2ő‰eLRÂ6lSÁÖÍŘ:Ć6ĺƒ~Ÿ ƒ8JVéëŻIéw^7b4Ň!’;ŻsĚ:Ö8^˜:1á IÓöařf„Ż řžó3ş …10'BЎ;ć¤îtÎS.I؂ӗńě€UxĆvëĐnůK§§ĘJźĐuăËƃU°•~ě ŘJżöŞŁ‘(VQzěUŽYÇÇ+`'"\}ĚćíĐ.F)A;Mg´˙V~BžYôŒWMo#7 ý+:N ŻáąăŘFNŠ˝, 4@€íI™‘×Ó̇aÍŘŰßŃţŕžGRc§ął{ńX"ERä#ErŔm°Ř 2HŮľ- ßzAҙG”€s*ŸîrćčNätľ b_UłŹ_füLŔÁłžw|ˆcrÎpń ¸Ř,f‹k€XÂöĺí-Ń?Ä # Œţ nq6rśX] ćČą@›łZߖp“n×4úÇןnĂČqCÇčŁÇוŒ7”|ŽS&^3˝Ůb“K¤˙sôÂë9ć…¸Ífœ&ňó ™Ű ůkőu8 óŔüÓrĘˆ>Ă=ý˝×żČ‚úÂë˛v_Ü1ýô˘˘vÍGł6›M˛Š7Đş@Î7xćůŘĺç 'ˇ çsׇť%­čw^ţ e+Šľý*5ޑČkpŐ(oh‘N[y)ÝťTžŔŐ°żgZb¸Śî›ŽŞĆTŞ´G;Q\Ú1č^íô¨r˘ ČŞ—7~eť%S}–% Žvr–ťZlzşŽĂAZ˜ž5ëőđ XšŇOż˜ËŇ ‘Ťëş6¸§n(vżŁtôómGŸáašł1YgŘ)!ňČ:DÎÚe(ˇĚ=C>Ďvá0uj˙oěQů˛Á"ŻâŠ~â^BĄ Çâ8Ä ě…ß‹ _T˝o'Đ˙r‹§ŸŹsĐĚć ŞÝÂ7mJ÷bóFœ ]Úc%e-V×đ+ĽD¤÷ľ Ű­m}tNp>2Žąs2WąX€!Ćת"3ä‘5HGçU˝„ ŕPX/ńgÖG2RnŽĄe …Âvpuq ń}ÉFđÝ9D üŸźmgh:¨­ž13ČĘ*ĄfTáýĂô&ëœ0AŠQK˝;?÷üJH‰ŠűŹőűž*â5"žéĘPÓyx” ßşZÄv/ĆŔßmŐ™ë}b:ÜqЉ$ț¤Źţ燠 _ŁĐlťƒSpÁ ¤E{ÝŔh¨G×TyŐ `U­e%@‘”@8ŻAœÇ/`^ ‘Čš˛Gl“ŻD#ôLC‹fë…‘| ôĺtŤqM𑠤/Ô­KqŞIAG‚ P‹î´ z R %*ƛłěRœŻkA5ˆ´>ö‡îždÓńÂB¨-“ŚČ,qţčŤZzËŽeđœeŁŔ`Đë-ôz—,fá­žă‹M„ĆGwÚ!ćU˙ŽřćŁ ss!ő˛ňł!•Ťzž˝Ř*Lœ‘{ý¤edkźLMą1ËŃR”ĂS2­2M‘5M__bœŮkpť.&AóJEŘ曋űP˜roTGגÎÎ řLź,>Qé"<ąÓÉ!QŢŚězŒÝÚ RWHœđMdbŽ;x ŠńDŒó/Ý ĺ­ŘyÉC”‘˘§á’ÜsÉe&ۂöPDHŠŹéx.,@hRu"XčŠĆÉP ^~Râ!Đ󙅨ÄsWqh49_rH|aás‡.с?696ŇkŐž•˝J™ŰŻ*^ŮÂ,˛‰Ă¨ĘMý5ÎÓäčrG—SĆ.1č˛Wś‰k†şŻöľÝăÔŘWd|!Pú"ŞĐÓ_šţ×z0 endstream endobj 118 0 obj << /Type /Page /Parent 752 0 R /Resources 121 0 R /Contents 122 0 R /Annots [ 119 0 R 120 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 119 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 133 501 159 515 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 120 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 180 501 206 515 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 121 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 122 0 obj << /Length 4486 /Filter /FlateDecode >> stream H‰ĚWˎäśEśő\RÁ”F$E=bdáńx °1Č< ; ľJŐĽ ZŞHŞnĎw$H>!ż™sIęŃ]Eu˛0iLI佟źszˇŰźÝí$lwŘćyÎ"üš×< #Ľ$KcF™ĘŮîaóö›^ł˛7lëËÍŰď> vßoŔETnśăëÓćgţ)Ř füK ŁPđŚ85ŽďÚKyüXěY°•˙>ˆą U°MđěEY7Á6s~"ąď.őŢîTtRâ,žB$"⟪˛möěŰ}=ÔmÂżěţ´ůvˇŹf›, uŽ`ˆ…ŒYŹâ0‹cMSÉşjs؟ۭ8@eaˌě'ŰDNfFÖŔoÚs°Í ,Ä)Ţ1~kh…ЧÍc@żƒUęíçń8T¸k÷žD•ţť`÷×E< [nÉÖĄąšÔ˝ŃÍL’—y’pżČĂN¤›c^nÜý†œDn–rÁQ†îÔ4¸ŃŇŁ,b[ö5%‰”Ť4â˙–Đ•ąĹ}@—T˘sůäeç`-CÉ˙Ůżi”‡2J ŔŹąŮdlfÝ+vhO§öŠnH¨6´`§âw§ŠőÇ֘“ń'8;ć=pä3Lăěą8]*Ú(Vt•őFy麪NŔ‘sdî+:p¨›jë:rތĂt¤7î şÔŮ8°’9Vr‘Ţ˙šřŠČ0Öš4ţpŻBŚaŚX’FĄ$Äâ-Ň$ĄŠuĆOŽ5?]ěłb?VŐŢ˝ť' d\h^:ćł}A‚ß;ť¨Oőđ…Â/’ aýžąŰCŐ9îŽÜq$•}iFůc‚Ei˜ ĚI&Ă8F|)ć‹ČżNĎB•ĎôD†2ŐĎ8ŕ$IüRŞlŚgUŞ–2{%ŔUĄJgşTÄ3Ž8ĎC‘ű%źFŸ˝ °7Ňbľ^Xé㘭đqĚZř8Ţ-Kţ-&a–˘Ź$š<"ښ—N•ÝUŸĎěeÎÚŞ6[‡i*„+m~]˝|Ç„›;Ÿ†úCíđuďŕŒŒC6wăNó$T@÷|EOú‰ąžótĂ5]ŢóůŒĘŽşÍa%\sL`ôč8Óoë¸<KG ˇdbq^!ćŮm'áŠcJoŹĆXBR.ćt‰ŐˤôrĚvř8f-|HĘľTD7•žšŠâ˙!U6ŮíT¤ÜʱꪊľHč'v:A—!5ĐĽ–€Q*ĽśsoŽPŽŚ”¤ČVZS˛Ů ôĺj gkéo=Žž’‰> cëqô•Öă‘0ľG_i=^+F+m%×Z‹—cÖŇÇ1káăxĹ`ÍUœźŽby…b\ŠtądžŻĘâüąjžÎ¨H2^ >VswP$•Ŕ'‰ćtÚĚęě`ćł"˜adÇF…Ď”`4Ó°@âfaxď-sŐý¸ţĄ’Ú6e>S̑۸”điűqéč+¸ôIqéč+¸ôH˜péč+¸ôZ1Z™ˇń.˝ł–>ŽY Ç:.5Î':ů/ŞŤB,5ń”˙+HůJé;W ľřf[ŕôgţg*T’Ş(ÓŢ=ťÇЏŇĂ|Ý&<|QcU˜Ë4]~,š‰%”P+ł\űĄäč+PňIĄäč+PňH˜ äč+PňZ1[)R˝%/ÇRËŰK-nsx „ŽŚŃY5f•â ƒ’N&,a”ÁÄâRcKxz… ´Ň8_śŇüYˇ>,N€bÂ$˝7żU QĽhˇ*‡ŤÖ,rĚ:ŻÔAĄĆ6ţ†/ŤÚX÷\ekiH1ؚö;8TŇSa| „†&$dż¨‚a@ƒĂUůÓ9ÔĆÔçĂěH÷cÖ+Áav¤ű1ë“0bv¤ű1ëˇb´u!OW†K?ÇŹĽcÖÂÇqł"ŠĆh,E–ż‚ŮĚaƒŢ5htŰß´vŠĚ_Bő§Iˆ…˘ć_0<>G!A™.ŘťA2ąƒdlÉ܀ťĂ¸8*'ŠŽ_ˇhâŒÎüuôŒú$ŒuôŒz$LuôŒz­­L0Ôe+uŐĎ1ké㘾đqxęj*)ŚcŒb1őc‡Q=cT›! *4sSŕŒLDé7,§jžhlxŽŃŠ_łÔ˘Žî@%Œéë =b\ÁřsŰŃu1/P#3~w2‹j†˛Lń¨Íî~°˛ŽFđWfŃWŐX{›•…ŹˆČG2ŕÖÓňdĽ ečĆeҌ÷TŹ4ŸWŁź˘´Ďéŕ @ЛŽž’> cz8úJzx$Léáč+éáľÂYŠQ-u~+=FŽX†9ŚIŻ/ÝůÉŃWüä×aäđÝ1zŇŃW<é˝câđÜ1ůÚŃW|í˝câđÜńEd9‹ /LAß%*Š€ZÿĿą ŘĄ˙gţĄžżt€´Ű$´}ƒąŻďúÖžŸ.ƤĚä’†=´{Ç˙9’Œ=§KŐłĽ‡s¨î”Ą×+]"|\ÄŚśŮJ›"ĺިŚ|B%ŞŰŚg2ŒCɊfoŢbÖŰ'F˙‡c…g?°˛hŘß.&ĎQD¨9RÇűú¨`4ź‡Ëi¨ˇ‡şqLÔ MĽ@Gݐř}ĂÎUó†ęBÄé2ôČkOÄČj=Ö?1Ď ÂÍ đ††ÔÁ>Jť€ňĚžć÷lłiq˜Ţ|ŞŁ‘ŤKĐśn˜ĺ°šœí˘3ľy¨­źËišËž Ţżqçű ˘=YN§çŰFřÁœo*N|jo/ŇNÝš-h™PÍŮgwÁ`Ť°YĽ¸7\8 tăP.ŢăDţý="‚Tj%čHG<Ei{ýщn˛œ•¤¸nqŰŘô€-M=ďęMŐ`7oś¸dnp"žĎ .2•ĆĎŇF3q‹;3éO>ĘŹŕĹťz`uĎúʰ oœ%oěˇÁg†–Č­dyRˆˇŽŠŃokŘXL^ëf_—öÔ`A˛[“˙3>Ýd}eu<ăŘć\6ĺ\fÍ<{v,HߌŻö.X_›áQR 51QPŽ60Ľ&p]{`AŇřĄoŘbg–§z?CĆvË~ŞřPM֚űŤţ\•uqÂĺR٤Úýޅ´CZ3žj ´¤Žţ÷ƒ{§Ě—Č{SÄ2ltý?Lľw<Ž'p Ż,oYąÁîiˇp‹g›#—OVXŃĽjŸ“ü¸”ßŢa-É„ŞhŚ“ĺ¤zăx-”qďŃŞ S‚nčiŹĘř‘|ţ\Ť#U°g>Ł„ő‘ý x`] t@ ÉDácűęTߙEZĺ* .ĚG„pš1!‚żđ[Ëm3G S™ÝköŕNUEV3­“ŁžF;9瞋ć#plžxô˜XŇT~>SrHŢţJÎËxý@ť”ü+ĂPŇů…V''R¨‡^(‰”xźeœ¸Ö6$„íÚ ‰8~$ś}`˜´úíŐ˛ăśďůŠ9R€VIiľDŕƒÄ@Ā˝‰/\‘‚hK$ÁÇnţĂţŕTW÷”[‡Ä=șžéWUuYIظ^˙ë2vm˜%nĚ]ćc(ZďgßJ`^mݘä(ř°˜hřżč¨<~âîŰ ­Ăd° „8ßH*ů´™gO€3“gˇBk“BBbdŽčÖe°ÜoTšuŔ7őŠŃÜăfĄ¸•ľî|mrȊƒZ8 É1őëŽŢÉZfž ö>0Ą*—Wţ̤sžR}ťňrödnÝ{QÜJ¨ňŞÓŠzš’ĹJÔŇđł?W !ý”â÷7E´ŕ×9ý”“)R}#!€,Dö@ęŐ%Ş}'Y&W˛ Á_ÂŘĂć$*> á(ČËĎ'BťĄY8ĐĂ=´ÎfĆP}$B™&Ľ‘Čă oÉ{şÉ;}jY˛8Gvô´ŢL¸‡gv"š&ˇ#šm%HˇĐL ‡Š‰žŹBýĄđĐWÂC0Sč‹×ĽŤž>Bk+jh‡ľĚŔ˝@aíîe!P\ÁźWdÚ˘’R÷YŢhÔ$§nůŇ _śĹýŕ“Mi”gĹ_ŮźQK÷4+2Jˆ‡íĆň}`ůBU s}ň!WÎOůĹş¨U#Ş•0Fš´ëŇýNĄGř@oŃđŘŞ‡šĘ&,}D-€žc4îmuţmU‡{gýž+žs÷Te–ü0 \ BänęŽýRďbɊĽĺ^ťĎľŞżň‹Ž†“iiU.ŚDČ•PiÎŤAžą} ń\¸LŇŻ ÷úe"q9Ü&˝•˛˛*ď&>Ղ@Ĺ´j9łŸěoß.U€ ™łL%ŞĐğaĐČĐ=ŠĐ2˜›˘ír˜GŽËj;Üqkœ*ĚX.ƒZ-YQ†˘O¤Vâ Ć[¤œľ“AƒúĽn*qŽőĺŇěËôé”UÂYĚŐř\˛ćşcßBß?Ű 9O˜!aź^E› F€o?N0Z%É8˝“ahNşWœT×?ˆÄHd|"ɚĆŒ’gĽĽ#"Œ• E’`2L‹Rë:­ź+Ęş‡(ŕƒ0°}qç S ĹvcĄC„̰Z’h˛*‡ČĎ!R]@Ň^$ÜÄ[HŸAI~ŒÖQ< –FGďT Ȕ%T]ęŘ5>˜ĺał ĂI` hGFÂösŢƈ„Ň"Árڞ7‘1”lGś5yţäz{-ćočřůŰ ćźŔ•@Ŕՙá ü5TWTˆL‚ß%.ߓpÁľ-Iud=k{!X$5fÓôš|ŻŐô‡˙-m¸;Žƒ€quŸÜ,ń}Ő4y[ٌ “@k s ‹ \˘÷5 q苘…‹™ďٗ?†G‰łŹ;¨ŽĚü+5…ú-Dş§q„âQ@ŸhăáĂPވŁG–ŢŠkUĘ ioAšx°bŒP9P |×ÖqöEz‚VéňŚŚ/„”wz“‹nőbˆěQ°˛­݋á`“űÉá |Ď˙ö¸yƐ˛ZŸIźűUř€mčča@}ĽÇŻ \sŸ}rp3~hDŚ;ĎŢňŢ)§hö… #*A‹€&bćLO]݂غô Ľ:íŐů<ăş&oÉqƒIléŒwĹg`%¨´Š>!ÔO}7ÖýÄńż‚&…ĄfŔÔĹМQ^ţ‰4Ąň‹Ô¤ę}N_ömőľ ™ŞÎ›ŽČ1;M@7S4bO8€î%ŒL,q˘_d¸‰“zişýÚĹFżŚĹ i2˜ƒ°ŞŤśPľ†đ?ŤđU5%ľÓž)%CQƒK‰1 Jgť™íü+é>Œt­HŸŇE[…ÔÄ×Gݙť÷tőŃ•9rž1ăƒNs*Jq—"CoL›btýÚ-‡šÎˆw$éŮ&řQJ.á5ç˘L /8Y‚q¨”™1cX(7§Ă+ÔÝŐú`ŮeĂľ˜˝˝PĚS˘J÷űž"HZ’VŇšP†üąýĺí˙ 48l& endstream endobj 123 0 obj << /Type /Page /Parent 752 0 R /Resources 124 0 R /Contents 125 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 124 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 125 0 obj << /Length 3152 /Filter /FlateDecode >> stream H‰¤WŮŽŰFĹźę+úą9°hî"ä!öx<  F(˛uŐ ™¤tü†ů…ůÍÔÖ%y20ŕKőR]ËŠSUϡŤ§Űm¤BľÝŻÂĐ/ŠBđO>‹Ŕâ8R›$őƒ<.Ôś]=}1ŚŞéX Ćjőô՛P=Œ+8 ¨Z­Ýçăę­~ă­ĂŘĎőď^řĄîĘădáúś?U‡×e­źučď=8›™ŒˇÎŕď°/+ŰyëÂ/ôƒâ–zu˛5ŻźÁ]ř†Yč7ŚęťZ˝ŹídűNyżl˙˝zš]…ĘŞUžűiƒ!ĄF‰JâÄϓDŚ›H fľ_=ß~ÁqîI”Łýh[X ™ř˘?zë” á–źţˇ UŕǨ8.<übĽžţS<žř1źľýŠŞVúoŢö×E<@ˇ‚ˇŮĄ =*_ř˛ŠĐË = ’ŕý°đ3p"žœč˝˜ir÷tş9Š'*_>`wS: ƒ5Hň@­ŐwhT„[yž ô˙"?QJ˝.<|Äx1Ţ ƒŮÍâá4ňÓ úŒƒÁ6¸ń5°…YᜠŇfLEh¸ţ—§~°UŮ¨ŽŸĚřěÚo™żInĽ0pfM[ëĐĎŁ‹[ăŮ­1ťőÇŚ6ƒx5bŻnÄg1x5öS}…aôsŞ–¸?ŞG;Ôt0ë…Éŕ’lĐ0š¨W•Ç—ď'ÓŐŚž6&őCg ^šř"ŒŮĘKA5P pŃ׎žlc'Ě'„sg'e`űmŸ0Č9oÔÔĂCľ­ŃŠŹ<¤Ś‡łĂ6łĂ6ŹÂx:űaR~BWäZľ}müJmýhÔąŹGu(QŽzÄQŐu˜ABscOˇŚOƒQ=9ziáÎ`ŽóĘDn}´58¸T՟şIő{Öuű÷E¸ßę˝í34qIŇ 4>Ÿ áĹ b6¨ŕËߊłŕՍS˜glËđvjw|ÝnĘĄŠ)űůÜŃ0Tr˝ BŒ,ý.tšk cF^{ë˝îy4`úîd›IíĚž—°6šĂFŮnúúT]Ř-¸ M6[’ą% č]T~ěPIľEÍľđ°ŕöł™IwÁltŮ×`ëZ#ż¸˘Ź;¨¨oŮq!;Ý˝űqú&HźĚŠoUđDĄűC€’p¤şS#xń73Şr@,ĆÚ8ŹoüôëŃl€¤[ ܃ĐBם0ĺ!ÇƃŠŐit˜üřţĎę\6'óLПą~eZŮQEiŞęÓ`&‘–Kt¸$!‰žÂ܋űśŁ9+ţ7J“9>ăzo@j•,z/šl4ŻźéiYDŚőUşS5’2z<€ŽŮÇŤó&čĘ Ź@)\čn÷ęŤÓ“Š&Sű3)€ .Śá5ůÉFŇZ@Iň˝BŤďť}?´%çE -Áť“,„ŘɋfyĄŸĹ_H—-88kRUŮ)Â™ĂTqŠ'ßëěQ Հł&5iS›ąěN<œ‘‡EŔh˙`éč‚ŒéŮ Ÿëťäž°ÔzIStŔ ţôˆb<$”}#ő[C›#źRĐË´B×fě@žÝˇâ~tíŤ0\Ě;Čľ?ŔuŹ˘?ýk?ÜĐYâ2}Ҝ¤! Ą‘0Ö7$Î$^xî8Ř[fȢ“ ŒƒŽ‡˘ňĄ-áÁüf§M’Â4m2bšËáîshš‰S6ůáË9őrnßÔ@sŸňÖ7ÝŕüY*RSŠ›ËŔ ëCjc;6t7š$ł&Rtřů˜ŸĎîČÚu ˝•h~*˘ MôÜa,˜hrĽ¤Cgsَ“5;š`ž$î ăetvž\b&˝Ľ&v4A>ť&_GŰĄŢˆîÔ2ůQÓŤqÎ(Š…:ÁPdŔƒ¨ Z̓ęĚă•ůrÎCIŽëë@EóÜÉÜ&ˆäXđ˙`JŒĐüH„Œ‹Ă ňo/żĺŹf•әłűTË"dа:B¸˙ fAäh‰0O °háBĎO¸Ÿ÷"×K\‚\qú ZŞdCŽŒŘˇß ô.’d\y#"Q1$JăuĽ1“šÎb Ž„h×ͨČşO8U8ř˜.ăźpKĂ ˛9"˘ńž…|¨ń˝U´ČšÝČ=ßáw˝?j\S„k̈́ĄSb!śź(G°;Őč™ăí;^żO8Úý3I‘ŮwÁYäôłÖX{Š´Š;ŃŽ|ÍĽŠ7CÁŤŞ|•Žĺţ{$´MA‰\ƇJ;œÎ˝8Cę˝&Îăî¤dSżŁĄUäÝaß+ä§śD )d´ZË˙ß$ä2ě*ˆÔU°kDş¤ÄëĎ´(§çąÓAËq¤Číp™¤VĆž Ÿ-€ňČéňŞÓ Ľ&źÎ…O>H‰ÖHźü3|šzéÖľ/k\;EN“%(73áÜśŇĺe.@ Ł´UŁ7ÜG´3púŢŢďýE  endstream endobj 126 0 obj << /Type /Page /Parent 754 0 R /Resources 128 0 R /Contents 129 0 R /Annots [ 127 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 127 0 obj << /Dest [ 213 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 211 128 228 142 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 128 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 129 0 obj << /Length 5102 /Filter /FlateDecode >> stream H‰źWM“ŁČ _ő+ęSUP@٧™Ýő8ŽŽmÝź>h$4ÂŃ-ڂžŽőß°ĂÁÓ/Ą>¤IűâٍŻxYdĺË|ý~łzˇŮhĄÄć°R*łÖ ‰˙ÝĽ•™Ěs-ŞÂd˛Î­Ř<ŽŢ}čŘőă2)úÝęÝO÷J|éWX+%ˆvŤľż|Yý%šO×*Ďęä×TËL%§íÓĐâőM÷ź;Ţm÷"]k™|Ją`JK†&]—ř=śťö”Žmf“/Š"HüôÜî§' ˝Šń.~•*•Lî›]wڋöíĐv'‘ţuóÇŐ›•­XŐuflŽQ™Ň…(ň"Ť‹B`§•çfuX˝ß,$ Ż3[蚾ŸžMYúL9}ŕ‡î)]×Řžo%ç´Ŕż-v%łœ6N)ý;L›z÷ŁËx‘ĺˆľůHTťUň›tóˇ‹óŔŢěO -Ć îŠ" MY”a0!ž˛Y‰$Rä"ŮRËdL÷o)I”f­/Vě2w´˛21JŽÁ.k)Öâ{ú(MP]W2ůÎ !ÄÝöKJAš4§÷” iv6:3R3 ơŐo֚Źńfi}ŽAJJOߍ­d:ĂÎr#“?uűćA|ú(>ˇCďňS(Ö*+ĚB_'ďUyö˘\"Ď)ĺnhOSÄK;Ĺ×ćÜSąĺ™Gˇđk#úç§§î<4{ą2˙ĎÇq›Ó)|ü—řűssĆM…$şČörlwÇé+Ć˝Ť‹˝›°w3í}űđĐ˝ôb86âŘőƒ:ńĐlĎ'ўÝůq;Ę`űš{Ć5OGŇZfŃâßńáínű \묚öb’§Ftci˜ä€Ż6ÉôţvŸ ą9:¤—ß”*Z÷e^%Óţ7ß͟_•ömĂęZĎmß~m÷HW{ÂG|ݞŰîš'd}h›‡}˙;!œ6”œNśŚ˘ŃcšK%KT ŞEYYitî+ˆŽŚÄš–ôž„Nm’§ëbŞţ˙áĘ:…šTĚŐ2Ľ”ăc…Ç–çôŘč‹ÇuXmĘ">ŽÂăâruéI(Ť*ąőřÝîRĄŠ”‘V”čRľu]*4¨D\w-*55]eŚĘÇÂB;IkÓa§9TlńŤŞŇmłŚ{ŎŠ­rdęRča$ň ŠżCęš]€Qö*´U^.P8`Š-K@xU,á&ŁsĄ˛×,z_Yđ Ŕm˝„ŰŹ’7JÓ\ŽĐx¤-żGm0rŐ2^ĺö2BQ]EČĄRţÁ1nó%\AFG@cŽ#”"đ€Ž9/kđ_Ňçꊾ@5ڒß`ĄĄó:â(ć ňż\“-$żˇŇůC-1řo,j•™2â9’¤ŞË¸ÍdUł „Wś 8p~˝“CŕPËđÔ(łŇzXghŻÔÄŕA óxŹäy<Ö!ƒű*š‡c0x8Ąy`ËO0ÇäŠ;š÷:ůĂöꇋ†“—T“‡ŢŚĐGrnŚŽsiJá $ľ°5‘˘}Œ¤?§k¤{*Jz÷{ţ:ýş[„Áy&Ż›ľĎxř°ÄĆŘ× âVÄq+ŢhÝľÎTńűÖý˙ěÚŚF=ŕ/&śŒ9ܗ1ƒ‡2fđPĆîʘCs¸?%gÄŕoű靉JŐʆŠÎNJ^ż6ÔůŢÚyĺ’nlîíŹ!;+ż-Ć[çns:šJzSŹq[ŞčŹ/°ź=Z••Śfťěa~ s~ _00™ep90°™cđů‚ČƒȁČ,Á4/Ţg2Gŕ˛ÇůĚ2¸źŔtÂ0¸ěq~ s ~ {œČ,ĂřÝłG´áof„ŃćńžeuÇŔ^w^ĐCt8Ýq ^wž×Ăt8Ý1 AwžŐGŕtßçtÇÝ9|Awƒ×ĎŕuÇ1xÝ9|Aw CНĂtÇ1ꁇzŽłÚ؛˕ÁC1ÎăąÔćńXH îËdŽUŔŕá„ćń˜y|Ö[ԅĄœ`„›Ń <Ž^{Ľnٞź"sLŽĄ…˙Uč/'L|ÔCŠpdUť?Ă˝RËJ^ž˙ěőbGW[÷űs áîČ$d59Ţń9sě–:˜2D‚Půřx\~ľĽHăÝ=°/cMQ'xę ÔăÓXŁaŐoź9őŕZV7Ţ\NŸř?tGę:5ÚbU8ĘŃeĈ3čú#­hOô*嬞rF7?5ݸů - ěpƃ2ů5EţĚí_HM6—ć=Ö5ˇ 6ł V6ł€J[ZĂ/0č(ů(nfÁľ]…Ę´ĆšEŽüŠÁ@ĄŘnĂŔ~z:xaz2á#> Lׁ›Ž\„€3üôőřéËDˆř|„0cn:3">!LoŢ\3ün¸Gzn¸3üŸ†Œ Œ™Ý\„€3üh‡`Ž#„ŃÂDˆř|„ˇđëć€)ƒ– ĆîŕŻ5˛ j- ~eŠ ˙×­47ÝţŘ~y>7)ԙ~ž‚ň›îywźKŠ)%Ű˝xěö‚śŽ1—<ˆOĹçéÍ<RF=áeœ%:ěҢ˛Ý&éŇŇÜĚąGŠŃń™n–JY}Ě]Ń7dž6Đ<ĐȓɧT!™ÉÇtÜéĄmöý„lĎÍtąoíŠŮ‹m/ÝĂC÷ŇgˇÓ-ŁŚ›!M~ŠŘ@ŰÓĄťoN}wžî¤bœ‡îwEWü’|n‡^hőoUţ’Ž˜–Ö Ęóąl< 뿲íEšNQŕD!ăU;ĺťI‹i^ÓÍ^´űéÁ)…^“Ąuk§‡˝ŽÓ•F’cHjZřäc”ZŒÖóř֘ډ^tţ´d7ÇťířťÉާěĐňß lwZ1ćzJőć;÷}UČQ5})ś'Ž]?ˆĄűfhΏ8,Úôtx}ű2M ż•ü—örٍÜVÂđŤp)œnˆ‰Ň2A˛208ăA™ě–Ǎ´ŐF_&3/’źnţâMęn$đĆnąJd‘úXő—čǍx}&řNŐ_{ĚębűŘďh“ŠjW0˝´?çüTz]CłŇôę~łß´ÚE˜:…Š}˜žœířˇƒÎ˛Ř bˇ=žÜ‹Ł;[颏Ýa¸ăÍ>K2 ačŕAoő'ńÜÄÅe íÖ¤ŕhLĚŕÝ?Ú…@ˆ¸¨+‡SsŠ˘‚.űž Žĺ‰BÇëŚX—•ŤéW7ŕVŕĘVŻu[a*, ™3GíN{Ťenă#Ścn w[J’ €Â)‡ťŇtiKĘ(]¸:Ÿ_“˛¨żŔČŐb6#ý<…Ąý˜$ˆ´Őşiač”)ňëüŚ—Ąě tľ6%[!gs3˝3“*k–J07C,ąŃ.-îMuU˘ x ;ĂćéÜl´Ëf&`Ó&9iœG ‚sđUJq¤)¤}…@„Śz*Š¤™ŠFÉPŁ*0ÓňâOCZýŠ"Ć>–˜Ą\đąNˇČýŁ›ŁŠĂ*e=ůˆŁë)JnÉՏůëK’Ľ˘ţk¸áNw¤éô­4 \Eű-W“"śKńŁh×dęôYĺÝŻĄÖ—ňuţ>­pc‡šŔYO1v7$ăGËq˛/Ç8)F ¤ľŢ—VCr3.~Š—€&˙ąâÇÔ¤@&tînrŮcž‘eç€ű‘ť $U]§üŰĐĽ€˜3ľňw׊ śĹ]I˜h˘B^'xt™Š>S,˛›Ρo—ĘŞˇĂ×HžĆ•¤ˇF‡˛-ľŻ&F|„Ô#Á‡ţŁčG?şétŞĄÁű ;ö^ ž˝ËcIĹńŮ?|@@řЖ7ˇ hž†ËŢўšCĚ 1{G;Ÿ˝šböŽv>{󝈝D^˛u&=óS”œG ‚sx?cוľ’ĹO˝;~mÂ/Č1Y8mшť-Č éť-üĄWëâĽTăNAŻRОżňšvj‹Äâ-u5Ä#EŔQěę˜uÁžĄŽ™!QěęŘ]Ä]ś ˛ÉQÇzLQr)Îá ęˆępÖuú˝Šó2—¨SĄ÷”mé2Y…¤gÔŮ?ž‡‰8Cňa,¤w˝Ś˝E ˛ˇÂ>YĂ=ƒ3CB,Ř3ˆ13$Ă=ƒť‹¸KěFś9ÄX)JÎ#Á9ꁉfu˜'Ê@FÄőˇ‘f†ůţZ|.đŮA Ľ—zŹÓMń¸OîŃŽçaóšŒlÜ`čj5ÍÚ6|mş*ńÓnř†ęŠöí dS ç,[í˜ó˝—˛˙t p´8 ˛`Ď@Ć̐ ö dĚ ˛`Ď@ĆîbÚeĽťœxc=ćQ.{̂XvČCŚHy<\kß=ÉT=C˝V”$ŇŘ'ôPƕÂÖ)¸ś8”TűMch‚Š4ňßú§Ń?͋lSž “QŇS ÂÄşH]ĘČâ—-Rœ,6ƒxí7Ţ(\U*"”\Şú*ŐĄUUŠĹ*Úy°¸"ZŃÎĂĹÍńŠv0~a—mˇn*•aŒ÷HQ˛1Öa3فÔ-ŐŕĂWF_PŚQßTlP˙f‡ZŰöŸ&9›ÄZÍ;6ˆľšŒ*) fťB­.^S“úÚo掎ěYǞqěľ ěY˝Śłě{†=f†Ä^°gŘcfHě{†=vq— lę{ŹÇ%瑂ŕňě$Uˇ<{ł=ýěĽú’Ş$ôx J#qT<ÜšęŠ]ő ˛p^A[n熇[ĘjŒ75OY°g(cfH”{†2f†DY°g(cw1í˛(#ăxy”Ëł –ň”)|ťĆ.5 R_w @ˇiKŤ Ś_‹ű˙‘NŻ‹ŻZšŘy˘łhŤĐyŠťYG‰Lć´Xńń÷; ?řHÉÍzšŚ—˛VÎzR׍Ţ…Ăm*^•E{.f†W°gŕbfHp{.vq—úŠÉĽ0ÖcŠ’óHApy¸Ş" ďą)Ź~ďfljŇúEuEŠĐŇ 5W$nŽŮŐ¨ˆ_˝š/ŠQýĂă°ĄH‘á†Çg?,{jTľëLą˙ňݏŠTv݁TđT-d°g€dfH@{Hf†d°g€dww‰˙UŽgŕ=Ś(9çRvČH’ÇąywŐ„ŁššVězŽă'×ěĐĂvHô÷Pލ‰ĄöUşÁ•ĹăłsëŸF˙äŚYťô¨˝ŘŁQ?ŮŚuń_ń¸ƒ÷đčŘp|_Øó:Ą.Ńđ.p\ĄŃ2Ďq°g8ffH{†cf†Äq°g8fwwŠÁy—ŤÚŹÇ%瑂ŕŔńŒš%¤QüZăuISS&}™D[ĺŮڟœđz%ŞHPůvVĎ+z­řóşä›ľiřTňuăKţ˙ :bĹţcřřę˙‡ÇÍՂ¸Tyś [oƖl V0ód1ďG°‚™çŠy?bĚ> endobj 131 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 132 0 obj << /Length 3639 /Filter /FlateDecode >> stream H‰œWŰŽŰĆEŸ č+ćqX4gxNƒ>Ôqěś@Ń GZŘ} ÄщHę(Îo$Č/ô7ťö̐˘Ž‡÷žŮˇľooł×‹…d‚-Ö3!B­5‹đĎżę(ŒâX2•¤a”Çš-vł×ßt)[u–-bÝjöúý“`ĎÝ źQ„‹Vłůđzœ}äOÁ\ÄaÎ?2 Ż‹}_ář˘9Ź6ß% ć2â Ŕb@,˝ ćžíşXUu0ץćρ {¨J÷ĹĐI‰łx ‘‰ˆ?™US—ě۲ꍌfÁŸ}ť˜ VąYž‡ŠŽaˆ…LX'až$ š*ÉZ3[ĎŢ,8 ÎCČœě'ۄ&3#gŕ7Í>˜çPâoƒ+h…1)N7ýíRŻßy'a Y‹ˇtŐjĆ˙,ţ;‰tӎěšXĄţ$3I^fäaÜůB‡œH’^3nÝýŠœDn–rÂą ý ¨JG<ѡGyÄćě/d”$RžŤˆ˙O† cěťâ9 !&ˆéœŁ›˝‡SŚ‘źă`Ř&˘{`)ŽH•3éPF™źí@e˝ÍŤzÝ<™şkÚs_%!˘3ńU>ú*÷žę ‡ÎG’ďMȜKŢ)\×8–ó–™­Krňžâť`óýÖźbëú˘.‹śd‰÷\m ÉGK˙Ó_C\ťŠ%ůŚgKĂvÍĄîMéœ5ˇĘ΁ĔţȗŚ6EżaE͚—Aţç~"%ŕjž}ĹŞš7ŐjĂVEgXżń|fĚ$˙›Ăś$ĄM[š7î(ŮşmvN…ĹWÇcśN’U¨e¤*œ[ٗŽ+hŮíýé>Îětź[ü"‡ŹƒÄRđŢ†źŕî$´wŸzĎ^•ŽPČţĘ6^dżńg\朄j2$ĎďÄČu>őÖülȤ˝aE‡łËƒOÜšLÂt:ë91ŠN[}­­5•m}´Şž§\RźŮš't@dűy¸ÂkŸ†ÉY5ČFíł“öHďÜiŸöáEgC„l•ýbcŘŚézVśŐ‹išŇ›ŁHáęl)VőŮŽ=˜€ŮszwdĄÎNްzÉtЋެO^Ńĺ( ÜÔě@ř=˙ČÖ•ĹWžpÁP Ÿ/ýŠ˘#Żüęƒńű+|Z8Gţ™IÖ7lß6/Źw.Ľląw›bOn憐}ƒË€÷‰ˇP¤q!š+;)ŹĆ0*'ëí^?QőÖźŠ 2żë ‚ŃŹ)ྩCkĂ eÉfž"°í@AT|[´“;ÜKxĺ>4ŇTK[…ýŤĐh˝QłL ç‹Äöź‰o‘‰Pƒƒ]Ł^7îůŢř—ŤƒŚo?łˇf=đQ_voţĂŠGçHN&“*”iÂlטôŽßB×ɉŽđPgÝGf¨ÔčŰ÷n şŽOt‰DEg,‰ĘČřťW|‰~2" Óx  üHőĽ’÷8N2îqź™Žt×ń•˜Q˘L˘QS UńľFçę#JvÎ>PŹ”$˙ĄFQ?ÚĆ鞲 V ¸ćφúćÓ. ,úH>:ŇÚ2•P™’71€öŻUęM“T´Ďcěé×1>q ,ġ8FGčŠ"C$ŽčN†¤\˝yŢI¸ŚcS“ó0gnłř+ŽYĆ ?đ„ó” 3ž@Ä—@şËq’q@zĽQÔ8ËS!‹|*¤‡Ĺ)*ďv€jÍjřý|°*VĎöÍ~ŽBőIę:(#v‡P€L>–Ó bR)"UwŤÂ@ż‡{7 Ua ?¨ ”pJFˆˇző÷9N2îq|!X™UŒ/C°|Ş+éS]˛žvčD&§´nĺ6†•téKşÝ6‹ٛޘÍďÇÂÓÄâÎ c,<ýQ,(1()ÓüQ,îrLeÜ㏠h‹Ĺ7'đ^FÝŢĹ"; ŽńŻ(I~f:tŠŹ×Ó'ÎÜčř=UIľ5ŀÔůgűâžţgy1çÄaچAÔíœVŢ4~)ŠýýčYęƒŘÝ<=FÎRĹíŽp§Zę[b” @úîčÖ:OdßF†;"FxúC'ܑ12ܑń%ş› ƍľ!ÖÂbtx— pÓJąZ%2@ęĆÔůtN}W=0„j*ČrŽĂ—dœ1 ;÷ŮÎěĂ6 0Ÿ˘˙Ţ;&Gî\íŔ­ő ˝büD’,PQłÄN(§ÍîŻh!Ç’ĎvťŔžŢüN2ö‰/ąÍ0‘ţŞ?ősť”Ż/×kŐbSuLÍq˜­+łĹNÔÁi_ěT#ÇěÖÄÖMkW›%ć›hX"ąu=ŮY(~×ĹžŻVÝő,gQŔ1—ŒKmvžÔ~ßô".—Z7OˆSœÎ g2ŹŽPśHúÂhu2ZLŹŚsxDÖ´şiwč?Ř˙2î‡Ý+ŠpŤ1ŮŇŃÚöÎëˆ6”Ś“˘ă,úăš!Q˜L7°1ÂÇaޚ;Hćźí°eýěŢßäëćX˙âˇ,ÓéeTÇĽ4ňKéh+MWŮ­Ö-P)´UВ–˝ĽÝ­¨žĆ]ŮŽ9Ô=(‡}‡p^BŽłyŐěöĽ=CKZ‡ §ôg {ś~:=_yŐô¨švŞ=Ů›;źˆ/´v–{-}!Ĺuąń[čż^˙›­šŚ-Ťşč!< /¨ál;Vťđ~P˜ůŃ_ľ7meę4w¸ŐĂ)żkwŽu#ü…îW°ZŹőŎÖVślú [éžś.ÎčÖPłişžuÍş§Lv6ó3ë焻6á6Ă2ŢŰ­?o•Ă5Çjť${Üîyü5Ų9ôٚ@bÄÜGí‚d4dZĂą/Ž™÷[“NŸ’ÎǐR'üŔ˜A$\~Ë.OCłŻŞ43ë4˛Ąý°Gv!8}ŃWMM™Xš5ĹAq ý„×[á\~ĆéAyÜTŤĽŽŠĽó ś#pUď ą/?Ó´‘ŁzŇŠwŘ#`HšuŰěŘÁ#CHkĽXĄË_3¨ąŁ ďšŇlńž ţŰŽšRř Ub”*źÔcŐ{3šşĆň@Ő˛IĆćĐŰí áÂ6>!÷̔žăŮî &°čkÖÖő@5mg7X8”Ž(ÍŔbÍ@–-6çöăË}ç-ƒŠUHŘ럲ßXWĹŔĘĺĄŕŐĘBÝ6( …ĽFĆŹSšČIŠzě:ML9TŘŒ’@Yُ§SĄIůnTTNňQÝÜŠ‹jAakŘąi`{ŤJ+ü$yƒŞ@jyu%ň-˜çpŕ†4€7ëąžbC†/ˇf€VhU5)ˆóT)-tţ4t}ĚĹCסŻXm˘]_č4Ěs­|׺…í]7fIǐ=Ócürˆž9ë$9–#ĚČČ4>M:ń)™ă‹I'ĄIG°E•g|€uĽ:°á‚ĚU/Aý¤/Ü;ĽÜ›ú‹óˆqÝ˙YݚŢ&b zĎŻđqKé˛ţś˝NH•ޤV ‡)(%QŠÄĎ ýÁź{wM¨@˘Uëľ×žńĚÎźyăm׾É}6pšÚě6łĹnM>ţP=Áđă,č˜VOK8a;ŸĽ„?C2ękžÎ”ŞJl!/%Ň@Bâ)ĺ˙Čbę‡Î(B#˜ňj•šç,ÔĚPY5Üyž§#÷J…ŻÖŤ Ďvi˜ńâb÷ÜÂ;Q ^ƒ<ޝPÚ¤¸’§"ŐdůľH›?7™Bđ> endobj 134 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 327 692 353 706 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 135 0 obj << /Dest [ 305 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 282 398 308 412 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 136 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 191 384 208 398 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 137 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 282 335 308 349 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 138 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 139 0 obj << /Length 3216 /Filter /FlateDecode >> stream H‰źWێăĆEžđ+ú‘4Fvóž ŢŮő °1‰ÄĆŽ8$5˘—"e’3˛ýÎ?ä7sŞşŮĽÝÁîK0ŔˆdW×˝NU˝Ú8ˇ›RlśŽ”~žç"ŔŸyĚ?C%Ň(öƒ,ĚĹfďÜލą(G& ÄX:ˇ_ŻĽxĐ•Îj~<:oÝľˇ’ĄŸšż{*đĽŰ‡ŠÁőM˙Tîî‹Jx+¸ßz ÁĄG$Sí­üۢl:o•űšűčI:_?5•ţRÓM…ťř•2‘ťŽËžŤÄ›Ş™šžŢϛďœ7GŠF8YćÇyC¤/U$˘0ňł(Đ4Ub¨­ójó‚ÂĚĎ#•‘ýd›ĚÉĚ@xןUĺ`!nšƒá­?$ĹéăÎŁ˙“Vęö+ăńČ!kóšX•ŽűoóËY< [ŽľC#jžH˛PäeA'ȗšŸŔ‰$9r ňbⲝoČIäfĽÎ(Jß<ŕ4Í7–Á ܃,+ń%Ľč(ËŇŔýŻň#!Ä}ńč‘Ú éž ­›‡cĺǁúdËt*ÍDäž ’Üş8˛™$š=y6r›Ú‹ĄX7éß ž…&c/Ś]Á_&×2W4“hF1émŤÉ5KŰéۚôŘTšČâ#Ľäýrى'öZĆ1Ě‘ýČIš‡Ś4rŃŚřŁ6ďmłoŚQű ŽFBƧ'6Ɖ6ş@FoĹź`ćMĄÍá9Ö O\ŠMÄąF{sKS ąĽhş‘ІŒéˇbŹK.ĺƒP†˛Ĺá`žűߌ€f_LukŐQ9;Ą0„%ËÚÝRĄJ[ťůB[ŠälĽ2 ńăjŰ+*léţ$ K!îaŁŰŁĆ ŕĘđĄhôżĂĆCQą2Ňő5Ľ$á'›gü8rg~"ó˜ÓĚ1ŽĄň>ŠŽéâš&F™ĘŔâfćržČĎ*#ň 7QšiJ›×ę”×J˙Uóř4ÔÅP+éąAIx”'ʃš!ź9úŮJÔ9*˘ńRÜŞ)㊎ůŘPŸY(| če€Ş€{˘jŤČV!LˇxžĐ÷<Üz`äÇş–čŇTż›ƒYěě(‡´xŻ7Ýś˙W?É,Xt‰Ď/łE‘éhQQ\mxűŚ „ŔrgşłÄ×܊ɍŠT¨eŃĄ†zË|ŕDĎ)Ľ§ţą†Šƒ†ÖBWTjŹ^ÉpxŞî“Ť“!¨n8*ÇŽýĘŁ& bËOÔ?¸–‰ Ő/•úCÉ˙ ÍÖ#iJwXÜ䖩ÜGa¸—ç_łhĽUĄó„"  %č÷öK sň4­Ł€ÜJŠó/Ü7čúLÎnÍ|@ƒłŰĹLCˇ sF|¤OËăţƒœgđă[kçŐĆÉü ĚCށyŒČŚ$!O`Ż”({GGi4éšĺg°|G}™Ć§Žă‰ 9RrdÔdŔ Mg΄_ĂĚąŰ !#ŒSČÎRvăżE÷ľ"@UfjŃžÄÜ˙I7O tÍCa‘ ňf™4I‰…FaF’˙‘^.+nÄ@Ýű+˛ě&Ä´Z*=>"`˜’ÍlĎ$‹ü?9Ľˇ;“00ŢŘŽŽÖŁŽtď­ĺý—{r¤{ń1ź{Ąk<‡”*SîŰŚAęu¸ŻG2ç¸:’Ýf{nŠĺ+˨üÇvk5mÄ`q~%ŃN=,=ąSܔŰÉmŹ7"–Cˇ8–ă8äDÇŇRĎѡÂyסV7EޚG眨."´#ö?D¨’…t‰^ćŢIÓBěřćIęOëáKk .B$Zü:IĽř4­šüa™Ź\ŸZńC„%5Ú6Ž*Ů'55qůˆžČâĚeUă{ů°f@ňďK‰ĄÁké}Ôî>^óŸÂ™Ü°fĄ€\°ĄŞQľ­Ě<<$ÜÍçh-(˜YĚ}ŮÝőš4(?~–ďËŞ=IýŁŽ üşţ>ěÜ)™ąs›†ĎIeęďŻÄßŰH ‰žńű㲣~YţăΉsđsĆŃn/âřřzcßÍ'SĆŃ)ŽŸłGĎ8Šâ¸íaAł<řf:‡śĆɛá’.ŠpI†+-őOƒK–&°w^Îú /ˇƒqo!oöL=ŞřÉYPž,ęű”ĘҒ΁ۉ|ˇÝĎ”{ĆĂŠ ‚Ë žzaśJ :6Kó>Şš˝őÉë y¤yqÎrš6`o˝LP |ÔˇEn#ŁćŒĚ952č„ó˜ŸPW›s!ˆˆ.´ăy֌~ę 8 ´ˇúœ§? ”D endstream endobj 140 0 obj << /Type /Page /Parent 754 0 R /Resources 149 0 R /Contents 150 0 R /Annots [ 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 141 0 obj << /Dest [ 140 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 419 643 478 657 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 142 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 363 383 416 397 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 143 0 obj << /Dest [ 140 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 329 341 388 355 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 144 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 240 314 266 328 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 145 0 obj << /Dest [ 140 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 191 292 250 306 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 146 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 199 152 213 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 147 0 obj << /Dest [ 140 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 250 128 309 142 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 148 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 254 114 280 128 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 149 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 150 0 obj << /Length 4596 /Filter /FlateDecode >> stream H‰ěWێšEŢ}ťƒU›×&ů¸ŢŹ ``kŢ<ȍ§Š5ĐĹö~GňůÍ^š­‘Tm/ây I]§ŤŠĹ:‡Ĺ—‹Ů‹ĹB2Á÷3!ď=ăřË_=o¸R’Ymî”g‹íěĹĂV‡ă찚˝řé`3`9‡ŁŐl>|ý4{W˝ŠçB5Žú­–źUż|™SAu šż…ČL†*łPaxB|á›E ‘uľ UlŤXîďB‘B™Ľ÷ţî-č+ć ;őÝńŔ× žýâămˇŮtŰôčxnůű§‡nŸ>°ŒZĆ˙}4Pâ 3"?=˘ţȒmwť>j\`˘1Q lPŤÇjEĐ%o‘9{WtP‡°}T]­÷ń){0•żwýÍIöŽâ÷ô¤ŻŕV~ÓGvŃżVń‡ŕŰíŻuzQ 9GAăˇ(‡Sz5eˇŒ†UF&Kúq8mPéŽg ²‹ mľ,ËIĆ]z|Ÿ“ EZü)ď˘)]dR]–ű]jsSuŰĺq˝Á‰ňFY3aŁyŢé.ރ˝eŤÝn×ő§5Ł÷ńđ°Őăn„LúýűĂnsşn˛,§txŘ.§&ř¸@œý:8 ¤˛WÝáAôˆCćâŢďöěărßíNń`Ëd]Ťo@=Xű°űԇŹBwš*q˝‹žƒ°Ęę”yŸW$C Ř%˝qţ/ŁŽćŻÂŽŠŮ┵VŤá¨Ňí؂mZÓëş ƒœbôpŽś*ěT‡Ó!śB”Ą7ëţP‡ƒ`ˇŻóy \ką!żD:etző˙'<ř˜ßŘF`ú‚)íńĆWżţ$ŤŐCđ`-XV]ĽśLŸë%CóŁnŞ: ŕŮЉa0ઑžVІ œÄá¨:;°žĆîÍhoe#­y‚hŰFJK{€Ýk;áAJ4…¤svL&ĹnMcœcWq7¤ĹŃ v´;¤lŐ„Ç9 íÁŤFľŁ]pO ÚCĐ1?R.ždˇňƒ]´1ţ˛Ôb,%…KE"J)(ĸ ńň|ćžÁdaQ=s-Ęč•ń…ÉqÎИ—´Fë6hm ˝u”ľ8ˆÔᘌuq'š•j8“ÚqŔŃĎëWe­çŁŔ/'RcôŮš\´EdgŒęšr6(śHţéŔkQמEH‰|!ŒQYFßtÔ(Œ9ő\kŒśŇś1ˇ+ď~o@íFŃĚS˛ŽŞŽ‘ýJ@X§LŢkěťťˆlż!ĄŃ-7C_Çí4…âʞbČ2óýáÚîěט#Ö¨ĚmDÎń Q˜Eä8Úoç8Úoç(†/'Ęű0Ťo#’‡kDá6‘ăhżăhżŁâśqb|ßáţŁÔmDňp1¨ •cą9;‘#´Éńń}DÉۈäáQôm˘ç'pA4ƒš&Ž”šDœ÷ÓmÄůnˆłZŢFŒ+ĄPę[“–i´ÂľĆ`šA—e}V:éł B珎Ż}n4Ś&ł,ˤ˛˛|%9c^\ę3ńbŚĺšzÚQ=m3ĺŠÔZľ"¨ľ—âůíÔZ%ľáGľFůžM­ĽÎjmŽÔÚxôŸoÉqn°ÓZLzČăíačlĘĂ0Î vzœŁ< ăÜ`§Ç9ŇCçűÄ87UĘTj!kGjIë/KI!ĆRQˆą$˘,•BŒ+Ą„ Fžkf°n0„@tˆĺĆŃĚâ2›WŚ ű}ˆGe ëˇƌ‡2ĄQç˘šH4×h¸BsËůl47ĂPŚŻinq Q(šgűÍ)ÍIĽw …ćŮ>AsÂCĄyśOМň0Đ<ۧh>QĘTjŽS4'cŠ(ÄX Q–J!ƕPˆŰ4ÇŁ ÎEŁ]Ă[Ďúy!™jœz˙—zżŠçxw˛řąŻçńZśŹçśńŐ˘žËpę>tÉÜ3€ŹĘ}-ď˙żŻ=÷}Íŕ #˝§Ľ!Ű'¤ň0HéĄô;áĄHCśOHáĄHCśOHĺa†lŸ’†‰RĆRt–őSŇ@"JŠHD)–J"ĘJH1ŕ†¤¸bFĄíZá‡k@›nV *ą˙ÖĹYŕnÍ|™@8ó„čąËĂąů­ůݞýÎčçćˇVgü6¸ =żE淽淖â‚ćwśOđ›ň0đ›ôPš–đPříü&<~gűż)żł}ŠßĽLĽĆÝщ)~“ˆąTb,‰(KĽăJ(Áo,\pÄ]yŤôżĽkĺ0ꇳýIŽƒŢUŰڀŠăC!<†uMxᮆý8L2^Ës*ڑŠv˜Âmࢭx žjąlœ´†?őu>ÚĹő1ç\j͡Ł~X`¤žżŚ>Jݏ¤ŠŸíÔ§< Ô'=”~&<ęgűő …úŮ>A}ĘĂ@ýlŸ˘ţD)SŠ%§¨O"ĆRQˆą$˘,•BŒ+ĄÄÔ¸Á= ďó"Sߨ<ősíGîËę Ş÷Ż1סUŸ~áÔG§Ę2ŰŁ“ĺÄl˝y)h“ŘQ °°ç›ňłHŕŠ(ůŒS€pY 侲ŕĘFJAśOHĺaŇCéoÂC‘‚lŸÂC‘‚lŸĘĂ Ů>%ĽLĽ6 ˜ž%ĄƒCz˜˛‡ÍěS›EćdŒźtŒq;Š‚Š1lř`ŸÚp*ƀ b -1اZ‚Œ‘dŒÜ4ƒ}˛i¨ ‚ ň%;T*!xJŃpĺETđỔaKĄÚŠŚ•­$Ţ áůŽôŞűpÚŻkß@Żĺ\dk[ěNŤřřáçĺŰ㍏Öő<ˆű!ţŘՐ¨js ł_ ÁŸăŔŹv}ňpȚWä O=¤7§žz¤ĄBó|‘Î IŠQçRŠ‹‡uFJöŻřqęťă=ŚgűZWlťýw|\ĆĎÍŠžű*ČRVŹëŮńĄ;°cBźßd—Ëâ%?8Á†üKĄî­IŽSE‘îwU×ߣ42 †UTo˙KyľěČmÁ{ž‚G*ŘFi1|`ń%1b°á˝hFÜ’8Ńc×öoŘđ÷Śş›Ôkź€sҋ"›ÝŐUĹţRU‹ Źńt&tPY+'ĂŞ(ä¨ëÍ|MűŤnýŽ–î&Žň¸öňŘm7Ő­E! [ËśW›50Fé“Á~Ôu_MÓ“ŰtŚÚč\ƒUL˘ô9ˆ&”QČa´ÖYSŘžed1¨*››’˙l X[ýLůâ6¨ŘéŹnušđF}}ŁźÁ¸Ażp@‰őˇ`ľÓˇA@÷*kđ„uěAvŒ;ˆ‡¸ŁËÉV—ž3qD(áˆQúŞ/ťâRrE˙ś¨Ý¨űIUuősœ† ڇwüşV&Ă6řᔵćfĚFc†œ—íŮ>քŇ1v1JƒĂŘ˝×č¨ÝЛČ5B4ęÎ6•źB—,›„Ń•Ůxż4Ď}v–ş?đ'ł_Ć'?}¸úiÚCŃÎď+r ü†ÔĄČ züCý´AÚTm;÷¤Ü͙ƒ#§{\ź6ř‡,o{yëĆrA§˛;Ź[@Ç([cpLPI0/uš¸!M@´g?šG7A%— đ‹ü܆B×FP¤ •Ţ×őáÓäÖĘľn-sZ6r’pĄDpď6ˆ4ןr<ŠŁ tĺŘŃČfGš~‘KŠĘ‚÷늠 Ü˝‚—hgôň$Nž~JŒń ÷›‰áń\HgbZŐ^déšÂ˜t_:GÝG&Pąď*˘Ës• ]3!‚÷ĚIýĽŕ™çt P°^“QĹC‘5{P×Â1í˛RV÷Ť4úa$=wdy,ňîŹě]  áôě´âřwČVĽĐÖ$äs.›Žړßý4E"ŹđťŞ(ˢ’WÝě E,($P=Č7(ÓYVtë> endobj 152 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 197 502 256 516 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 153 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 458 410 484 424 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 154 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 174 397 191 411 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 155 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 381 347 398 361 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 156 0 obj << /Dest [ 305 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 362 249 388 263 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 157 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 158 0 obj << /Length 3747 /Filter /FlateDecode >> stream H‰ŹWˎŰČEśúŠZdAZtUąŠdíAŔ€dgAQě2А”ťýŔŸßĚšUŇşYęÍ &‹çÖ}żôvˇyłŰI&Řî~#D”ç9ăřsŻ9xK–*ń,ÎŮîËćÍĎ˝feoČ8ëË͛_> öĐo@Ë9•›ířú¸ůwđ)܊8ʂoĄä‘šâ<Ô¸žk/ĺńcq`áVňŕŸ!h†D2Tá6Áłť/Ęş ˇy”Ą ˆýrŠöKE7%îâ)D"xđŠ*ŰćŔŢęĄnţg÷ëćýn#XÍ6Yé<†!"R1Ť(SŠAÓT˛ŽÚÜoŢîn8 ΢\Ɍě'ŰDNfrkŕĎí9ÜfPâVЅ ˙khĹŁ˜§ÇţVŠ7œÇUCÖîą*7Á_ÂÝď‹x@ˇÜÂÖĄĘuo$™Iň2#ƒä‹$gšŕ›‹­O§öą˙ŰT‚Űr̨ţĽéîU j2FXžG\čxl2{^Šok¤sHőĄŃŹňą”T 3¤â ^š:Ú I?$|ě8™TfœŠőɞ÷"‰Ž—gĆx÷*dŒôř„ŁÍ¤:%ă%‚ ˝; îO)ŠY¨3jž¤•=Žđ؟ó„ú+˜ę(Ëfúň˘;ż§úœF*až‹ł *D–yžó¸ćQ"łĽ„\_I•ž)/IŢä3Nƒę Dç~Ý&˝…Ł#ćů c¤3¤x9ž§7ptĄ$×K Y|-!Yţ8Ĺ şđ ţ€óô{%€đÄË@ ¸HŢÂá"•ÜH• ‰éç`ýČnŕ) <ż ZRsI˝^Ă•"ŇŚíčE˘ŻŔË,]ƒ)¸/óg žƒż‚.cˇ/ż/˝˛cšCęj×ĆÝŤŕ¨!%Ăy›¤×;Šxžĺś›•ďŸBšĺ–‹Ć4{4­X×Ć[‚ĽL?Ř1Ňź˜چŔéEÇĂz5iŒ5Dá‡ĚłXů(fŤ}0üF ׸řĎíŕ:ËŁ<Ç +^YăĂÇÔóâ.÷|ř˜|^ÜfŸÓϋťüóác(|¸ýyqk§Ŕo¤K“† )˛)ăěĹ šÔŠÜń8ů“룞ëꍯňú(Žďň—N#ŽS_ăš§úlGôűG´Á8˘˝¸Ń žíă0Žč‰ƒwD{9¸íÇíˆöë8gů:‡qD{q7˘ÖG´—ѡŕ<˝Á~ŽłuăˆöăvDűeŽT7˘˝¸Ń~ćZ_çđn{ÁëśF(MŞ?ľ?'ř „ô•Ż6ĺëƒ]ů:řFůzLĺëĂÇň%řĘ×Ăa*ߑƒż|}ĆňőâŽ|˝:Nĺëá0•ŻËw–ŕ)_Wž7`*_/űŠ|= ŚňőâŽ|˝‰2•ŻĂXž>|,_Ż Syz8ź†/*Eę~ąa{ŕe–ŽÁ‹\—ůłĎÁ_A—ą[ƒŽ_—^Y×7lD;7Uę)*nŠń´a ŰÍ܎œĹ"ŠƒňÓŠŞÎ,”é”ĺ‡öŚřŢ˝ ˇ ֔ĄÁQQ‹‹ŃxZŞEŞŇ üÍҝ†Ť7>Ô̓ůŔÂX*”Ă-őĆâô%”Űřťőd6x,ĐŘîĺJť& nľNćŐz•bŽ–—b ˜`Ž™—b ›bŽœâ•_ *FëĺňĎĽ#%Ĺó4šPȞЗĽç‡Ír0:źŠ×§Đşô^ç? ŠY@’ŽĄu3ź.`šQłßŒň˜`€q„y-˜’v]Ŕ Ż ˜&˜×‚1ç=üGÔĂŢÍ//÷Š`ÖŮĎđ:˙i~yShŞ7€ öǗׂŠ\×Ěđş€×đë˘BPą S÷ăťČQ\‘n şś”Sמ~‰şŚýĄ~¸tU(¨•2š¨uT~1śk/Ľý~üX˜Ły q;CŸMq¨ěĄ9TF0ú|q.ö–G}24ľ%ýĆöľyzŰGćő™¨ąr9ýé5çÔ#ŕaŽ˘,Q¤źŃ™çŚkš7R˙m˜=ëícʞ}˙ńŤf§G¨#Đ$‰AöÂ+Á…”΃.Üb˛ÁI–ÇŹ Oˆ$ŰŘE_u_‰%}8°űÖ˝wěţ2ŔěŇWđ™ş;VěŘöTrTíĺt`ľß´ @bźŔŃĹ#fün3¸]ZřľšďéR™gšHľ÷aLzwć1BŰ|:Xŕkȧ/‚quOŢz<ڏ!¸bS8jęĆ^z°Ń%˝ j -ôgKh{{ůTßhH玞$GSô§üh”E´EźsŠŠŚáD őţi¨(ĹÂÝŃä6>9nNě1ł]4>“X&ôçĐJŚŕëŮëöŠžňJŰËťcݓ§}…Ç˝‰Yőd"Şh„hjr*‘PÔaŞ,w ɡPőzĐ÷Gv>ˇÝP¨ŇƄ)‹Ć*šűi˝ZÉűŐ`n<_ęĆ~ƒzN㡅Ćć›ClŹŠfaľ ÜŠ ŐOĐ´x3_ŕ•Iíƒ=Á˙ć ;ÍÓJ?ϊ čg6 AÜÇT+&qNÖhĄ1LĆŁëélX˝H$lC6!śsF,ÚŽ. œ,#Ö´CŐ?ëIID}wföŹńŔ´ęÔ>şŘšÄő@ËY*beˇjQ:ťřY}-i,Ň:™Ó:qiM1.N=˘\›˛LL'A}_ç'ĆĎ*p}vK; xžđj˛GYśĂąLŠSŰ7 żż CŽ*čÇď˙ú÷ŐŇŰ&„ďýÉI ŘĆVO­ÚJ•)jĺ^0Ź›UąA<’’üŕ~3ł Žú¸öbĂ.,ł3ó=–œűFÇŞĐ/Ä´…nskĚ^ËUAÜŰęź3ŐŠ…MPWp• ­/çC]…â1k› đibJp´żÁ?ŕ/Č_đń"RôÇ$\¤Ş"LcϜŽë›×qP7UWĺUš‰Ű'0TsíüCOĆĐŻĆ#ó´%’ťśК+ŔóýH"RěhE;üťÝh‘ Â´yßś(EöF”ůĚ!żHC5Šrśu-‰OËĆ[÷ËŃpx‘ěÖ$Ĺ)xĄ #VŘ‹˜ĐĎÎÝ×B9rGçÉŞlÂnrŸńoÍ ÉőžŻö‰˜}ŹÔQšdAů‹dŞüď>ňë2RđőĺźÄ1žł|°‹Ë}u!sƒ‚QÉqŘmŢő]L gú7=›Řž%~š„s˙ĆŚ işí[ŒŮDn•ôŻŻk" hąÉŤufŠŢ8ňžůď <ŤžěĚ͓édч—ŮKO&˜rürŕx×ŕśq[ŠžA;Ă={IXPfŕV2”ÔŠŸCn8 ˛V‡n|1,Źk6s)‰ÁŽ ~üś^D2ďáű˛ŸäIl“›xyŻ~ňŰzXiô›]ab#Â&ä ŞSiccчK*ú†Nâ Ţî۪컉ýŰpß\¨‘×â”!7—ËÝź˙îŐ]%ę `A §J׺ő%,Š,ĂńŽĐ`ä‹xÁĄu; Ă>Ç)Ĺ sţżA8Sâ%œ+łKŹŚžˆ‡äC˛ú =2>šÓw͙ͣ‘H’ż|4B>ň1ď}öžôˆ#Ů[e.`QŹĂ1ůôŸîě­Ôt&ä]ęŒqŽňŕđ´/ŮeEÜPárfՖۡƒś6U×pę{ݐŠ´ćHÇ-9fmUŮe' |ŸnZ dú8ŹŃÖiŔ'Ęz‹›-ă&Ś]Ľ|0‹çA‰¸őh2^ș–ƒŃ8ƒY•@Xgůkq#alÔ!¤_Ç+5&) AŃ•n=•tćÚزp6˛:ՄŤń[‡%np|q˜ąoÍűĆl^šŮŽœ+:0ď@e 3 ;ÖöGÜ˙ŢS”]†âp4UÚ HU#ďÔvˇÖľ†‡ DMCŽž: sŔîՕAś÷ş{ŇÔA&“Œçř:˜ĽĎJ/‚1ţÎZ&í5ôš§_ú$GS/}•t( Öwę}HĆ^w2ˆ<ŸĄŃw×q< 1vœ(ş¸!EáœÜRÖ܀:îÖ*nCîuܖžpGN™ăM×ü’áĄOŇÓ% F‡á!h†ť˘ţň:Žƒc:WLÝŔh#ŤŹĎx%RO\zStgş đHQrÂT˜ˆŢóǔń57_Yý冉č­Rű+j‰ę´hYŮŠĆ‡ŻŻ~ĆeÇ2 endstream endobj 159 0 obj << /Type /Page /Parent 754 0 R /Resources 164 0 R /Contents 165 0 R /Annots [ 160 0 R 161 0 R 162 0 R 163 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 160 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 374 602 400 616 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 161 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 182 461 235 475 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 162 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 404 404 430 418 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 163 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 444 87 461 101 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 164 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 165 0 obj << /Length 3177 /Filter /FlateDecode >> stream H‰œWˎŰČEśúŠZdA-šďÇdĺ{& ‘…%–Zt(’ĂGˇ“ß°˙!ż™sď­˘(uˇ¤‹ŹŞ[÷yîŠw›7ť]¨ľ;n‚Ŕ+ŠBůř7ĂÂ÷ü( U'žŸG…ڝ7o~uy™ŻĆĂćÍ/÷z7XëűtŘlíđióŃšwˇAäĺÎżÜĐ÷§-űŠĆö]7NĘJšŰĐw~uą“.-™´ťMńŽĺĄnÝmá΃ДúeŽ+ů˘igˆ˝xAřν>tmĽŢWőTw­r˙ąűóćýn¨ZmňÜKІ^Ć*Žb/cMłP zsÜü¸űŽ˘Ü+â0'űÉś  3}1đ§Žwˇ9”ƒ…Řĺ nŒßZů^DŠÓǓKż“(őćgăń؋pÖî‰:lœßšťĎŤx@ˇBŚĹĄ1jFt˛ Éˊ< I8?(źN¤“c§$/ŚťűŽœDnĂՊƒg˜Í ßI é~zKF…4•ç™ďü'ôbĽÔ‡ňÁĽC´Ńž ]Ül<œ„^⇯8śţkÉřąS˛ů…ú)'+oĘţCٜßiʒ V&ńéâ6¤NjźúRF:J}röő¤üOŽ"‡oq|Şđ$_‡‹ŻC9wwŞGEŰđ5Gőľ‡"Ş‚&J¸o<5÷}7Lşň”uy"űár_ź‰o_˙NĄÁŰšŤôÝ75´­šˆĘŽ&Ëv0:e‹N™čtÖĺ8zd,šěűr żd!TÔ¤Ćúß$ľ0_T7¨§şšNŞ;ňĆcÝ>čÁěGý š,X •Őuť¨óŃĄ96"w°_7•öv?vͧC°¤CxIÎvçOHňn¨Hlj1ţpËÔ˒U/‘  žńÔU˛Ń%֑Ĺ7í&Lj_ÄĆIŢ(Jô¤(Ńłäß^ÖČ 0–PĄV é†Ń%X” űŠz•9L>Á_üläuŞÍ;qƒ•(ťuK V41úmźĘ0ŕĂdÍşçO!+"YíZwj‘<ZÂCÂb–ĺŠ.˙6ˇ‚%ˇLÉôCWÍ@‘Śn5đîmÓ,D˝aB˘ NŽ…V ëŁFR ŘxÔJa‚çÉéˆaÄč“9}šŻŮ–Čg‡ÜúCJ~ţă÷ŃÉťłŔs3RÖwMŒ=“N6 ęۡůô喠$á ?ž'•:rÄjÂäÂDţ,/OdS⟐R–6h휗&1Đ8^ČŔ’ü!(aá…ôCő&Ü0/ǟËu^Yiě*Ţoŕ†šÂ3ŔyÖ z ž@Śi–O§úpR•a_Y 2…˛śüRœm€SËíÔŢě]†aIK™Đ`ľ‰jżPAj>\A:@śýţŇ×ٓ,Ö$b 5c°óXKŽ&Üb# D9Šß'ř蝴,+}¨ĎeCȡâE‰hFöx%…)L"%&$°Hą'?9˝Y<Ôh´(r. ś"sPG!읐Š eščŒVVŃś‰,+#ěóŒúÜ7¨žęőQ¨Z§n™žŘs…ĽÜ)._ąśÂÔwOzbşű_Ś‹/SńeĽĺÜLęąlf‹{ACčhô‰’"~A X(Ąc™Ë†MGď]knˇ×-hŤŞv(ĎŚĂٰ ‘%lÜ˙őÝČ( Ü:uOdżúE‘P5Ói"žéVę˜#E˜ ˇńŠIřŢ´•éAo§r9ĄöÎŰáuń";â}K˜Ž÷ ˝K?Cëꘄg€.Jk!œ'T@gˆ-ŐVinJ&ąâő]Ôl:°†‡çÂĂQŚ*Ǜ˛Ě­ ĆĂjď ŁŐëž‹ŚÇŽiş'i؅naĎŐŐl}řƒŮč#ŮĄţ˙‰äkŹÝĘV8źž.QÖţE=z8Ÿťáćş{~şže>KŇUyĺT^í|ŢĂłHřJ[ŁĹoC˝GeŮĽ­uފúWĺ;G—~UDqÚ_e$ütgP6óňčdŸÁR9ŽóY_á[˛ĆˇlAá"RŽîş7xt”ŞW1iTîť—î˜Ě×-ғŤ~œt“l#đn֊MnR?ݕV8Gţí80ňĺL?° ýŤ<™ŽÂ˙‰ôĐ7ĄÎ…ĄÎ•÷Ē߬崞űWŕ|‘`­sôÂNÜŠZ„ˆD‘_ËĄ˘‚ŃKQAşĺm{ś:żÖk=yŠŽJ7řN(#rÔM<¨ë ţ†Ľ ĘTąR R*-p{iQč> č˙Ë łĐŽ9ŻTJź(‹âéˊç׊§˘xrŁxpA’›m˛Ä^_ÖfĽŽe‡šłFŠpAŠËÍ#—úß2ЀD&ËÝĂD$Š‹ÄŚ.PÓS÷z¨qýpŁ€:ŸÝ ‚ŇŔ‚QÝ` ť*NžăŞW¸oJj8÷$94s…–§ćśFKcšj<רÍÍ|•łdv NŚÍR°°V?˝ÂîŸ9Kĺć÷ši1wĂÔ9ĆĄY=Đí'R§$ŽĽ™ěŃőĆŇ.Ö.Ćڙ[S Š._Jx7ŽhvÇŇ|ŇĚín˜Fś¨ž-LÝZđIÚNư jÔh÷ŰlžjšÎf’7‘4üÂiÍ4™jďu%zŔc͚Ź °‹dQZ>sˆ2+eńœˆ;çeűĘÁŹ"s¸ĎvÇzœÖTĹT"?&ěŔ0J Í'V-ÂN\Ăć`Q‹úˇĐ>KJÄËËťáŹXnr~í.ƒśd)‚˛…DmĘ˙œĂXäŒóńB’=)ôoĘP‘Ř"€ k‡Pńu o>r8.t˜ôEč2Œš…3Ći@Ú̆šj:ŇŁqçQŃ'“őíČÚňJëşż Ay+čĎӀ6#vęƒË}g––QŽZžŒ[n“&t“/ÓmăÉŇĎ}#_'3ÝśSpŤƒL *×-ČŔŔeZyÓ(ó‰pĹ4LŔ˺͙ŽÜľbąÎLBŔu&ź Ł)lSˇ#’K`QĂo!Ւ<4ě(7,o!xÄk 4Đxažâ‚—P2GĘS`$,99ŒGC(4 äž;&Hš)´AʉÚ-2j™“…Y(•ŽŮŃőéĂtńyîXú‡¤řýhř*_â Żłd Z §3Aěţ[yä4 QtĎ)ź$•!Š87貛RĽRš Ä)˘×€3ţť„.ŘĽŽ3ví?óßř6eŽžkZ,Wƛ‡@%uި×;LJ ĘĄL•÷X&KęIĎ´aƒGSöLŞše$c˘Ć_ę-ĺ˝W%ů ™;ş¨)žŠ”žÖľ5 ȉö˛kÄŁ&C%Ô×ÙĎRˇRřŕ§ěE¤Ôr)‰PC§ËRŐĘGÓŕöśÄ¸đLYőV—gŕI}Ë)ąT,$ ‰"+ Śm–!`{8*T7Œă_”ÉęGš– ušç|h¤€q$óAźöŘťŤ3ű9‡üĚ(ë5–ƒÇéŰ˝ŽrŮšóŇŹrÝ ü˜ÓÜ9Ý Ąě•+x=ţ€WL×ü>’W%ß­Ŕ\č˙äÂԔžĐ<ä`ëĆí>|páUuű7U˙˛(‰iˆůFŠĄĘŮ|Ź”Ń{ŐŻ˝ąÖWh6ÖúN!”RI A˝ÄÍcČłóČŽ÷Wđl‘"§ZŽ"öĆĐŹTČ)HNaŻ:nvzéŁF%ɟŠ-“ŔćŇůžXˇŰ' ŽE.%ő¤ľë~ŢÜ|˜Ú- endstream endobj 166 0 obj << /Type /Page /Parent 754 0 R /Resources 172 0 R /Contents 173 0 R /Annots [ 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 167 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 197 422 256 436 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 168 0 obj << /Dest [ 91 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 298 331 315 345 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 169 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 336 331 353 345 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 170 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 293 254 310 268 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 171 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 191 176 208 190 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 172 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 173 0 obj << /Length 3863 /Filter /FlateDecode >> stream H‰ŹW͎ŰČF’›ž˘>‹§›˙ܜěőÚŘ €â85âš"’šŮŮ×H€}„źfžŞn6EY”/Á`D˛ŤşţúŤŸ~ˇYÝo6žPbł[)ĺeY&$ţĚk&=žHÂȓi‰Íau˙S‰˘g6)úbu˙ńA‰§~^)!¨X­ÇחŐ?w­/u^]_zĘiňăPaűŚ=űOůV¸k_:ż¸ŕŃ%–Ąt×1žÝ./ŞĆ]g^ć<šŠHâăŠÚꕒvú؋§Rą’ÎCY´ÍVüź­†Şm„űŻÍßV?oVJTb•Ś^”pDyĘE„^†–&žčĘŐnőns#AęeĄŸ’˙ä›ĘČMŠüŠ=şëĆÁCěr:7ÄoŤ¤á´¸wéwĐFÝ0˝ş6ďITąrţän~=;ؖi˛hČJÍi>EYP„! úUćĹ"iœ˘;î; …Ů÷Ď8 Ďź€šd҉”\CşLĽX‹ˇä”O¤4M¤ó_ߋ„Ÿň'—””n@űTbĂl"Oú †oáwą&ë8ÎĆXűv;P`bˇĄÁ3přťÁńv 0€Â#šœQ RX70`R^ä˜ČOÁXŽƒ)ş™ŽQłŮ—&´Š-Âsabćˆ}ދ\ô‡źŽE_˘Ý rWq(çéÔĺu)v$ř͇SWöú`^öUąyG¤„L&-˘lŠü؟ę|(ˇÚ~śZE kôúÜęŞĂž“Ée%ľĎt„gxŠŹÇ‘ńxĚÉEôń•˘™ ď.b—zą&'ƒľÁdźČ]ŠYă…tí†Îc5ú?hB˙UhľĄ)"×öƒ(řýloŻŠƒZ+r­2Î3GÇíYŻ×'#čÔW eœ!kގŠ„‡źľńÓ1Hl m|,‹*Żqr‡CŢl=!6{>`‹(5ž~3 y1ˆ]Űz:j8Ł7ižfۓ݄ˆA ŹÄrŔ^tް‘Ăč €WM˘Ü‚Ď•LtíÇ懥r°ëڃh›Rťvh‹śćŔ5­–;ű˛ťŔčśěŠd"š ÎâŽzžš.Žß1ďă\…}mq:”Í€˜0•¤†ťŠv˜âӞ÷sKżbŠ@¤wG& GţVC_Öť;Ŕㅊrů™\€)ťź2Ź T;ľů2r´}HžžęX,ËáĽ,Łł`%mÝ{gš•ú„ üÇöĽäŒŒœ5úIŐ ŻäœÚĄŒíFi8wĘ?wŞ$‹ß>)ž÷§ÎJhŹŃG•šÉ>´˛;–}Yʖ6ĄC9)u H“BP \ŠVúŤC­‚ľw/.qâh(°ŘԗÝólËV”ż™…˘<HeĕŐŘőc]ŐP›ş‡teÁúLöůhÁ@§C•Yĺ9•'šXŸ\¨Oîa,h”šłÔëâóćŐzŸ-9ĚfCĎűQ<Şn–×áXę×ˆÂ)ÍeüZ“•ś’,t™ÍźV$:IžiUog‚Î`"álćą†Ú ŔBYßľuÝžô?~sö)ÍW>ĎZćUŃź˜9aŠAAFń8lé4P˜tx‡ÓƔˇ’€š}Ćóψ?CŞVôΊÁüӟŞů^y9Śů ł”m7Ż ŐJ8ň0É<NJl÷#/óăč,LQJC?)3ôçHÇ×,ŚńÁ°˜Ć‚ÇÖłáőűä$şAN~9BySń9ƒ QţŇtQŃ3yƒI/öÓs Y4ÓŕKä`.Jđ%şĄœč4Ç_Hˆ"/˛e R?šEO" ¸ŕ÷Żl’>œ~šv`ý¤#1<ݹ΋Ŕ,Úźí„Řu회*Ďćş­9Í!^Ş,âS;X8oűś> ĽťůőŹ>@ čě—eĂÇ:J‘|qmDľ›çÔ´ĂÔ­ÍžęŮR<ŘΞ`“:ľ~üKáĄÂöŮĐ\šlrMޞő"4ť!†QćlQÜČYcEK@ás˙c˝JvÜ6‚č=_Á#ĚČds“Sřŕ›đ!šPbD„H “˙HďÍŤ…űŒ%Ř.ÍŽęŞ÷Ş^5ŹdőłłZřc‡Eœž%`Ń˙ž/ËLGcŚ#Uý>Ţœ;Y‹í.’h°ŤŽ:=ßIŤ ˙ƒmr0 Hv̲Iv~MיĄYđ‘Ô̝ĺćSź‘‡pR§¨_Sí‚ĐŘ`‰RÎŚi뿏‘›—đ¸ĐÓ3ęáĐSG.oŐ9ĽĄEgßdô,Ď˺ʸ řƒc2°{לM /÷JmloR]3ú°ßţ;~'sżâwŕ:‡Áďdé÷qć7;kŚ,˜šß\„§Đ˘.ĺőÉ´(ďëK]t?:ÓŰÝÁĺçşż‚EJ¸gđ,ăqŠŔápř™ŻŔĎîĎé-s>8§ÂÚf F(ڇęD `¤y7ş‹F1¨üL€išHžl›+¨Ň)tOx‡Ŕáoěíó˛ěc_ź{ž˛äGZ$],GŻB9 Î!=ŐŃ;Áţƒ™7ăžĹBßxž„Ďřűř¸Žß†3gĘ‘VąK°MÝöyĽO„-OʖZ21 F1ŒęNs2a#݄ö“öş˘3˜Üd×7ŰŤ˘LoüaąŞfüĘŁőŽÄzDŽë8l8AĄ„B%x&6ô¤Ŕ*+­3vmű6lP1ł=Xçš_ĽłVCK؄ $řłh€Ë$¤›qo^ĆÍyţĺ„!_‹Ď"nŽ=Wƒ‰ŽHŰá~ßĂŐ*T"^pˆ’Tt^˝Œ@ͤ÷éšžő#MÁO.݌Ó˘łjtłób}pŒhp š˘ŢyJúϧćQŽ'ÔćŚD–dżť'”ô*×Xń˙Âw1ĽGyÄgj&üeŇ<ç„âŕó\Dא†rQ’Ź9şĹ”Ç`SO7˘ťnl˙Ň6:¤ţËí?Cóř"ů*CT1Ż˘ąRBŘÂQ[ĽWŮ'dŘ#eáž-ÚŁL‡UŒŮ†F:#‰Úˆ•:•{ŕ 5(ĺ'$>¨ô°ŔĂşŚ~ľ-_9yVČWN×Ëâ^•§hĄŻ×üÂ7WîŻjąÂ<í„lů™ÂŮqČŇú´GĽkcb@6C?ÎaŠ'( R>W?úŐ9ôÓΧo*yÖŠ—ňۈéĽtHŚ ´S‘F­ ę"Úhćťő=(×Ж¸˛Žë,†ËšâÂ÷)˙Ţvj|Łs\Ä҈ţgTęŮc3iŤçĎ+Y&ŰËŇ^żŃ$×eÍĚ×ÍÄěŸ;ot‰ŐsDCčBˇ˜qR2 „/“ˆ f(â•Ó †ŚĎĘćă”5Ée*sĘač"œQÚ°ŇçöxäY+!(ÓšyŔâţč)ŕӌ!°•ú5ËĆ#ČŞ/Źĺ(w…~ <ď_!mź7÷šË˛Cť˝@žÓĄuGěpśĘbäĘ:/Ť×hmG&FŹ[oŔxií°ě&jŤ´ZóNx˘Ť„>ńßôůĽť§HłŇľíŒhĚœűŔޡáB3ÔĄuč§_>łÁ2v†¸ŔÎRŚ•ŽLe:C¨›•şu…fkHć e{­@ bŽß]¸×ľL@D-âăo?ü7hW$× endstream endobj 174 0 obj << /Type /Page /Parent 754 0 R /Resources 177 0 R /Contents 178 0 R /Annots [ 175 0 R 176 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 175 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 230 446 256 460 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 176 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 227 369 253 383 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 177 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 178 0 obj << /Length 3767 /Filter /FlateDecode >> stream H‰¤WËŽŰČE6Yč+z‘E3¸ęËnžcdaĎxŒIÄ˜+Œ“ŘYPTË℗HĘדĎČřň›ŠG“˘HÉ6(vu×ëÔŠę›Őýfc„›ýJk•e™đáă3_ůA`DFĘOƒLlW÷ßt‘(:óEWŹî_=hńž[ŹďĂAĹj=<>­ŢĘo­•ĘŸ=ă+-ëüؗ°}ӜŠĂë|'źľńĺ÷ČŔ˘‡"˝őÖ1üśűź(koŠLž÷4.‰W§rÇo,î4°~ľŽľ/lŃÔ;ńrWöeS ď›?Ź^nVZ”b•Ś*ĘpD+mBĄJĂP€Ľ‰­]íW/6Ÿ @Ş,4)úžé ÝôŮÁošŁˇNÁ8đvÉÖ áťŤ| ářňŕáwĎFÝç"ŞtmžĹي•ü•ˇůi’°-ăehHJÝjŁ,0ÂpčיŠ!ˆ¨9”9F1–î; †Ů˜‰DĄÜŹ&™/#íŻát?őĹZßĘ –Ž‹ˆ/úFŘ:ßVVüŇçÇO“_v­#+„x"‘#ů ř8\uďÁÔSk!Î,ŘśëƚďDă¨k# G-ť˛#5_(÷ímA͢‘A;×é𼄭ŠČŞd°‡žącD-CŤi;`‰7,}@śW5SůďĄé‡#*Žöő]ťĺcs‚6p̋+¸PX Óąi2x Ůס‹ăadh šjăčV¸ßžú\ďúœ'”dşŁ8ŕyÜĚ2335Áţťݐ1ŘD-9ƒˆźzâŠlĆö¤ZcţČłÄmcĎňNü‹…ůmŰ@¨7‡ĄśŽľĆ8‘ŻĂ;ˇĎą“NĽ|ŁŇ ‹)ř˛1Oć ŕä¤5…@Şš;PËÉdŹb—>ÎgŤčJš¤…Ąy­\şa˛ƒŠŐ‘‡×JźTVÝQ×YĆ‚NBMÚLYďÎ럼˛‹ŮüŠigM'TţÔÉĚőÝč†q,/˝pđ‚˙łŃÁĚ9žó˜Ŕ›j‡ŹLže`ŹűGOäÝ$_g9v=’ě[ eĽ#`–üŚă|ńÁÓîĺN-Âv…Œu2 Ýk¨˜(Lhpn¨h#Ű×PłŠ9ž3ó‚űžôڞaŚâƈýřŇwn‹ws$ŢŮ xStLjaމ0ˇÄŽŽçöî8&Ë3Ýâ č›ŘvŸú’]ĚŘń†‘˘Ça&@ł ň(Â/Ŕ~€Wl˝ŚŽ€"­‡iśt—Š÷`2^_h?í1`řëy부í(ă´4ň’ŸHó VËđçŢşŁŻ°ŒŃŮźŽßĘ7pU”HzÝ<ń€ÝlRqspbVŢy@"Äs–şN-úJź50M‡sJľ)xë§áÎë’É;÷Ą™ď&Ta4'Ű sü™šô Ô-ř"P—ýú˘îˇĽ‡ÚNĂ˝+›;˝˛q˛~ß8cóhÍs€Q$’óĽŒ›ß-J„Ąřś_ŽtjŸőń‚ŰâŃژËű÷Â瞜c˙ʍĆń–•,FÔĹ-Ť/m‡ŢÔM˝žź—ĽÍ+ŽŞ|gşuşÉoć˙ÁömVóŤAWŐsÍ诚1p:ŽŞ›ö\żźlâŹB92r !=Ůs9|-Uť–jëC^č]†>Í,~â.Óó?ëW9eš†›ľc\ď„{8đśÜýESťÇÜľ‡z& ƒô>듀ëŔ…v‹sӓu/ÝžŁRţëřcęržKǀŚěĺß=VŘ& BĺCŐą´CÉ*ä›sD‹ąÇxÓzžmN=ŻĄ­ňX‚4m‰)piáĺlkę/͸ó˜ˇ}YœŞ|čőĂŔ[ěÝum‡5qÍ2ˇńÄ2ý0^ٌ›”óž›’ënó ¨žĘ§Ž0‚)GžžMw}šÍ&ô ő¤Â ž|äǗ{[ďěnVcŔ8“ÉÁŒ%ćŞE9GţٖUŮť‚řŮ3†ú‹ű?Đ+‘ŐĹČ´¨\ 0ě’E pĺŕ.t „qP‘óA=7aăĂϝ‡ß„”ikť}ý`Ž;R8e1ž|/šl€GťI,`QUÍ_=ĄŘÖFL˜Ď$Ţ7A“ דg °ťćюbˆuY Ăś ÷d\ ĂŐ¸‰Œbs‰qÁýĂq–śc4QňőĂ˝‰ýw e*‹2ź!řÂ=j¨á4yŢ$€Ń8?2Hâyłü 2öľdP˙zEřz|O$jäŇSçĹČŻXځşůrżéőĺfĽýîkF˜°á†ĚA?ĄďÖŽö_ąŽ“Őy=‚›]_HÄŔWp%źyB fĽçuÔh=11”a”Ţ<Â$ŠäźnL xş8"Ě`ʄ–wëˆ/­Oăŕ§Ă:D<ОĽŸ×%Śn\—˜Zq]âĹfB0W€e‚ †Ä„ŮŤˆXÂ(?J]EýĆ÷ĹsDLˆÝ Çc¨͕7É xîl8ß „áö¸g…ňôĐK-€‚äŠ0pRYNĎ==—Xo/ixKáq!Ş|ô 6F,´ cč&t!0ʤ3Ŕšő+€%bâU‰!Uq¤‚8“­ëŹĂ ‘_ÝĎ–ëŕďź_ű‰@_á#ވŒpšaĺyýş•çőëVB‘ŠTOöv‚T_qG,EFČŢĚאĎH™0p „"Tp^ŰóŰT¸‡Z¸Ův¸.Ü~€VÄ{X‘Äj*˛"ˇ˜ULLЊܢV˝Gťg7z‹[Ucîć˛Ć܋eWĐÍPǘ-týŰĄ‹›c?ĽU<~1­b‘FŠ!Ą"ǁ8†"y’GšŹhĂŠHßĺt2w°‰şYÚ ýîî˝ă§#/ďéE„˛ §…'˜óšes€1Ç c.rsÍBĹ\ä抉 s‘[˜Ť÷¨÷„ëcŠŐ1W5š›šFóBÓxó7_ŚźĚ_§|‚üö‘3Űîé‚m¨ŕąôł-m?ąÂqHxŽ%K_×>R§€3ĺÚqułöؔ>],c6VĎť Ě䘖Á]DZě^}ʛ“N˘Č 5 •D‘[$*&&En‘¨ŢŁŢ3Ši‰ÄŞ­ä8d݂*—/%rëKŠ>T íŒú-En~KíIC9dúÚ"7żśvȤĄňš"vlŢoşˆ ţŐçňfHLŔJűRă&ÔŠd V_Žűóó23äŕpă×°Ł_ĺsßo?Ź{X ëëÂO {˙%őÓÎýŮňÂă™-üĆŚ=ľdţoéĆ" endstream endobj 179 0 obj << /Type /Page /Parent 754 0 R /Resources 182 0 R /Contents 183 0 R /Annots [ 180 0 R 181 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 180 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 221 396 280 410 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 181 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 480 286 506 300 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 182 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 183 0 obj << /Length 4117 /Filter /FlateDecode >> stream H‰äWM“۸­\rĐŻŔÁ2eѐŕVĺ°ăľw“=Źk­Z<9p$Ό˛˛8%Qűĺoć5>HJ"čĘ×)ĺŞ1Än4şďu7nV‹WŤ•d‚­îBdUU1Ž~YńŒçšdĽŇ7yĹVŸŻ^5[­gÇőâՏď{8. Ë9 ­˰|^|LާK‘g&ůšJž‰d_?u[l_ľ§őăťzĂŇĽäÉ_Rč@˜’JפË˙îëővŸ.ŤŹJRA"öăiťq_Ú)ą˙ QžźoÖí~ĂŢlśÝśÝłôoŤż.ŢŹ‚mŮ˜LW9™ŠŠ\eF)OKÉÍâ~qłšI@n˛JICńSl˘˘0š đuű”. œC„Ř•R…ż[xĹłœ§)ýíœSŻŢúŒŤ,ÇYŤČÔz‘ü!]ý}tđ­rb—Peő+:™IĘ2Ł ĂÎUV ‰t˛JjĘb‘Řtż¤$QšĽiŹ3ż€´Źx˘_Â:7œ-Ů÷”$‘1%Oţ!3Í{W?¤tH“ć´‰iöÖĐăň_NpÉŤLňÂ"ěc˛zlŘ}ťŰľĎŰ=W&ʃŤ0¨rü˝Ű5ěřŘú?ŰäŮąýÔôŠ6eň´]SÂĆű\ďN͑Ý#dl… ˛p`ŽüÔnvG€´Ů”´?˜kěvśÝ[Í÷Ía[ďŘÓĄíÚuťűÎßëj%¸ť; TWŇFę—›R(VUŇô`’ÝëÇä7rŒÝ&Šé1]R†›/ˇŠű€‹ČyUŕۇT# xÔ˛Ó1-p[D ‘óRBţćţžYw x™¸‹˘V ĂěŌŽçŰr“ĺŐ ×y&ËâLŁYQ”q Ü2ƒœN”ĽŤČŕŇ&jB–HE9ČĽ4™‘g&TUeȊ™ř–|ČC™)äȸBýťˆ3Ś1„Óźˆi܌Kóœ$6‡9T˜t_ĽŤ/8ˇ%ś }H  óě~˘PTD‘Snł_R*'?ۿ؏M.°úDĚ-,hpŁśëÎŽˇÄ˛<ůLfœłĚɧTRý'nÝ&B’?B&wő‰TQĚEr›^ŁÔÄPůźČ ľ÷…^>Â QV™.&5Âý•ŞzˆKš?ADöťŽĺˆWű×R8ŠâML¨ôŠxŮË#^ű§˝ó2#Fű¨ÜˆI•`âZĽÇqôžü}"ŠRVÎľždSTcœ‰iŢ‹¨ŘçÂď\T=‡lA–×eH¤Řoś­´Ëäp$0_„˘ĐTQŕAžÔsMe—=ő†5jřv€Hž\v}­¤ôZđJ ďkŒH=^‚Z]7v} ś9ń„őŻ•ˇn8řL˝ĽôZg„Ő–°ţ  lĄŰřč6˛‡``IŁęGîO89É!ĺÖˇ‘œmœ)÷Ëyuç\l6ŽF¸˝œŮ*AKŞPžŞč*]$ÚŻź|ŚÄ,„~ĺĺsý*b˘ďW^>ׯ˘q„8EŚ´˜ëGQÁ͘ĆŕELc–AšĚĘ2Ďƒ”0ëgŐhră>D=ƒúPEŕrÍdIƒĺ×ÔN¤Ŕő!"ŰĎöď¸Ym-,„´…pŔް•×:śźśk^Ú62ťőŃmeţođ!|~Ş×ż7î,v¨ÝÂs›T…Óâ=t•ƒn1 ]zVĄžGĄëĺ3ЍYĐőň9čFLôĐőň9čFăqŞLVrŽřG57cƒ1YčŞRý4>Qn_˜tŃBĽuőËŐ˛ÖŐ§˝ŤVžÎÝů˛wgĐ94 ÷iË´)`‡†˛äÎÉÜFݏsĽÖWŔq‘Ÿ¨Ô„=~]0_ÚaŤX:îžŇđźa ›żűZލŞ3^îx ]dŻĚUş^>ݘ…]/ŸƒnÄD]/Ÿƒn4Ž!NŞa3ЍjŒÝœÖ{1­.ćŽŠŁ§á #‘°Ţ˘Ÿ*ľVi'ř‹9$Ç´SŠĹźŸ3„{†Žë§7_: ;OËM“ ° hň6ü‚˘‡'ě0¤ IÖ`tCƟI°Ť‚oýféνœƒţx5aÍA/ýTă“›ťŒ›­Œß˙čôه‰I ĔQäyůQ ůA>ƒü˜‰€ü ŸA~<ާ&˙v×܌i ^Ä4ž|ä ­CôłŇeI~ńÚ 4.‰Ę K„'† q 1âĘfŒ–Ş6 K‰űjG%ü¤$‚xbNҰvG2ˇËŞÖÔĺ§IgťóF Ś1ǁš0F¨Ł´Ű~°3=-g€ě^eâĚęKFłůHSřb9pŽtiĎy‹Şžä}?ƒť́Ÿ(¸˝|Ü1 Ü^>Ü^>îh!Nđ›vW/ظĆŕfLcđ"ڎ†sŢáSŽ'gŠ×T›luœ¨”}ţüż TŇĽ†\Sý<…6G”ČíËĄ@„­űzPŕ„€FьX)čIäYile°šnŸűć˜DŤŚłŹĚ‘Ĺ:ľďĄć%Ł‹ťš€Ú ‰‹N4ŢçÜ!ömŻŮ§ ‚Œ“ωg¸Ů¨çÄs̛6Đωçx‹ ĚÎĚR1ůŕß´|8~ZĽ[YQBéáe†—KuA7;ťš&ÚiŽÂ:@XFĆ(ŞíĐŇZ9@Khmm.]Œm ľ´ôß0ÍčÂş˛€6K79@çĐŐĐĆz‰š•źBsŐÉúŕ­'ŕ­Ľq|{ů Ŕc½|â=Ć˝|äŃ8|œ9ŠÉ)h O—j†'QšĎ”—Ďd*îCЈréĺsšŒŇkDéłíĺsَŇkDů–UaÄgМÓ@I"Ź%vVä—ćEƋ܄Űw,ĎڷۇӡqM€ÉĽH-‹Œą÷ţëa[ť;˘!:Ę'˘(ɨ_YÉWšË\s˛Ÿ?ם““4GÇ'¸V!&ď%-+x‘ç’)Ł2mt|äƒŽ˛$?m]{ŘŽëۡ]süîź+YŠŻ:ˇ}C.­ŹŚ*ůƒł)mŃKVÍĺ3jCysĂË2,m‹ž;śťS× P*LążÖvi_t缲Čr?J„Ů xUď7×§–#]|rSŸ6çA"—bʧ.vˇíŽěąţܰz÷\§šƒb\ ü.ŠŘ7}nöěéĐ›}Çś{ö󊲥Ň*ďë§nť>˛=BQOëÇwőćDŘ8—tО*ôŕĎĐ Œó‡ÜvÍÁÁĽ÷/ňl÷ݡݜÖ͆ľŸéíBĽůŔş-Őôäâ8˛}óĚZ¸Óîqů÷ôę€NݝźúI{śvńŢŠ7›`*͓syő§XÖş–ÁGśňA"+äQ—YaLĺ—’ÁŒô$úÔ Tlŕ˙m’g—M´ŠŽ úĺj¸”ăÖ˙$źZ–'˘čžŻčĽ\•„(ącť˛Ł̊™,ľbĽdIŁ–lŠĎ>˜sî˝-Ůj˛ŇŁťďŤĎšÉ֕*ů´pŚ}#1â\[şAJčňV–g‡2^ř:ÉĺŔ0fum[ĺ˛QíÂh2ťŽíÜEَ˝ăˆx/í ěé\kűJÄ|eI jĘś?dźŸgCz‡ôëɕľ…1WXˆPłŠq[ńC`áCNűˇČA;˜&.űĂb…`'Üű˛ŘĘđŞ‚$ąĽŤ‚\,$,ŘUb‚ŘŕőŒÚWŚQĽT„™hůç-ó˜-ďţuWŰNžngHDUݢŞTU)ŮŞ’T”p›_PU $Ua{ôgár\|´‘Ű$‹"j;k˘ ż÷ę€m5˜FŠíío—‡+'Յśó˝\1sĹožĆűQŻ)ţíŰ0Ŕ˘ą.°Łđ‘ÇKw%ńVĐœ8Aœ›¤÷4HjÂ=‰&ŢOօ›ÉśIŃgšź?¤´Çlš+,—Ißh4“Űżt_ŰxŃ÷.<ť*9Œ}ăŢ*‡V.÷łŔDf.JS#QіĽ<łâu4eđ—V‡ĘTŠĄâl0wřÂN\(› <7ËL-Ԃ×єüąxGĆޡ5}Ö@–UŋfŧdŠé“Ć”ů›ťbaF–W53xĄˆËlĚ!t]c‚wŻQű.¸ đŞ} C5 Šž:Úß߸ӞĘ÷ä#Đ“šŽ •'ŮČٓR)—éÜŁ¤ŠŔ}őÂq&E~K…KŚ„ç ÷yäŒČĎşä"I>\učj=pĐGwč ƒ› ƒň3,Ŕ|wşć9%L‡XOÓděmi>ăN•‰öNŽgF7ňŽ7ŸL† žđMśéB! ýŢÉwő…żwŞ€źTë/Éý4‘ŰššŠP >űşÔp@Y€šQÚn”ś†• ;܋ ʂ0DęźbQ ˇI2]mě3×ńa0dœŰÖą?dƒô!ýő„şËB•#űŒ€˘?Œő”™hœ65– s/|”˘qlnľĎĄ;LŽÖćÜf'hË1͒Aˆ.rĽöÁČ+Še&źÝĽoľ,\,YZ„ęŤnŹIT*W‡Ë2ń0Ľš‹2ńŔ&$r}ŮY“’^őšÚi|­Ů=ŤĐÉ÷Ux{˝ěKpcs_ü?ědoG~7íi"çœˆtB×dcPG}(ŒbíbćƒĂýęn):JîČŘŁ-A¤’_żŸe<ĐĽaÁTkNVw÷WÍI:őYŠőY;ŸgD×ŔqGz*i źű•)`™üŽou™CYđś×ÁĘ:ů<úř+Úx˜á‰›˛˛¤Ůř›Ç_Wş*ý ěpSúŠ}´žŰş‡n,C ą]Ýhk‘’ßą7]1ďsë/b>„ćjiś ŠĆÍ>œU0ţوU„˘~‰QËÄ,ŮÄMΞ­nvž ČîRD7ż,6,Ňžü2 ŇŹB2Î e=“ÝťZ˙5ţ(á’qćÄaeőx–šHů•6Tؘé2 šÚĄqž\Mş9ěYŘtĂŃ´ôî*&oä. Ş@Bů”ü؞ü1śt¨‘sfJ§Ôd­\nm`ďqĂHĚsJ6¸ëţ=^Ě›‰˙Ilsć=8_@ň˙,œY‡8 jZߥđţŮů?mśBGXÉÄ%]ĆŠ­ÉéÜ´[°~ľşžž¨?v SB€zvźV5˜—2śœ­DhaŘUýc˛\Nuu+ؒRƒ2Dœ?‘žÉv5nŔÎ`žKß}řćżD•Y endstream endobj 184 0 obj << /Type /Page /Parent 754 0 R /Resources 186 0 R /Contents 187 0 R /Annots [ 185 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 185 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 216 388 242 402 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 186 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 187 0 obj << /Length 3963 /Filter /FlateDecode >> stream H‰ŒWێŰČE^őýH#šW‘Ä>ٛő"kÄ âdŮŃ+ą^FťůŒěţC~3§ŞşIj<ö6FěfłťęœS—~łßźÚďcŠýaEAY–*Ä?űX†A˜$ąĘÓ,‹¤TűóćŐˇCŚę—…j¨7ŻžЇaƒľaˆęÍÖ=^7?yďým”…÷Ť‡AäuŐelńůŢLőń]Ő(‡ŢŸ}ŹÁKŸ–ŒÚßîđŰŞşíüm”ŢƒŃ+őýÔ62ŁéËßâ7ŠvQč˝×ľéő]ӎ­é”˙Żý_6ßí7‘jŐŚ(‚ŹLŕHDqŞŇ$ Š4U°4UŻ7‡Í›ýWHŠ Lă‚ü'ߢ’Ü ĹÁoÍĹß0â+Ż÷SümaU$d8M}ú;ŠQŻŢZÄÓ ÁYű?ŃVőĆűƒż˙´âś•ňZMůPűD'Ť˜PV„0vÂůQě"œzĄ¸óî;‰`ŽăՊ:°x›—Ą—EᝇE¨śę59ÓŤ˘ČCďżřP)őŽzđéí'ô]Î0[„ł8ČÂř áôE­…Ŕzˇ+gŹóŮíL܆%ŒČČśxס]Ý^N<§e` ÷”ščždS1|ȳXhüŚ BÄň˛@ŻśQ°Kě#r1bÔŞÓż0€9vĆĽ§úŞ]“ţué+^šÇśŃj0g­ŚAŚ“şŻęŸí—˝™ Úś;˜ţ\ąpń˙hŽjÄ BíN¨MćŕakŮĆ([lLfkŁ‹ąAw€9´ÝŹĘ-ýč~aT0ÎlG5öU7œŞńůőŞ˛ÎľÝhœ;Cjg4Çś#äŃý­mĹ0Ţ˝>V­éeĺ^̘ÇAňš?Ićü!âŁ@˝‡78FůÉ.ô„qB¤ňů0ŃÇŢĽ×đşćT’>Ďoš˝Ŕď0—Şoˆ†řö’‰ĘaěŠB+ô,(˛ç˘8rQ\Wäšą}”xŐĚÁxk2źĚWűÄÎŕŘćH0…Ć LőTŁíZ”)Di B b?úŐß%؏ôąîô#ĄHÇoă$ˆă§B+g°J9|źĽO8Ťokâ#BÄQ<œeäŠM?P–&]T˝V—S%ËjݨÉ+ž•& aÜvè´[zT!Ńž Ť˛´‡ôĐjŁîŠŽ`ÄEž•5ĄÂ{IŔČĘ„;Lˇéďf‰ţý;űíúş‚íkW˜#ÓŤÖF …ŤnĽH(ÇéŒîMc ť1_Tň$nÓČpĆKf†-哄K oˆőĘeqÄK™ź ´ČQcŤo5Ú;gé<‹˝žž¸Ĺ~Çф9%î1Şb…ÇůH=¸Őë(źYďCd”Gœł}ېcđi}šƒ8ˆgyÜşĎ~Ä֑+Ë7ńFů!Ľ•ş°Ť:űúvâe\ů‘$íTRÇj̓Ÿ¨?pB#&ixóYŻn†÷ÚŐ˝ś;^m‡˘ťŔRö3ᓷ?ËBMa‡†Š֊Ĺ7f\+pgŸ!Ç@Ä˜Ž–ľ2vÝÁg‘č ńóUĽ,jD×N˛Ěl ý`R˜´š˘ƒ„ ŹęlźŐőDqÎ1y˛<‹zř=§%žÔ,†ţÜvšť˜Aş6(†ĆRz8PՑݟˆ$ÜÍyh'>Mßţ›Ňhá™n„žHHfČÖ|ôČü÷PíDŤ˙řčťX4}Óv\öŒő†í˘ę9Ą•]k˝f4q%ćŹe…]Čq”zŕ•ëa*á32j•vÎ(ţ#ů,AšžľOß˘ôÔ2ĄůĽaśÓŻëTuŒä{ŹćéŘęrąh„2ŒkYZtŒ3ŮÇĽývĄŕˇ40˛ç×ĺóŰ?4Q7‘ďŽFTđ󀠨E43>I@ń‘|‚ęĘKq<QBWلj¸]NĽľ1×N°8›^/nňĐ~D}I0fBÍyBcéţFŞ^„"ĚYb ĐX“°jŽTËěĚ=I[tŐ ŕúë‰$ CŹĄúb9: Ó6Ÿ÷GK˲]÷,ÔĹTŇŠzKĚkOtĘđD÷ŒŃ8ÍÁÖTcőRk-LGKk´żmz¤Ř>’ż…dá„$$ŃÎ7“‚˛ŤsżČŹ^bœÓ˝ţÝîs’Ąą/űv<žO`OÁĚLőŐU– #KÎ_čŒg–dwžLcľje‡ł1ŁOj?ŢĄ?ŃŐ ‘AÉÚ0XčŠlb¸u'umç(`sŞk”c:ÓZđH…Ž<é @—Ł}â¤QR’ŕڤ^%:™ŠlëŤýŒ“9ĽzůŤ%ýÖüb”e=šÖójÓL„Sn×Ëë‰uk rĹ"ŒÎöËO-ˆeA‰Jż&ţů "Xíő^;řtÁR˛@^_řu%S:˙R{ÎťŮCeVžśćöÖWzq'eĐń†ă,M‘ÔOvéÍhAÓŇ˙WívčBé­ˇŒÁt#ORěxî"‹ʤ§V&4Ąü`?$+É|ŢTxāˇź¤ŽGš6RëƒĎŇś‚çeö Îń…WůťşRéB˘y°>’ĺYÍk$˘ř‡8œFD55áâ†O—:e}ęĎÍ˝×ÖůŰ<šÍń”  Ü2´K-ĆtÍüLY)YhŠůžFTfÖ˙×÷ƒ9MŁfř%Ápá|S›šÄI9‚ČTŻ9[ş °xĂű3 r0gÍYPÝWü;´ľŒĖ3ʕ<$ŘXސ€4tŘa˛YČsëíŢ"úŽ×_äs{ŕ ďę2l@Ľ3Gƒ:tQČ#֤ɗ’œHĂJö×6˘HňŻŠľ=€ň[ę0ësC´Úč ÉLgâú(Ř1˜Ăx­¸ĐâfĆyţľ¤÷{b ŹYkGu洗IvËŠśéŇôăńzlOÔq1‘ËBĐbgˆI€ĄĽIA|÷Ő-§ĹÂi!śL…cnÇÂ\ę …ˇ žďĂBÜÎc•=Cą9M˛ÁA.đłœA˘|ŰmŚĄíäťů{ÂY§;§76Ůď]n‘ÁŞx‘+óĎdŻnĆŻ~ź¤’ŻŚžg’ÎKéBÉ>żČQí0~CĘ4ÍË&_ŢC!-\Ö戍z•ĺFŮ`íÂzwĚÉ>PŽ—ĚG%ŕGgŃ˙U˙ög”x”ńhäbŁüý'j‚˘Pş <(J.;Ä󱻏v ڨ⪑łŃ—TúI+•Y´Ţ$ˇ›D.)ęu(9×zbwĘçŹG- 5WđőMš&=ßć+ /yŹ \ńŸîšé‚k']d”ĘáTmcŽ;Ďö˜°ŚŸGŸ¤Ş ˙ÔŤ˜ŮÔł+ ‰aÇ<ĽŤOvżŃ^žŽFM,b=fܛ§ó>¸˜Ép‹%œ´b[ĎSwŠÖчA ´!ƒĘ´ţ͒č:Ů wkČíĽDţJćWíœu']Gî|C>Grçr/X°SRÉ$¸rĚ%Xř”Oˆ—ŢN˛­7wăTňžČĹ?˙ĚÍOÝÜÝ¨Ź˜Ľj3$%"é™íujGÝĽœß=é•kČIŽÄąÜJpéŃ$Sďš{uÖľ,Č ÎT1Œ˛œ-Ş˙Ń^ĺJnA4÷W Kť0ćŔv9pŕ*gNäHJ +ąv—”ŔCĽsůŰüş{p Ä5e'ť ‰ééó˝×ěa(J <+łô¨ Ď!#ځ°5úđ™­4OׂFě 6˙ÂWŔŃ#ŸOĘ…l08o‹L$´îF‹ŸČ…_°‹’]íŘJzTŽ*œvńĚĘ(˝\ƒ —;̜uá옴܅H=ş$¸› @găK}•-ř aLkŁ.;QJo@=€x ŽŮĄ;4ϙÖĐYĽ óœ-ĽKk¸ĄŃ˝łzľ‘Ä6ÝIć˘íôĘ_šőQw ŽaěmŢ|.2ōmal‚ÁPŸłb—ďьjčŕ…]—…m“% Đđ~uďYŠ*–§mwX_ťí ö6˙]HÁ"ŞAÝČŐyáŒŐE¨4 gR¨âĹĘ]ë!SůB™•°Ś(mú’ŔÉÖ3é<Ččf›PűAÔHÎŤ-áľ„Ę]jşĐn°CŢ8Á„dK“§chŇÚ.ř—wĺ…1A ++ŘjY7ôXézt SȟÚć´Ů…VđŹÄ mˇŇÄ6Cě˘)6 TyƒOőú‘ŇĺÍ!ëzĽů|lśkąŘŔJŢ źŐ4mł~#‹ÍaŸ˝?ś$/“8 ,ś†5-¨+u[ť{l ĚĐT<^ÜÔň_ˇ;řŘ&éÓ%eÂ:ąP‚ńŢçëú+|Iڧ㋙™ƒůŽ:r"vŹ!Käži40 Śá@"’&FçĎ?uň˝io&ĺąYnfĺqsTţűŘglĺ_°ĎřŘ5öš9Ҏ~^鍼|÷ôsًůg–ľŤü3‹ááýßđĎŒžÉ˙D9g¨€UOX:ź/H“+ÚŹHŔăFĚą ˘•ŸVpÄ?Ŕ%Œ>V9ŮęS˝yŞß=ŃXSXóm͊PďŔť,Ž-r–E– „)ąŃ|ŽŰ€XŞ"Śęk7ᙠÂVr‰4…öD,ĎýXaźŽ0ŐÓ™yŞi×˖ˆTa×SČTŮ.řR b_Ľnű9ăĽBĺ`ˆŠ/ żwŔ;P-­†ÁĎ0řâjłÝŔS*ßÔüúęÎbă‘ˆĽ)ű˜ƒşTbą"?ÉZł*¨yÂTŸž{Çžäľě°ËŇăĂ˝ Q<:°$<;O M%’`šU Ö[Úć"îVtŃaI˛•-Řł<."ěřŮ2˘ÝŹ´¤@GŽľđKä˘/V›Â•Őš/‚8…ôôK˜Đít~_ďPşuŰÔ˛wŃŘŃ<żOsöĄmš~tişöĎ;Đ3‹TEgšu}P­œ„PÉëd„ŚfeŹ;{ôä]‹Ľżç1^Ë ů@’oŠtąđv†VN×MŻFĄŐk.fôSŚł9€…˙ďŠ#áČ#ţŞSDh™’œI˘ąčɍnB3MőˇŹ°w˘’ Ç=€-ű’T7böůF¤ÔÇN;]7ş?Ž?fő>űkY­Jźƒ‰Pď/ÓÜ5ĆľŠ4şCŠKä×x7 ^Żd•ë÷ď%ÎľÖś4ö›žź„Śq;w‰ë쇒űN\wľ­úڎ´.{(Œ˝ŠŹP”5˙EâAŐוŚ:l¨iLž•]‰Ua­čáą,Püeű ŸAq0úľ a`ˇ~{ýĂ?>v> endstream endobj 188 0 obj << /Type /Page /Parent 755 0 R /Resources 192 0 R /Contents 193 0 R /Annots [ 189 0 R 190 0 R 191 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 189 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 487 206 513 220 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 190 0 obj << /Dest [ 140 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 164 184 178 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 191 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 235 164 261 178 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 192 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 193 0 obj << /Length 4438 /Filter /FlateDecode >> stream H‰¤WێăĆE€<úŠ~$“—ÝÍŚH~Xol#yXǓE­˜ŐZ’%ů ů…üfNU5ŠŰh×ëxáÉîŽ:]×S_/gŻ–KŁ´ZŽgZGyžŤ˙ücGąľF-řÍŐňiöęMďTŮóśXőĺěŐwď´zßϰ7Ž!¨œÍÇÇĂě‡ŕ]8×6ʂ…&ŽtĐťĄĆńeť/7o‹• ç&ţbCÚ2Tá<Ĺoˇ.Ęş çy”ďCMKęť}˝’/48‹_­S者mVę›U=ÔmŁÂż/˙4űf9ÓŞVł,‹\nqi“¨Ä&Q–$ HFuŐl=űzů Ř,Ę“Ńýén:§kĆrÁ7í.œg‡âTЅ ţÖ@G–€ÓÇMHőę[oń$˛Đľü‰*gÁŻÂĺ?Nülš,‹AVęŸHł2deE†$č×y”ˆ¤9 ˛b°šďČHdfcNv”‘Ŕę"§ă9¤ÇYŹćę5]ĘĐR–-âŕż8¨”z[źIIZ:gôdfoag"›/6đ"Î#§ůdác iHˆ‘„cDS đ}^?öívx!‹Ť§v%OwjŘřoKq ‚ßqüť!uăϒĎFѲc xÁŃŁoqBwťm]őţĹÚ7‡jň<}aĎkö<Ç4ëUŤJŔ;ÚעŽ!¸ůxÔ+x–§H‹÷ţ~k~­ˇg÷ŸŔ‰âŽńł˜âg!Z2”şWŇć{ľ*†BěşîÚ'<ŇPĺF­k‰™ ‘KƒŞSýĐľŞHɑ?ˇ‚+8HçŠíÖKఴ씺‡$`íę†ÂȽŞFŃí^>n€ń–żĘ]׎öeĽö}ń(23?ÄćŽí%×úĄ6Şiá‰UŐ×vW‚­č†ľdčG°%ƒđmč.i ú#@T—uąUš×+* ’ßsDM˜ÄœůdÎ\ĚšiűA•EĂ`ËîĹĺ)҆^ľ,­X"C[?pJi´v-đułjäuzĽŠçŠmËAłŕČňű˝Ź.4¤ƒB‹×)śG帋WŮ-§•—őL6@pu˛ĎďzUzNݘ°ëëmßŢ!ĄÔs%u§cÉX•`ä랙uăŤPKP’Ŕ^”đŹÖ„, ÖU9ř+ăEžń†Ç=ŔĚëfÂĚUĂ ˆ̨.(ń?çždžá̓źË$ď ŮĆIÖQ¤9Î*Ă9ç$ăŒdܸ˘eŻ—(NüË}Č÷Ú>×ç ~"Aź‹„|ܓžcĎBĐąoÉY„":őmOúÎC`(Ȃ‡p<5öqĘúcßĐcŢkíó^í3\L™Ţvę/|>C!Î-×f˙h3í™S)Ú_ęŚöçŒ9ŃT!Ą ,ĺşÂŰßŔށĹ%9źbR€˛Ůk¤<Č$ö  6‘eÔ§MŔ&ŔĹjŃ×#ŠwUÓ#Uh]Œ:†‚RY> ̑š-÷ nňWŠÉ骥ŸëĹT"ˆP€Ęä]ąň•–răoĄ“çbťŻhWÓvOžŐřî’Nĺĺßň]xIע"-[TÄÁŤBé(Ś.–HK¨‹=ľtż“ú~Ů6őŃϞˆLÔuŰśĐѐB/"=ŕćEŻuSvUŃ3 şúXqEdžFýœ¸Şďˇ?$Ňó@éŞ~ÓnWw?ʆ5 ă˛7ÎŘ´Ď괞ܠ˝¨CRůOƒA~üŠŻň_¨¤’™ËM÷dlDęŽĘomüzß2‚„:ź=î:HˇIĺZđ„ÚáKˆ?[”üSE|‚u ĆżnäľRMőOÎŻÜńý×#Ćb+[ž6ŒÉ&k*žÉ(ťSä¨äJe'ťäZ~mď4ýđŞrÁéˆŔş>";}őq_5ĺŘŠ3 1Ô ŞçŞ!x*>€Eîwż^]w€*mń—x†Fyń-˘§J”řϟx–ƅ:ČČGőßĐA.éDś‹Á ä™Óm_MŻúd˙SýT—^ěĹhťÍÓ÷—GŔ)âtäńܒiɡdŘú؏ŁI™9Jr“$'’xŚr2SÝĘHĺX Ł^Xﶕ´YŢˆďQŹŐO<1 ç†î„ŮŻę5}Č„_TӞˇß{’ÍĎţúż=†ý•8ěq6đ,čiż€°‡GVÂč Œ%řBĂkĐ\ňˆS>­ĺ˝äżƒLT-Í–é€|—=űöäyBëdăHžˆˆ…ú¨Ł÷ŕXyœĺ—^,ăŒnŕͽ߽śĆż?Éűö˘Ă]ů PIaů‘E9žDÎÂ;ÚkCÍgäAŃŠ:´Ý ŮtôL>Ő0)şçeÎţŹi§ÎcĽ/ŢŤŻÔť|QhŃż¤c/0ď4EĹM3•sš™÷XŒ~ö ~s‰×+ž8B“˛˙¨3d@ć’4ź'C˙=ß|kÉ!9IŇó+O#ČçG$/˘ŘŘshžŻýçÖŕc (^Šąó–Ögžkť˜Ä˘ŽÇ/*Ů8&Á¤eâsăźXƒ‡đNńD(/=1ÚÓzÁn‚ęc¤lÁŒä!źč˙Ŕ|ҞOB›ĆɔßqI‚gœÜĺÍ çaœbäł9*K'|Ąót’aâË, ľ“5Ěb"… řŐM)Ś–,Mo řÂ)Áë2÷łýîfž˜(Ë:•rií—bť3› n ƒĐՙ5g×ŢܐŹéZćBň/)ˇŽÜŹ‚’ůŸČkH/§M’Ć×n‘–ů% ŃęŕzNAŚŘϧĘă/M•SîqĹbŔ1Á"¸ăÜŤšŮŃÔŚŇŔœŽX"k!MËšSoĆsĺžëŰnb㌞ěd`­ŞFfĎ+fq„~#”rôIg@4ĐĽIˇšML劅QŽÓc‚\ŸŁšŐęŔ_\’/Îtž ˝ÇÚBi‚óŸŐNc$lĎ&M™/ˆ‚@1o%/‡śëU~‡‘ÁЌËÇ˛Çó/,dÉ^l÷ĺćmąâ›ŃWšţGyľě8jDŃ}ž˘–Xšś kV‰”HYĚ&݋HYaŒŰhx‰GˇóI>8ç> chO&+C¨[÷œ{îš°#™ţĂc§öś˙ÜŚ7‰zVš×ĺ-ă6ô ůad™"ŰąÉöpm[YžŮ˛rgńéČ1íůA’÷ ŠE!†Jř°ßg’ic`aϘš€&™f­žH“ü>1<ż*‰‘Ű’gÜEŸĐ8l}öŘľÖ§¤÷°*°oŞu•ýŽÓb3jaQŠĎÓ~ě*žą.˜t}ę,# Hg D×Wý— ťőJ7´„ˆńœ•ťąLčd3Úđ'7”…Œžźđ qĺ!`‡€EĐDoq˛4€Ô5 „v_OążUE8ŨÉIÝ „Ľdŕ)6ŚYîłÜzŸĽĽňšs+ävćx‚]% ˙'~SÖŹC™oiö ÔL%ˇ„PQRd´ő´TŰG}mz*…&6Ş!¸ťĹ´šN‰qÖ#ëdň~)˛ ŤČ׺yÇ ă՜2Ô}QŸĆ~`ĺľ"‰÷‰† „vĚ1ŽÉÜg•Ś ´y‡DłÖŻUˆ7Ş0œš— ‡ –ŻšLhöëNľ›!ámľMa{>> endobj 195 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 219 615 278 629 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 196 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 149 87 157 101 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 197 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 363 87 372 101 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 198 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 199 0 obj << /Length 3923 /Filter /FlateDecode >> stream H‰”W͎ܸFŽý<ä nYż-)>Ŏ˝Ůq#H֛ƒFbO+VK‚HłyŒě^ö ö5÷Ť*J­îAâLSdąXŹúęŤâëăîĺńŤHOť( ʲT!ţܰ ƒ0Ib•§YIŠŽ—ÝË7&SľaąP™z÷ňŤ‘z4;Ȇ!Őťý2üźűč}đ÷QŢ÷~‘×WŁmąý8Ěőů}Ő(‡Ţ×>d°č“ˆŐţţ€ßéTŐmďďË ôýˆ–ÔWsŰČŒŚ1öâ7ŠQč}ĐőĐ7ęmÓÚvč•˙÷ă7ťˇÇ]¤Zľ+Š +\$ ˘8Ui’Eš*XšÇjŇťÓîőńż8 )‚2 ş?Ý-*隡\đÍ0úűĆá†ŘĺM~Š˙-Ź ƒ„ §ÉłO˙­őňóx$8ëř{RUďź_ůÇlâŰJY‡Ś|¨ŃÉ*&/+ň04áü¨ p"œzyńŕąť_“ČÍqꑍ7Ŕj^†^…{h‹PíŐďčR1-Ez?cŁRę}őčÓ!ÚOh_ŻnvÎâ ă˙ŰÁyXqx( ŘޙÇq˜ŹQÎ=Q(ţI‚CęÜG1áž­Ć[/Fâśńbązą`íŞfî4Ăśf\gľĽ™ŕ€;ýEšąbĹżƒż"Ŕ]ű Î4v:đçx`‡O˜üˆ`ă)Ó^ćŽâeŰöźU]ޛěRłľ@wÍ_]+żŸŒšÍ˛Ážiƒ'ő„EŐ?ʝôJŚ ëä8Œˆxž)ŹDŮzĄäzŁäšŃ#Ć{‚Œö3 ŸpĆÉm"ÁůˇńIP5М$ńÚ'Íkňe”“l”‘ů'Ţ ‰HL2-¨ćKœ¤ąŒi8Lö¸Yř:ƒ{ťÄžjťĆŞ~ŕ™żÜ™×Š;ťcý=ŠUDĹ4t82??b2u^ ɃEü!÷Ń;ŞŃV×VU €[ÉČ£䊗ki‚‹~A1şŇe7 ö ńlB@Őˇ GsPm_c ţŠĄGW†¸‘ŇU=‚Q.{ē䨎`›qÂćšŔa˝ŔA.`ϓ6çĄk8{``O‡OÚÎ|‘ƒ7ńÄżˆ‚ &‹SŐÉęI }GÔÍ5֤:Mt­ƒ0WáŐźš|8ÁS†ůÝQŮç֞U×ZŰi5LŞÔ_é—í?ţFŒ-ŻĹ¨ť˙ě°ÂđHˆŚ{Ž,%eBk”m/”š(ő§ÁĘKČc‚™–ßQacU‹ÄLĹ)ňdĽůŽƒHÄI^ľ néŤŢž SĎâđłŘjÉm[ERLŽ´Ł m¸(ÎŻźĹžż'Žmuú\Fċťüƒˆ+!ß}ň‹ččôÉňöąB¸ĚŔă§vB*uĚƒ}RP?iâx-°ŒlČó`,LŮÁlFë=Qăä°§!‹˜á§:íцœ;sK2S”‘,v-eZŠYfPô'­až,˝yççŔ§[rŰgb-é"ODUźçŻ(Wm×ÍĆʢœlEĆ(AĂ2=*ůEr5N|ąŻ‘ôvűŐä@n|@‡”Ľ1WÚeź”ZŒƒ¨Ľ™š"„üź@GadlßnóžĚşËhŮČă8Îô[ĽĘBꞒĂZŰók^ć‡wí#¨á-Č]‘Ϥ•ĂÇNJ\ÁŸě 7~”Eé–ÝDx+˙/­mZäAzČŇľľKŻ qmšÓ:{Ÿ53O*R×ăbMŠŘÓ.MąÇ´Í#á+04Q˛zŞx˛›ľ’‘đ§H+s֑˛ĚrڝÂxüÄgrŠJ=ëěCÜA˘ęGŮى†Ó"nRQä'ęTËŃc7X+ăĆ ˇŽzEěě¸ÓOş“ZNPŻ‘s„w`đ˜V6ő2ćuľ\Ź—/˜iÍRďĽŰ%Ňż˝_śŢ/ŰSşŤY*_!ó¸p<¸n*2oš`ć]ť§`Ű ETÁ¸ť OšëL=O†š1Żz§îM‹7ç|ąDŇ\|aď儢ˆ;X[ŻŠ´á¨ę“F#ó´˜ĆJŘ96ŇGÇE—ÔrŇÄir>ȋ÷3ń~ś<)ď[śhí9#×s>躂ËĺóY[0xă âc"ă=%f•Ýs‚^cÔgîřh™!Z,IÜŃTK˙N~$D–'Ç\Éoäפh–3÷ç łç0Płjv†kŽWă/lŹ3QLWCˆ*9CTQNÜ`­\ąćZD#ŢGÏ@Ů >‡Ëńä‰ÓĽaEPŃkÇáx—Aʝ8óń:Ŕ9ÜŁŁPWôč“ĄŞŤŽ[ŕžmܐ#›÷ćľOY^‘o›Gj,K ZŠ?rűÓ]•; @oÔdW5™kéЂ+nŸšĽ‹Ë )žˆěŕľoÚM\ŮŐ W2ăY\Ěo9⪯ŠPRůáşN­ř6B.œŽťntÝŁâBÚĺí¤Ťúě` Í=ގň¨‰ oGˇFwižuƒšxEMźźčÜű쁓6eĘ(¤WMŠW…ëÁ} ç=_obť7ŁŰ`¸×‰°i!l›ÚáÚ>ˇxŠŐ˛ičmŰϚńśňŽU":Ź1L¨ąć("&K%.䖇­Gi–}jœąZ.Pp‰ŞřýH)uŻÄ9YjbĘ5-ö‚ô…€ŒIś˘U+A’–‰˜ lYป€†Dę$YˆŞŮľSĹžşË&Âtĺ5ÁŁrm縗's‘J[2ńD^CŻĂÁ lĆQť^ÖβF$™č–Gˇ0ýŰP„ îčifŹj'ęTČô˛Ż^ˆŒľT9I-zčéDŸČ%ĂÖç)ôo9yę"Ëł,'­F§n: “QU˙ʊ\!´ßb¨í[ŰRó‡6 ŘĐ<ĽĎŠůĂ-v˛ôœëň ܐT´>@>ň+†€†Ť.Ń}qÝ4Č7oÖ0YÓĐaĆĺ†E•5Tf53oÂĽ5ƒĹěăóÜ7%žc­ŃHÄĆÜ[‰ ÎĎ2óúF ÜłgÁZg[sîj Xďxž6Žné-tGˇĎžjśĂ zá°wÓN, €[śnÝŐäžŃÝIÍ#5JĂg=íçń•jšVłÔYş­ŢxŁ—ěPt1ŤĄUg†/ľœ“¤ŻŤ¸Ëcs,[€#ѧŽĹŐi.>ęĎč­úÎűľ[y”dřfŢw>XŃ-\.U~M˝Ů¤ú4ƒHëá2vÚęÎ5Ťě—ôúěXQľw#ö'C ď"üĘpŽĂý'mňZâ ő˝GŢ+îxiÝ/VâuE!АR~Č] IĐ,ú…ňŞéq܆Ą÷ü `ăZ–ăc;-PX höÔŮ=xÇŞŽc§ś“üś?¸¤d+“ŮĹ›)J$ŁÝ6ى,˛“ýÜ9Uمn€ţŘrIVNŻ—Ďn­uۋelď\çVwÎ"oĐĆťŽZK/}˝ěĘíFvp˙ď.HRu—źçČ̂<@˝ E „c,`{śŸĽŕ+¸FůŁźr€ě¤îÍ؉]." ĺˇHŤwĘĘ %jŻÖÉŃQޛČę&Ë'jŇ´DIJ„nKťçžUg?ŽđNE,4ňňK&‰ł" OůZőDPp!wĽćTđIqë‡â~( {qṍ4„Im#?yĘň‰}˛˜whŁ™Śr[r^ÚőRpôĂ[ď†<12ň@鈏r–,œ=cZüq†ž‚u¤ď´í˙É—.™vĺwl-‘p1UŽÝÓ%?ŞúĚ ŁźšE㋄χă.Ľhâ[żJ• âď\ȗ­čř hç’"á$ŁjÎáÖ5ľSƒťÍ~ńÉՀŕ…!T 1sˆa:_aDur0¤‘›‰ăŮ×Ďčß ƒ§'B„ŽuóŸźG/źGźG;)s °8#Ź4Ĺşw$CíenĽ…Ž[aCŽ¸őţ•9 ‰ÚgôČŠśjľ˜{{PíU×^YW3AÄ]Ňü¤~ŤÇćF…ŽžÄ~úD7PÓpœoŢp ܛoÎ91ń6‹IVă+P2![2!s™q&äNٚžžÔDĚx‚]‘ qç„Ěąóč&ŸF–‰Ą˜HuŁă$˛—Ő§ŕ9T˜d—žÝ›˝âěp‡Ú`łŤ•ˇŰ6ĺţ%nš ńK_őř%c|ן֣.ńźóÄ,‚qŠ&G.Öq8­¤Úű™ďĆ% ĄgnéfżQýn f˝W??í^Œ8äxچů&ç`v™8Ìłŕ2]źśűdÍuĂŹœ€SUĂpˆśŃcă?'á;çÁŇđƒUM{ç)#OęîËäG/÷i`“⍺LŤzk)Wd—­qx#GżăZ9ú•.ńŮŃRgČ~áë4`Hƒ ň/âL(°Ô¤X;Úş[7" ˘Ý2=sľ‹č‹ľěăŮř—,Ą¸d‚}˛/íßâ7bć´Gş°óĽŤď‹í_í~ŽÚzě,îŞabWšARKÓ „ŹŸ/3Š˙Š[p˘­Ŕtú‹ö8ŕ°á2ľđ÷0œZůŽČ4PĹŹÖřÁĐď;> Š5ŞńŇăQf‚Š1p8Ë`Ĺ(ƒ W/1Ió`8ů~Źé6 “b)2Y–Á ÚŁőYA§ äËŹDáW™bŹÄośĚA<<# %ˆ0ˆ*~çyčy›>lžyšöę逭čďđ´Ńę'˙ď*‰‹TÝhĚ{őü)QÍFgYœ¤•Ú—ű¸Üę´Ń%ÚF/é6şBĘšarHҤDI™P‚(dŐ2Iç:´c°ŚÔĄc@Uľš“ ‰pÜ@kPB[ $9.’U+ƒ¤D %%%ĐĘŞ<.Ş*<—?űcfŽŁ/‡ApŞ‚ÚeID=Oő[Ż´áA°č,Ţ=JźŇâŽh‚Ě˝5BY—y˛ Ü ×ĄSoHX)ˆˇ˛ źN–#ŝoIœ•ĂćŸ{*! endstream endobj 200 0 obj << /Type /Page /Parent 755 0 R /Resources 207 0 R /Contents 208 0 R /Annots [ 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 201 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 692 134 706 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 202 0 obj << /Dest [ 419 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 197 692 256 706 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 203 0 obj << /Dest [ 200 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 629 148 643 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 204 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 433 317 450 331 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 205 0 obj << /Dest [ 318 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 399 199 425 213 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 206 0 obj << /Dest [ 200 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 410 122 469 136 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 207 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 208 0 obj << /Length 3894 /Filter /FlateDecode >> stream H‰”WMsăĆ­\ů+ć8H‰0H ˇ˝ëŠ×e+ˇ|XĺC°Ptţ†˙DnůyÝ=RŇŽ7)U‰ćŤűőë×=7›ŮőfcT¤6ŰY-ňëCߍ]Ů5°űá8ŞąŤŘ™T\\i5Xyďk7Ѐ řQűş´jW<[ľď†_#sąŒAIžýňG[)PeÜYĺĎT•‹š˜ęĄô'=`níh€@¤”bóYśdÂ%WęPô€űŘ=DXť ČŃ‚fÔlŐR ’Ç`N!čü8\“y´\(´ČC5î\ĐŹÚÇco]l?ÝÝouŻÉOm-^.ą5­ŠFÝYŘRĂlYäŒîľÇ„hyi99źůë9ŤËŮe~÷öĐ  c$oﮍ*‰żÜÍ bű*šĹ ş-&փ:őHՖpČľđ F p ´„ł›zűĘ x2(ƒśľc_pHj‰íśś ˝%Œc­]ÝşsAŠĘ>ƒ4ŕ^wíčřTrđG—[Ć3ȍלs$éÁłŢâˇwG@âóž8kĐdŞ™L5bjńĐq<ӓ&–3Ë2ĂAŞc&qÜ:”%Bc(’ö"2`RÂĚů9ĘTÝ4Ça”ĄC#‚-˝Ť‘%ĚčƒlÂű–4Ҁٴ`8ůFŕ:;YńŮŕźůs9 ( q …cD̉_Šv'Éá[^%k;9{ŻxCćŇë”4Wš+c*)c§ ő+’uŘŕ§­şÓŔűdœˇë]ŐY˛čƐ:E\Ţvý^ Çz, xó3‘›ĽŢc‘Ÿ$â|^¸şńZQž˘ž áJ Œ„f‚$ţÉr˜ŞęCç4łw¨ŚÚcÓ#üĽ9"‰[é5Ĺ>Ö(3ĺŽ>¨zhěŢśÄŰŹ†ş˛R ěŸe˙h•ĽŽQ€ą #CĺLGĎr)ü‰“Q*J'24q+›†>‘ Î]j`‰đśŻ('0ôQVk‰^Ť˛CÜY‹MëńLŠĎ\™' >ׅZswźŇ?JűQ"[ Úwď6ď°žˇ^Ą”*iGr׎<ŘŚ;Q‘ó-L—žuML$ăb÷’˜o2§ŰŽśEĽ…LĂĆ^NÄчYńŕS¸†9–mš+P”ÇŰĄ;aÍžh ɆG*PúUŢw’ÖçËŚĽ0 ŔKëŢ4ş]Y5f8ĹÂę[¤—@łÉ„—ÝďeˇJ6]Š'ß>É×ĺ_,R’vŸĺăĄ#Ľ[†;ÖÍe"żçž6Őż0Šţ ÜŘň•ÔCB=8œóŁë°HP“ŠU˛:jô˝oğáßśďöę2=Ąynx'quđ,ĎB5H Ë;Ž>~Š|&—Żž•pĹ0p!x‡G㊱:›f ë-Ińځőc`Hˆ?*Ę}DäŔWŕő ~ óhĎIfŘ3T™ŞöéçŠOăö•œ ëĆ “ßôWŽŁb8V:‹h :A´ď.č‹?+ö‡"dhGްŃŘĽđf­Ř,Œle„n-ąKȕŢKwďxŠn˝•Ť^.i^+YřF`ż—Śn-c˙BŞWć[—Ű­ýÝa9 ĺ=ÁźT˘˝%ŒGťđ’şłöBŠW‹Čß#R¨ęĄžäWţˇâř‹Ě5#0ŒO„r†)WGéËłűҋţLÓ"™÷ńZ†;uôô÷§yţĽÎţ|wŕIŽ3Ý>Šgé&ĺU}_7ÍńdůíL(2­:ćŁ~şš.hÓ5—;şËú&m: ̧śęĘ#u\Ö1ů–hč čŤW—>Đ.żŘŃL×ăŽ%Š1b–ÇŐVą“b•$ţ4č~pƒĽKŕ(o¨ [ŰTą™Ö)7§#Dcí_wňĘ >W› ‘ËKJłŘvΰĺ7ŐĘW’—Ŕgy™„áŕRł  …4âšś'VSž9AvÍÜűÍěz=¤j}§°"K^üż[Ď"ő`ý V濔W;o7îďWlě5>f†déčŠ$¤.HœS$8CF”@?ßp9ĂŐɁe¨Đ‘;œÇÇy|\žÜŰOËŻż…ĺă‰^Ä´‘ÔĺÓÜizœ—ë)7° |#I[z)ƒS™*d( ¤¸ĚŐeńɇSLhő ˜ŃeęK”]Ł|Pl2×Ó=RY˙Wč15AL§Lź †!ĺ´Ő˛(h´ äšU\9ŽýđpRľ­őăăgfXlý\ƒÉ†ôú4î.zŮŹď>ž*ďísřá/<ŘI‚ˆă&â­cÁ!V8ëVHš4{ÎŞ˛ś Í9”ÍóÓŇŘ/ÚăÄýđŰŮB z¨‰eúţď>˝FŒfKo,Č7˜Bm ~0ŁńfȚ)ęŚtTü¨¤NVËŕÔ{N¸ç7ĂŮňD ' F)œyˇ¤cEÖ_@ŠŇz?ZŮ+›EśĘßp…•´4ňÂ5o-š9Óă›TŰrĽç) yš÷HĄ#–‚œĎD›0v>ĆŚu‘AᐉŒÔ Řů˛ ŽD]@ H)ě˜bŕŔčűűĄÔ°ƒJ‰†bÎ8˘4d(î21ě2¸5ŽCłćŠXóľŐrPLH ”ĚA1áK•vPŹ25ľĄ¸FȰŞëőOŠAęi’ľŻXŞ oS˜fźˇ4˙đOâK ^—€EMľŒ[׊U󟠁ů!*H|ܐŤĽ~ňR"W9¨Ľ‚c*˝í Đ"k.ŒŸIŁiŔ ­.‘—łŹˆX{akm•A˘ŔޝŃýEg @YďĆ ›čľŕö™ŠOn(âěLˆßÝ÷gÍiŇÂŰçźóźď0J°Śž6€á˜0{@V¤P1âχÚF×ůó,;cAcÓÉüŘYP[Ÿőí"ľJÔu}]~ĐÁŰĚuL˝ >Ă[‰Ąžö<’yţs÷úĄ8ř˛>źßŐ —ęaę֌\ą9*ćîđçQĽĽ{˜Ö/ #˘J)d§|ĽóNý ‡uJۡťn:;KŘĄ$s9ÝP—÷`ŗöWćď—ËOĐĽH°>ńöKÓů!ÂÇŃc—ɏóĐőáţ\AďŃkÖtVç“ŚAíť—ÇkżďPc`Ÿ"ę^†Œœ–¨k;÷E–ˆÁ›ŤŽ$"מ¸śžœâÖS"˘-ÔŠaŹÍ†ž°ä*—Ĺ40FOjĹmŘ'†.á~ 7q\NO_.Ťˆ–ĐBQIRIîeŐGTôŽjĘ(§x… ЉâîH}šţîË ‰ńÚq_ďˆdT˝Ä‰HG  c}@Ä$ĚEÓpÄA…dtkžƒj‚Ç ĄŠÁˆ>hžPE1ŁVÍW[O8ŚÄ­kđőncâA 5$âxPÁđ3 m=ńp óŇ4ÜÄńu<¨4•Œ6<”Î% 4đKdťN$ßÁÄ,˜˜„҄úôąvâ¨4Ý֗<ßZš;”P9]bh°ő°Ą'l˙ń‚q ˜ä¤ăÄlŒ5N˜.a~ 7qü/„Ö:G¨ąvŇľŚWxD˝ą|Äc z÷$ęĺéëXđ0 ‹Ö4řzˇqŔ#eiđüŰncŹx¸ÄđŇ4ÜÄń<:ýÉĽăAˇxřż¤zŔƒă­Îü iL3?l=ńp‰­kđőncâA„ “™ ă[3?l=ń˜ĂKÓpÇ×ń *Ů;ę*†ÇfŘÁĹ endstream endobj 209 0 obj << /Type /Page /Parent 755 0 R /Resources 211 0 R /Contents 212 0 R /Annots [ 210 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 210 0 obj << /Dest [ 209 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 503 148 517 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 211 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 212 0 obj << /Length 3399 /Filter /FlateDecode >> stream H‰”WŰnÜČE€<ÍWôS@3c˛ÉćĺQ–׋ěÂ#šŔŮŘű@‘”†ë’ 9Rö7ö'ň›9UŐÍáX’ׁ ɮŞ:ýzˇzľŰiŞÝÝ* ˇyžŤö1śAi•ĆfdQŽvÇŐŤëѨrdą@ĺęŐ÷7ĄşW TŽ6îńqőŃťń7a´Íźß|lCŻ-úŠÁö]w*÷ď‹Jůxó!ƒEŸDŚÚß$řiýMžÍ˝{?¤%őýŠŠäKM;5öâ7 “0đnę˛k+ő]ŐLM×*˙—ÝŤďvŤP5j•e[“Gp$܆:Vqoł8V°4Őj¨WwŤ×ťŻ ĘśyŹ3ňŸ| sr3ŻťŢßd0b—7ř1ţ7°*ŘFd8}ÜűôŁ^˝ľˇtíŢĐQĺĘű“żűu‘ؖ˲4fĽö‰4+MQVaœýažMDŇ{E1ń8Ük …Yë…DšľXMóŔ3a°ÁéA¨ş"§4-eYx˙ĹFĽÔűâŢ'%ľŃ>„Ň…ŮFŘč­ ô˙ŕ4ȡ:Hň9Â3Ž,ŒŢú)BÜů!Ĺ×S‚œyꌌ7Š5L•oya€ń ŒŤľš*XD6ŕŸĐËâ´WͨĆćŘäk™˙pžœ%zlŸÔ´ˇ[­BkŇ?ŻţąSV3äš^ő|â}ąFŘGdmY>뇚†ÍÉ ‹DBŐwĂ4ŞŚ§őŐݑő#Ľ3ö^ű ţ_o•ş:ŒÝ*‡Ś8¨žkÚŠi)ˇpťâĚź‡ŚŹU54ő0 €îëߤ@@hď@śi.ď0$AŹp_Â09/ä ¤N#nŤ§´uąűŤř‘›H6ťäS™8Ę ÇŽţo NŤůeD ;ËDҰŚN¸M+ěš’3íG1üé÷Ž…3šŹć–YI‘9UÍQäÚÉí%‡ő,<.U5âžHl,úNĚ´ÚŻwüśôś94‚_ ĂşŒ$Ÿ=žChń` gœŠś*†J˝Ś&ëýýfťŔQŚg…Fvßnďr/ÂIuŻâOž:RVSv2Ě=uKV!\”pU70hPĹ/xW6ýi軑}@xŐącˆŽŽ|Íéą=-‡†|ĎĂ?›áoą2O9PßíšĎ‘Λu)ĄŞÎ­Ş8؀ÇnřLľ#°XÚ ČNř´VŨkě(Ć?Bp' ˝[@ë­€€ç\ćY˜ŤůZ<•—#Ś/ iľˆŐNIáäIü´Dřčc†>îAŮ^Y Ő\ň­z(,Ř-‹{W%VńŒFŰ~Ű~ąWÎűĺXçŘ×Ë2nlYX]ˇ>yD whG&]_ˆ ĚNÜŚ`a;ŠIşŹj¸-ń¤ąw× Ç‚šÂÝĐYfťáČŽa‚ŢŘŠň4ŒÝ đԔş=M“ăłMélSj[×PŁ5ŐuËMŮUéŚ2ŠÔ™0hü´U÷8Ş˛hŠG^”jxĆ|4+‰D J[oSń+BdŠR ćÝ޲Z´ŃbŹ–ŽŻřßÎT%ÇjdL…ҲSŞú#Ů"dŰm šö™şđwßZŽU3ö˜š(*VHƒą=vľŤ˝ňd˓Đ:teÖ6–œf@šn ´áľ§Hŕsť4j¨{Wé4!9ú…Kă~QĂ/¤ňZTyhĘĎ|JĘ,($bń\Ç1ŁşÚŤ˘ďąKd8^żŰyúؐŹÚw‡JâkQ&ž#ˆđ#Mn㡅ž çŚíş6‰!‘5äę=óžÜsüŠÍ!\‘ď߼ŸŘ놈M÷Ô;…¸­ ł\`ćxzD<]JůŠy/Í ß.É)˛"są/çŘDe'MňÉaT=Ń[߈עI{3djĽ7 ëŹŞěŽ}á#ń„•ś2ť› Ĺg7|ÓŚloA5ĎǓL50ŒJ=bşD ü“ݐľy<_L˜„i &"Pˆih rňy:Ǫ܀ü 9ů™M~nđôÓΙ+"e]ڍH6'f°W™lž“đٗ‹IĚ7Ĺ ĘCGäů9̀‰Ř¤¸”ŕĽ/Sůćţę':dGnH9ę÷H~Î$bşO …ľŔD/BÄŽčPÚíœ9^Áŕô¨˝îč&™Ú /K-Q1U‡4rž•ÍŻ—Ż)a†+• ů& 5sBx÷S7Őo‡/ 9zŮJđ2ś˜c:žn ˜8qMęäœY#\h,ŽőšÚ”źń6wŞý9Q>7PŞćîNHşá‚r§ç›qxć|65ý"ŽBDQŕĐ3Ş…ŰaşTŹÂŒzB7—„](YnŻ>;Až~dňú GŔížä|¨śr8ľľŒŸI~ö˛S]žR0Ź˝ś†äÍUŇZ×Oś_6Ó'SuYá˜â}׎ÍíĄž8“E—asÎpJH,§JŹńÜײkÜDž ŢOŢżÖęçľ˙ďő<ÍčěO>‡—…ąá&yN¨Ž¸ZÉîüL;sq3 š ůô|$÷#f„Šg'9Zň'OĘŕ­­ Uře'řłíVMÄĘ,En°˜; 6ęĹIϢ‡<j?ŻíŚ™rć_SŃŤĺ\§“^ő’›,xFŰCŮYPR“|IQžôčÚíů˘a;´tlę¨ëË ŃőV‚řc‚yyÂLXî{(ÜŤŰą;œ&şU5{Čî$ěžöúŽH‹ƒěGď.ÔËp#ą}ÝNF ݚĄ.'é-™sƒÇ°5f/űSZ+.i^*Y9ÇŹ'˘ł ˆŮŢžžLŒ¨—ôÄNÖŚ'yRxOxüĺTŽš@ŕU3őáÎNŤďvŤWףQ×7 ­/‹/ţß\ŻBő@ő+>ä‰zT]ďÔÇ_U­"żU˘ý'1–Ŕĺr­r€(Ô¨ôY"Ę@+ĚsĄÉśąNŸœ%¨št)ét›š|– Š/`‘›UŔC†ŹMĄQ'*ÂI”Š”ćNŹ˘xGVöőî™ÁŚP˜aŸ!-¨#;tĽ™m–Ýě$č/čÝÔIQ<ŇC¨8Оš„çz'Ętš„—QŐ"곊yŒŢ}ťŠY‚ç*)Şa<śŐ{?ˇ6č!öž@ăÝú´ zQęć7îo>ÝU0ŘŔą¨sJĺ;Ú?LP˜ƒt/⏚cV¸Jo…DđíüsgÝ,[+ۀˍO=…m0dƒ#ĹÔŐr ü:çk웁Da* ÷ÇNƒ3‰á\-š–™•œýFŠBÔ_̅3)¸qđŢäš5ÚG ÷)4:…űŇôm^)ľ3ôâ|„šČW‡čĺ1\T4;oˇ'ŸŚڍźśü:JŚ``bÁ$ÉL'Œv}9ˇlâšé+ƒA{ÈNr>€vé ă̗͎Ô@ „ďűsäQŚíţ{ 8!^aö†Äëó•ÓédÁ"Ť]y+ÇmWš5łZŘJlîY[G,ç{CŹQĎ<ůŻ}Vţ ßűů}˜˜ÉÄ´žÉĂć“y)…Zîg‘ćڝǀ~ÄsŽÚ”žEVňäő]z÷uü>6œĄ&œáE–ĆĽáMĽ]^H‚#_nŒńô‹#ϖ´8mÍvÄm"$“W$îxĆđŒ~GkľĄŢţ€iĎ Ţ1łäÎۙ9eŽśœ™S1ÎÔ0ĹĎĚ;ć†4óĹJ]’ÂҐŹ˙śÎ+ő\zɲŤ˙OÚS}ҒŹń庪ţuK =ëHVPŐîĎ-idđŹ#YóĽŹ­<áHżÖ@×öśŇś˛Ö¸2˙?UPע˃žĄ âYr“çeĎ]{yt$#Q÷Cgd—Aëř3˙š2xF„ :*ÓŮ:Ś îŁóŒϤ.čőDŤ.ŠĺŇüz␃÷Á™"¸ó"xĆl"¸߉ŕ’<ŒĄq[ÉüÍŐ[’ˆLTÄŘśŃJď0%ŠgĺŔ\“üƒÜ”UKžTc{ĚćoäA†­EUœăçhfaŹŢaŒďŔQmőQKŐŁ›ŽHâéčU=ލv!ИZ…¨ Ľ¸GP qřbâHşŒÄkPňjŠ9=F&žúŇj :łx$NůGŸŁYŇk#Őů0ŕŻ.?5ďęÄ^†Ć$šO7’}1í˛Jnłšo˜˛Ů)ĐˀTŃ ďŤŐ#Ŕ–áĽń˘ľo}5 ˜ëÚ­'+ĽžDŞX_ÁIŤhÔ]•řƒvĺĆČOtވ4˛ŽÝ١ĆŢ"âœbŽˆn‘y`˘íé ÜóŔW„/Č[„4(ą{`ĆťčD›‘˘)̜h|§fcṁŸ{9g81š fú!ĘőéĺťňÔjń endstream endobj 213 0 obj << /Type /Page /Parent 755 0 R /Resources 218 0 R /Contents 219 0 R /Annots [ 214 0 R 215 0 R 216 0 R 217 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 214 0 obj << /Dest [ 200 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 210 602 269 616 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 215 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 314 602 322 616 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 216 0 obj << /Dest [ 372 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 485 160 511 174 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 217 0 obj << /Dest [ 130 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 248 110 307 124 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 218 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R /TT14 659 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 219 0 obj << /Length 3857 /Filter /FlateDecode >> stream H‰”WےăĆ ­źę+úą™’¸ěćÝ~šÝő:NĹeUF[v˛›Ĺ1–DIěüFRů…üf€&ŠËě8ŠŠŇ4Én4poWł7Ť•UF­gĆřyžŤn™~†VĽQěY˜ŤŐnöć]Ť˛ămęĘٛoďzęfŘTÎĂň4ű¤ď˝… ýL˙ęŮŔ7z_úÇWÍąÜ,‹ľň6Đßy؃mé+o‘ŕűX”őŢ[ä~ޟĐg‘ úF;ˇfíäĄwWHwlKů ŕÍVęşßě:uÂ?őP]:4őŢůŃYˇú˝ đ| đ\\~¨Únjݰpcőľ‚V‹ČPŽ „üšV훓ڝ(]”n/<“œ:¤Ú⤊‡ŽŮűJ­Ý—Âł”ĽĹ\Č÷)ŇvAďërŁę^•ĹţJăpÔ8!zŘkžëuE :šŁČ‰őš¤Y˝(NîE[ŠâpŘÖĽ<Ä[Şž+yŢÓţômŽ”vЇugShœjŐőőv‹î˜“ ›IK}ăQßXôýQbńIröëćÔÁŇŽÚ>*€X¨ŽŢpsŒŔ@Ę!$ÎţY`fVsՄ‹"á"XPˆüKÎg´ăŃeä.ÜŠšÓ^Ý-TK{ŘĄ8"fGb+rÉąă u%—‘ŮOŹ4ą2Mý4W™ß¤’°Ë€ˆc™żâ`Śç¨Ő=Ö=Ȗčˇd]ˆźłŘĘŢĽmk‰•Ew¨Ęúą.áŽÇ†7"‚IŰšr;I_JŹnC&?đL"SŹÉ´T3ŽcXO/2íČf ńś•KNWŽśŁŤ­X†<Đäąě;Dň|˛[~Fm%â6ýc]­9ÄéűpÇu&N?iÔUĆŤČ2~”žLzé‚ 4/C-öӋPťĄÂůŞŘE9Ú) °j‘Ň]ßÖ{÷M(aYôŞ^–ŽGXKŔއŚhQeëČ{!$ćŕnˆsS7ʎšÚ4ë)ăÍyP6ťÝqď(đŮÎŐśx€íX6휯î¨ö€B`ËŢŞGyʊţŘ|dɎENwU9ȧbFĹ` ˜Oş•‚€ÔúBqJÖŸcnpĄpîŒ ›j‡BÎ_źĐD•ýmőp‰M;ŃpÓ'Ş Ž@â°­PŔŁ*;ŚÖˆô*ž‹zëJĺ7¨Řݖľ/L5wÎf˜kRÄ ƒœä/Ď=2ż¸íœgřl›ćçNmëŸ+&ׯŚp,ˆ‚0ˤvk˘S FŠB¤}ÇÔHłĆÖqjL㠓h'!–˙$1tˆ¨ý'7,0ęEzIŸ¨úˆÍYŚżĹłMůOŘG( ؚ1Ą+f((8îßĘ\qXL~ĚÚşĺĐôGMJNÚ× E‰{;*ş×Ś™ŠˆđR3™8ńť¸G/‰“Oĺś@ăÇâü !§FŮTFî0ŽžďČg1ŒřŽ&šPżó÷L‘L_ԋ\źAœ Ż„Ţ¨ňĘă!GYĄĺSůt*œŹ˙œŒl–ˇĂďW—\UŒ ČydřŽ,¸ŹŽg8 ˛áHęځťă/ŇLÔۺ𨎜żz!u4ŕ‡˜ú~)ŸzŒ,‰[xÜ`ąůă%ů+ž…¨Ś0ƒsD…×X2ů1Z69űü,žÔޑ5ŰúçęšîpÎ+\ćfˆ^[ĐH!l’CŰ0ĆKéŽĆF‰4ýP?‘}\˝íÂĘD˘ňk—ŞňeHŘaňŁ:­Űëúýĺ×FČÓ$§ = ‰şĄęZď žI‡oőYÉĹđ'QÎ0&˜üÎşąlÔ!q•¤Ÿ…ÚęűˉćźDŢ4ęóÔ:łŽŰj.UŽčPݰ%ĹĄ(ë͕r:Kę2öT6€óxŚÍA–ăě…nÁ%WčŰřޏs‰ňN‘Ďž/y2qśÄ∧9ĂÓĽx*)n%Ĺ3IńH‚Ňş ¤ °úMŕMc™+ĎALF˘kŒČěDרŹűęޗ á‚is Š2ÇŇKTD°vÍGÂÍG$ó2 pÝüИ[X|G 'šKş;X˝ş“q°C¨E#ŐMöŁ‘5ů öe„ĘaL$qĺʛŕęj‰˝ĚQÔ9˘é@ÁŢbjŕČFźcWsiwĘ1ô'@Â5šHꝥ3f X8LM§şßPCCëŽ:mŃ;™‡ĄÚŐeŰx´âĆśęşĆÍ ĺŚ>Üö /˛˙'˝lşŽŚţbsQĐ´x)˘ŕŚÖ Mz˝/ˇÇő Ţ4‘ÜŽRËK¸áŘ)Áeˆç)*¨ŸőňţýěÍŇtÂŃD™Ůood§ŻöÍNúçâ]rA=čîĄáë†óÚ*ÄÜíÍw×7ŁVM7›q84ŃxóÝ{ęŚ,יD8ú@%K˛Ť cfđ ÔĹ´őđ ?Ąi(y˛ÇëÝĺĆ}ę{wąyvR^ž`ŚÉnĚźż63NΞŠ0SpĽŐ Ž”Í^ž\Iřě ŸŞ°N_rňęu'ߒ˜EPgúO˜Zqĺb[=Łvőą™&ýžĆÓ0O™">`’fżXö*Ľý2ccGŞö0[5.:z@O„_IŽGhŮđBŐËÇZvfőÇ×̎f‡źůx¸ÍDÖm x˙şča$1&}ߜö,9Ҹ!ŹőĚŘ`M7‚’˙™žěAŠ8K*yąnÚž-ęžS†*ă?Cú €˙_ÂŤĽÇm#ßý+tô!ŤjžĄÇEZ @Nî-ČÁńjťäxa9Řüü~œÉľ‹öd“CÉů‘<έÝdœJŰ2•śÇ~ Ôóz3}šŸ?ĐÁ÷kîL=GE Çcmĺńşˇ—ăá%Ëö„’/ć_Uâx]óă<_Χ,t=żvóS=ý;e´ üóśYę5ßΘ7?tÇ~î?Ü,ˆw%śŰӌĹÖs)§KŠľbüç:_˘­Ýú‚ŻG!ü‘'\o˛GvŰ&łËŒ9˛v¤´Ĺëˇ5Ž ŹéßŔa:2řnŰČó€+ ČÉŽjdW5FŠÉSS;äÂ4ł]rm™÷LÁ—ďÝ@hđÖ!ż?w_žÝÓĆÚŘűh;őeÂ>vÚXďúA 3 T]Dez‡ő* ˆ g ŁF)š„GGo?m­€!0gaYƒVŠ"‘”0cÓJÖ8 sČRŇî9OsđHJEo„ł0‡”Ü;Kúg‚ŽŚ~TŃm˜ćÇÍĄ¨§.ĄŢK .Fڑ”!ÓO˜Ű”%ŹŤĆˆ< ŸÎŤŰLś8î3FĹɌ˘‚žŸHu;éŁţßŮGR§œÔE¤s–ƒa’ƒ˝@žĽŽłĘž§‡śÚö°Q)`„ ˛şĎd‹×aĽBĺx™Q@âcňuXIK]7űHűIΗ̰"A4ŽŽĂa’ă˝°“ROOŰÓ"öŹĂ÷ń˘€y‹Čę>“-^šœWń2Ł(`ƒ“ëLÄçöĘ>­&.(ű€Ç AËŽĎď­ 5ˆ:[P8á$ؤíQÝOJď11ěYăľ{Ç+ŒŹ`'‘ĺ:˜B>GąoPű!IiSK‰RœBśxď(^QÎ F…ôÁ“˛Gĺn˜acŔeزŨ‡(œFQ ×1`XTw~XĘźGü\MÜtK,҂kŹ7Ç4_ŃEN *,ţL^•ŽĽdÄľÁKWČޏˆL'Ĺ(-O9Ču>RƒQЁ´‚ŤŇőą̐6Y:ŒęšľÝ ^­ŽxŁ*]ďŻUĽë]‚3źĂ š…Źńî6˙ ľDü endstream endobj 220 0 obj << /Type /Page /Parent 755 0 R /Resources 224 0 R /Contents 225 0 R /Annots [ 221 0 R 222 0 R 223 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 221 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 678 143 692 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 222 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 401 607 454 621 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 223 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 405 557 431 571 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 224 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 225 0 obj << /Length 1601 /Filter /FlateDecode >> stream H‰”WQ“œ6 žžuöWčŃtX`ňŇ$M2íC'3á-éǚ[RŔ[ wM˙P˙f%ٰ{wš´›9X[ś¤OŇ'ńŞÚ]W• Uť“2*ËbüóŻeĹI˘ Oł(.’ŞawýÚfĐX‹Á6ťëw$ÜÚĘĆ1^ÔěÂőő~÷Q|B™D…ř¨8’bŹOs‡Ç+ł4Ç÷ő‚PĹâçep3 ‘YáŸS[7Ý„eTŠŰ@Ňź[şƒ[ŃtRáY|Jš—ąř 3ŕÍĄ›;3Bđ[őËîMľ“ĐÁŽ(˘ŹLĐI•Bš¤Q‘Ś€–ć &˝kwŻŞoQ™Ş‚ü'ßdInĆÎÁ×愇â)1)ţďĐŞ8JČpZ<ôvF]żőˆ§Q‚şŞŸčŞf'ž ŞĎń@ŰJˇíMYŠ#Í e „ń&Ô/Ëh ’ćTԄâ^0ÜWÁŹÔ…DůÜÍËXd2ńö¸ˆ!„—䔢­˘ČcńˇŠrx_ߤD Sű fpŚ˘,V˙ŕ<.#ď9ܡűÍŰý9‘Ň(snŚ["ľ†Ř‹ şą5ÓPcôýŇőYf¨.'ęӛÉF^ŕ“řŐĚćcÍ͘T˜Źř[;QčQ”–Čc%ćYŁËű.–U%cŻSŘŒíΡ$fěż< Ž$\.b´"jĽ„“4;Ç=ېȧzšÁ´lÄ`ş‡qnô„QD|ŕţŘ5Ghęq43ÜhúIc­™…ýÎ0ۍĘĚůz4v†?=uÚÂÁK‘ˉ°ÍÔÝč˘ë<Ž~řz> Ť.<ĽŃ§€ŠÉ—B­ČlŁé}ŠŽ:ČP ÔüX°N2ń'ĺ^&şžsŤ—šÚ:aˇŠąÂě Ë×ôl{îb¸Ü,BsGGVćÄYÁK=ô_=ƒ™1CËď†Oő˝šçp ~ř-ăůѓyáBĐÍdŔéŇ\œmu6Ą )Ăd°ăGÉ WĚ=ťRě6*=Ö–qąKM™ Đ%ĚßfąłB3(A0In˘Kq_O żNÖzŰMĂ˝?Œ;-Ë×óâşuPHEta_!ĎÉú¤l1ŔpcP#Pm)î\Ŕ' ÝÁץçŽĹÔ#SˆWČ­ÓŃozyVœŠŽ!^+Ö˛íţrďŽ6ŻŔë“ö\Wc+˜ą~ľľkľTžö˘á# ›ŐŁE Îţ¨äŒ÷p8űTÔ¸ëbs oV>(\…cL/+܁LŇÇ<]rźÚŕSžămÇ” ŞÖ‚¸;FĂ -ňaaÇěŒţČűěQAoUöĎĚËHK.ÝóŤ…Ďú(ćČéĂ+BoęâÎ|Ų˜K‡˜P˘€žłłk`H],L‚ÉL‹ŕô-˝P‘ďš8ůLšAiěs ü„m)'}×Yâ6ť´m÷§çGć؈´×އ).9ś#f=ޚŠćyÇEĚÜéŠî{äsXšyeé;‡J‘ş^ßéĄÄ‚ˆÉěuߝč=Œî›Ŕţ¸î>}Ԙ!Úžţ ŤŁî endstream endobj 226 0 obj << /Type /Page /Parent 755 0 R /Resources 227 0 R /Contents 228 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 227 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 228 0 obj << /Length 4458 /Filter /FlateDecode >> stream H‰ŒWÍnăČFŽzŠ>ä@f-š˙?ٓÇ3łŘĚb0€…Éa'šl[ĚR¤@Rv’×ŘE^!Ż™ŻŞş)ŮZĘ &ĹŞŽ˙úŞúÝfu˝Ů„*P›‡UxEQ(ćľđ=?ŠB•ʼnççQĄ6ťŐő혨jd6_Őęú‡ť@=Ž+đú>UŤľ}}^ýěÜšë ňrçßnč{Ó•űŠÁńM¨ś_ĘZšëĐw~tÁ˘K,“v×)žĂCY5ť.źÂyt"ŠM-_4 qĎ HßšÓUßŐęCÝLMß)÷›ż­>lVjÔ*Ď˝¤ˆŕHŕaŹâ(öň8V°4 Ő WŤw› ˆrŻˆĂœü'߂‚ÜôĹÁŰ~ďŽsqĘÜ˙Xĺ{Nˇ.ýŸÄ¨ë&âąA×ć=‰ŞVΟÜÍ?OňŰ !K@cVjŢHł )Ɗ" IĐ^Š ’ćŘ))ŠŠĂអ Q˜Ăđ„ŁňĚ ¨Yá;IŕŻ!ÝĎ}ľV7äTH¤<Ď|çȏRęKůč’íFt.Ěć0›'Ą—řáB€á[lj-F`ó\bmŢm°ÓŐçE›=2ń<ŒŇL<<őĺîÚ]'jčfěBů(ł/}͜~ꍞő?Pči– >Š|VíGsĐ#Q˝ŮjŇŞý :TŮśýó¨FŞC.¤!sşjkJ`pC2¨ëČĂ}S7ƒŽ¨B šD(§eZzhĘVUýnw蚪œ¨ŒQœV÷zzÖÚÔ52] ׎wÚvŚëŚ­FćŽÚöă¤J~Go̟÷}ÓMMGŐéHmÔByj*~Ę/ĎY}hě9ÔśŁĆĆđŞťRŠ žÔŽšˆË¨Äůq×X ”Čîńuˇ›ęYj]N†é .˘&ه ę„w*K+^‰Ëć/ŇKŚ7§f§Ż iŰBœ­ęť–€CŹzôćÔQń ÚD¨ľŞĘ~”?1—IFčě´§ÔűĂĐp ›Őt€˛mţCm‡p†A¸rADü$ÖH)Žd.ŽDěuWœţš'lDňahÇÄę3î˝ČŐÔłÜZ#gdŃ]żÓ|Öđ•$Ť´„不2Ő§R’Ş'2¤váçăa§ť‰˜‚ŚIPđÂř °ĆÁą3Ä“°ę—Žn˙#XM6ŐŚIݜ0œtÂĘ)ÚT—Ővv^D༌A@öÄ>Ól$hŇęEސ5>wsűI}sţüńć›Ëţž˛ž°ç歌ěűqlî[R“‰7"Šb‘˜˘´ŐŽG¨¸_ł˝J'ĹW0šţÁĽ˙H°I„ŠŸm9*ݕ÷­6úőn´IáĘjýŰ+—ŇŮĽÔ4…Ô5üęť+*Ąî¤ŽÔŽš9ĺ 3ŠÝQ“jÜ÷ÝT dý{órĹľ=rmiÓ\™lq­Çjhî kXÜKăÎŕőA),đ)1ŕ ǨŸPÎÔ‡iŽS‰´WŰŇŠ=GpŠpq2 'Q fçŃŹ“~pžŚW‹ąîšÄ¨ŽŸô}ß˙BĽ¸?Lz€C ”:Rą2ˇ­9eŕ^Fmł…âz9"źy™ńłpÖ˘7-…((b;ßĎĺpŞ-Ś…›ř6ň ʕEžCŚ'ŒŐ4 °/ńݞ’Ţz=ő8itÜ'Îjý|´5]ՐA5=÷Ŕ}ŠpB K +žSĂXP™ĎÔŁ‘cŞżméŰwÉWL›g=;Ú faҋČL•w5ڀĚx=ä^ěňĆx "^I/á^+Ůźˆ72˜•qÇc]Š[^˜2ç'˜8Ÿ¸¨ŢÓV™87.™ąšÁа§0˜ELmĹQBřÍ|čťYĺŻVř˛×ݚ÷újóąžÁ‹ 7€Őż)ň"XtcüŢČ6§ˇBÖ˘‰Q-˛#rĐo5×;[źÇßęÖ".ƝÚ6†.=ťĽ„Łż9¤3užăĺ/ů pmő“n ˛Ľł8‘¤’˙ţ'ľˇX!RÚv}Řc#›q<öÝ WÔŮJÓ˛1đÇy˘“ýůńf‘‹+ /Xčva6IMÎočt~Ö.vU ý‰ňňzN03'ĺ‡ęäĐţ€"ś˘wrFô•pMćËźŸđn]˜Ý‚ÍÂÂßQ×7rŒěŮâ˝ńa9 ŕŠn…†ôk§˘ăŽŮ.ŕ[UNŔ %–X*:_š`ĐüĘOł ËGőŕŇŐÁ0÷Â1ŃbCľoĊ][Ťe+=*ç9 •œë€[@ýÄž1š–'m•ô4_cĄ9 %šŒXÖɑcî{1ĆĘž­ĎŹ|Qů3Vř+nšÉ¨ëů"ú‰ňř{Sâ3ŕ :S‹´đŠZT;a[θ…Ä—XäŃ<ŽÝDU3*їŠžúěĐ4gYŕű›ÍÍBť}Oc´?LAhÉś"ݍšSŠŕęŘ#'@ůłC W(˘V?LęĐŐ,ě^oi6hxh{¸şel—Ü2ÇFFáßYŕfY°žĘ˝pnTŰt˜#öl Éś|ҰŮ&+G?ŃľŚÄžĐ×lýĆ­Ú˙{ń|ŕřw*ń} Q ´őŘ~ƃÝi9Kƒ4 .’$1ˆ-L/ťčäĆdŻL˝Şq‡ž…mŃB:?`őĽPL3HSž¨ ŮéW; —a1ÂZł˛ĘOŁ‚FŹ•9Č'ů5ş´G`˛đŻ{ߊÖ:Á–ÂyQĹÁqŔÇs ˜ľâŚSú_Ń+ó€ą%ó~×ÓöBˇ`ŃDŤ BŚv¸ŇŹß“ćPśŇÔůźN%ňE8…}ŚbĚŰ7eB–b)h@UA\ÓĄ’ŚúŮE⛃EW™Ž37ÖńÔčg‰Ă7÷Ż" ľ—Ąňńg^Ł(đü" TD úšcáŒPœĽřΛҵ›ĄşCşę"a9ý{7…Ö™­ţeŘ›U8Šą°E!´(~ĹäZ’"“Ť‡E:ţzčёö,Č_pĘ |"ΤP°,TˆYžŚ/hˆSÄâHϰ'/8bV§‹>,я>XŃžŃLO˝?Î| ńá”ă¨cIƝͼD‡z6Ľ‚’D§6љIt¨>="䙶Ň[—7ôó4úĐh”ł‘/“ÄT›˘şué6AG*ôf–šĹ^˜˝>ťž ŰZ–x)úzL’źŽá˜ƒ;s5,Éx#¸€4 Ü$ąŃĽqÉWő@(çe6¤M}Gw~ÔrU˜űĘ˙ĘźgÁslâa¸~K_N€ĺXJĽ/'aŮk#Úß/¤Ár,§aYĆiHpŢǤƒo2V_úg7,ř֋ ĹhÜşdHœE:̈ŁĺHú…HŽĹHú…H/Úp´1Ł hb9–ŃdYĆ‘ŽąœĹIž86’ căV6ŃŸÜ Á¤řÄCä< |ȓĺ ú… ŽĹ ú… ,Ú`mÄM3M.Őşá¸Pë‹2ŢČ@ˆ­?͢E@[?`•ŢNi:‡ŕÂV!×uęzó.™sɂôÄ>B]ď $ż}<ƒŕœBŽt]„ś~Áú¨Ř֑ţSZ"DœÂą‰ľ[<˝ÜނźôşŽŰ­Őéř-DŠI3‰y,w$Z,ž˜SGb ‰Ůež–˜_FGBNŤw'i’FÚÔüQŇɍ’Đ˘Ž‰űíHMĽţëÉ :ŘÚt!­ë9í:lj—vÎĺÔ5p⣺ϴe&Łsu‚ňUş+Ş’ô×QÁÉ]!Ú°Ö)ôŰńÇďiß ¸ů3ď˘hü7`)Í+Wň˜7^żžÜ0Ďâ¨Iša-FËö—ŤëţŻ+ŤĹ{MÇ­H­œe]*çLB˛E‘Xót=Á¤Ř։ކ…†šM:Œ [í9 %Űô ´éÎ(¨Ů¨ŁÖS˜ÎilŐӀőĚ9 ’ÍzS<ŁĄfťŽç@R&wć2%vŁA˘żAÖM@RŒ+ 6ĄCżút×Kź•ő3L­Ř\Ř = áj ŁÇŐşU˘ƒQŮZCbś QzÂ׺-¨{U˘ƒQ[ن}C$zÂŮúőat1D˘‡!Ź­‹ŃžNŁJt0*oŒ.oë>č!œ_Q™ľ”čr•MZ:^ţ6ř°ÎęŠLÂyÖ˘¸\o䓸˫Ăű—î/ŠÓěĆl/ą÷´ĺ›Z0›4Ţ{–äΑżPH݈ňs–=Đ-b•ĘŽęsuýä‡ëІÝő…~†ůĽžŔŐáÍđöO5Ü]0ŽŞažłĂÇ6“&äEx‡'çQ&,R %šńB˝ ÷xöqĐ{ĘşÇŇŠlŻă€ 2ăÁ .Ź(0 SEńţBL™jbѰvbń˛řŃfČÝ 1ošFJřř“8ýţđť  \P`UNăÚ x(fţƌݚĹĚ;lČ7îŢąW ÖŇž¨h_›)Ęě•]˘~ŰĆ‘ž‰cJLLŔŻąlp™‰i˘pŔňüŇń„xtmLˇîWŽ“ÓPĆƒvČL,E.-ĆFçČZJˆÝ˘aéÇţâ~ Ř™ouŚXFŻUó8[nTâ’Ó|“"Ó$ ĚLƒŒ+n›‰E˘h(–WŒę[ľB$ŞÝEĂĘňMßG„Z´:‰Śâé€đňx4mŒ3 a%1gŚĄŽ3퐿Iˆ‡ä?ÇČcě¨V‰jeѰňƒď qJZó­ÍË`qäqąíšŽ ÂQ=H PBŠBÁ˛ :@MbŠ)™6˜Ě ĺI ţ•O˝*¨ÇB՘˜4°ƒ€8€ą;PwIj¨łdZ‚ě°ArŸˇ­źîx5ŔgPDŤŁÍېi ő4`H*ď3¨¸JÚ< ^ÚÖżhœ9 endstream endobj 229 0 obj << /Type /Page /Parent 755 0 R /Resources 231 0 R /Contents 232 0 R /Annots [ 230 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 230 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 449 142 463 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 231 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 232 0 obj << /Length 5585 /Filter /FlateDecode >> stream H‰”WÝrăśžŢę)pI6Mü‘@z•l˛™śÉŒ'Vr“ôB+Ń6;ZŃ#JëÍs¤ďĐ×ěw¤d‚™ŽÇ„spţżŮŹî6Á8Ű<Ž8/ŹľŹÄßp´eQJ)X­tQiŮćăęî]ŻŮŽwh%ëwŤťď8{ęWŔ-KÚ­Öářşú5{Č×\&ű=eÁłăöĺÜâůŚťěžďˇ{–ŻE™ý=€9Ąœ›|]áűô¸ÝľÇ|m ›=ĺœ@ěűKť÷7 ˝x‹oÎ+^fÍŽ;îŮwűöÜvG–˙kóŐw›g-[Sh+Ą/¸PLIUĽ$­;5ŤÇŐ7›HSX% éOşqKj–^ÁwÝKž6âUvĘ>[HU’§Ëçœ>Ď^¨ť÷ƒĹU!Ákó-‘Ú­˛żä›OüŮŹ{ƒ*Çt8g&Čƌ, JŕĎmQÁˆÄYe[˛b•9sIF"3 1ÁŘĂĐږ™ćĺÔKS˛5űš”2Ś.ł˙Â?ŒąűíSNLš\Ň;˜$˜y°°….Ĺ˙mŕş´…(+ażf›ç†}¸œĎđb˙ڞwĎŹ=ž\Î=ű-{i=Sl GëßrÜď—}Ă^.ƒ˝‡őĺĽgçŽ}Ąa p­ÝţrhžtݜźP GŰęh[ímŰ?w—Ăž}h)ŹáU(–u—ăŢ1ŇYłgŻĎ.Rk2(]9^ťît‚9 ŁA<śGOŔi‚ˇř¤PĎv‡ŽčŔ¨2ëqů[^L5bÔDAôž R;Ő ë f 3A’ăąŮť“wţöÔřĂŠé!w>űcçô1ى=^Îŕ\úćoD÷ľ)DÁ`÷694ç„%Ť(`ĺźAŔíe;ÂǑUd0ÇńĞťţ|Ľ4_đČcw8tŻŃźűv0îÖűdpŰö#ëŠ@Ŕ°ĎÝkďĚÓĎÍÉ ĺQwT/zřúüÚ4>bHgÓAB8gČ3ĺ…׹’ÝšaĚŐő˜ŹŮýÝ‹žČŻ%źq) ]V„sH ÂŁ çŽđ̓šwo“‰Cв†ÓgU…—ąĚ—ŇňđН…äj# Ł­ YŞ*T:oëiŔ˝oŸ&9Ő`&ײ Wg( Đp8÷ż;pn>˛˝żkó 7Ű'rˆ/‚›ůłžŁ*DIĺŤÂŘ^ć HNT%üąwc¨K]R‘č¨\FĄ ’“Hˇd2˝Ď5‘$]üˆě˛ŁŽ‚Ň`¸xEAWT(Z^(ödFLgRrÍÉöˆ‚m~Tü>ČÜ"jřnč¨Łť?žm ćŞ1źQƒKEŠćí¨6d˙ž`Ţ k°˛Ő°žGŤ"f{ˆěíĄď '“=6§~($ěÓÖՏś9;˝C‘śyD­¤ŸĐőÄ>t–BňGä—Ƨe•ąf‹zˆâˆ˘Ÿuݎf‹U{ó×Ő¤Ä8ÓxO.Ćok% “Ťąlüńóîßł˙:ĺ$ÄÖWŕľűąyn=Œ%źüŸ¸N^•Ýçk dńŹaHm&ޑfёSTĺőâbşĄjÜłĆĹŹć,şe}űٙÚB`24ÝĄv>5뗀J˛gcřʛĐP~ _kü‘äŇŠÉşĆŔĄtHśŞ&qPđdĺ*y†2Á$zŻf•ł7ÍV +ÂVTDЀ}yAWžç§ŕřŕ¨Řj„cÎŹy5ĹĽAĘJ``ĂÝ<kqq Ÿç 0XŘRN9H}ÍAëBh›ćá c–ľ d)ŠW)#|žƒ,1lY˝ÄA™Âh‘ćá ş,ú@€\IŤ‹J™xs˜Üx‡á•˜Ü<žÁz#É Ý7’ •f„+ ÓöJWĽ`-Ł’1—‚1beĐF8˛Nź‰)áu¸Âˆ1‘Â}šÄˆ>IbD[Ľ0F]Sş`ęFč!ç‡#Ż5őU&‘~ZëqŻqM$+1” w?ü“}űuÎiřݸ.Ąłá'ËŤ’žšž¨öZtܺðňU4”?Đ.aŠgú‡E<ű)ô°Íš˘-É҄ćżÎš¨ÜăZ¸ÇĆĆcIë Ë­´ŕóý Ý;:tíŞ}îýË­._h˙ó—q ŽŻŃíPŢ\ăŠËŃĺhĈĄ1`„đáś@E)Tčę×Bč¤(nkť@!†V‚ÁëZ/QĄ—˘ :ľX˘B3EÁV…ŹĚ‚%cč&}1úŞŹœWX{ƒĄŃşA<™čIřŕížĐ|†œČ1AŕVÔ ZIJ˘¸šöć­ Ąl¤(n ŸĆ´ŐWbYI%Ř3Bš™Ń? pUT&ŮKĐ!ă<´ÂÎTßL—cÂ÷ˇËMĘgÇÓČAó›ŮoL‡ycžC#‡JŢLfc°Ďsˆóâh—ŇaĘ #Á! ^)Ó@ç1ć9Äą(rמž†á|œEŒyFoźŰl°ČaDXpÚ0šë“áĚŃöl‰š!,z“Ą5qh”†ĺ:ŠSžoŸ.§&§&ÇäZ԰ꌱű‡;1œ>œŃ–lvBCóÚnž= uˇGöąŰ_ vMꘝîxôŕfçŸu'öŹUvě.ţך×*ó- ‰¨ľ6čCG y%*¤ ß§ŒWĄmŸN¤ĚćšaüŘŰ˙ą^-˝q$7řýŠ>öd1íŽwUn†Ý ąÇ’ƒ‘ĂZ–­1ƒcIYç’_‘œőî™fďŁ.’E˛ŞřřřßáęţéúöÍφŤÔÁ_“ófÔâMąWoPNŇŔÚŐˤVĹKšIăřýűîęsç܌ԉΦz`’Čôéáćařyx8|‡MLă~'ńűőp7Đíŕ^îżý!ŰÓČɟÂ+ä¨Ńƒ4¸NkDy;OŤ'­Źž‰MaЃě@^ ~N —!­DXë3¸Ěń[]7>BÝ ťaý¤­‚‚Űëóńąň×-Hę$łę-(ł´` ‘)Ź…Ęg,;Ů6,( Ż$ÎBăŻ[jœt0[´=›ľPůŒź˝D"ţ— …ţbľŻ”cGI6Žy—ě(ϤÎ<9Ń{ć *Čěľ1ťŹ‡¸-hćbŽăˇ˜+1)PŘuĎcŽ$ę@Ń$ş˜Y—čߜ‘čތ‘čîr]˘•;Ëú`ăđ Ţ"˘Đ´u°q°A.ח8/č8/¸8/¸4/iHSŔĽĄGćĄG§ĄGŚĄGjŞÓ4Rč4Rě1 A!A2A>A‚úÂN NnÄLăÓ0”Ty\ťßî$í<ě„?A-â6ý{ÜIwKwC D0WĘ~_ł´Łzw†ÚjMĘüR“:”^â#KœĄxÔ”ŐŚÁNł[j(ńĂi?¸°ĄĄĆفř¸ĄĄÄ§“ qrKC‰ONCŔěiýĆMÖřeߢ˝•ÔfÚT 5ŁW;>ŰY~~íĚßč@ه˜[$ľ5\âm ÎFéBŹ>bÖmT ĆFíCź.ŚE‚łQ:Qćw(SşN„:K}'Ş”et2žœhf{Q9/ߋŘřŹŒ_ă˙𐧤Ę~†Ťą–‹Š˝éłĂŢŔˆ’Ŕˇř–zăëőÎfV(žwŔl"~  hTl`î봙Peúś$‚ęăÄI‹ű§Ç߲QęQffŃPśŞWu(űňéýhďö¸eęD3 ˙pőz hcŹ˙7 ­ç´Ąž¤Ć›ăżnöe“CnÜĆÚ(^a\ƒŠ“'Xď—O,ĐĐkcÜé›`ˇËß~ĂNúÄawFÎ#ŢxgfrMźôş€p ýŢON‰3¨Ä°Kě!=”hlES˘[O¤Ćš˜ł§Xݞ×Ő „<ҤSoÂR˝Ő裎×_ůŒ‹ü–nËrGFä,Tţş9#k­î-hˇ° |ԂľĐřŒ 4ăĹƤĹ-;Ď[¨|ĆŔ ~šő$7Ţšń×-¨ď`ĚĆ-)Šp*ŸąˆIXeă ÷loĄň g˜ˇ˘U#šĺĚGkăŻ[Ш§Vۍ[Ňh@b#ZŸą€†m–Ńzz‡{ś|´6>cÁă ó"Zĺ˛d*Ęę<KIâřľ&•’ĺÔ˘ % ˇŃĹG2,%žxÓ8݇ŔéĄNšśU)ŸÎDĽ+gvéĘÝД3 œNeÄŚđ/ű5Ô-÷—á€ćM %8 ŕ­{ ",4Ôc4ß[ąáCM@Nř>ř 5A ÄĘlœ˘&0§üřÄź%Á9 ŕ{64ÔŔh ~năľ@pŔ÷Ë×<őĄNřދ>ڃYh¨†KŠ–3ńÂĎć°" Asšm+;ç\fóH8Ű?Ÿ5‹c `áĚś~˛j)ĐĽcĄH0&*Vm6ŒXJt)łnŁJp6 –dmô)ąnŁJ06*ÖcďŞůuU‚ąQą{Ž>¤E‚łQ°R *+ąQ]%żĆGW~vu… $ŚYęĂ_ůAL(t¸* `‡ÔË=:śč}ţ˘ýăáÓÓˇ›nNŒƒÚۉÚÚÚđćň™ĚߗOďÓ×ëĂ]ú8 RˇŚ}aür˙áéx“×÷wwYßőă}˙†ćIúżĐęĹxw˙ôXűćłfxqݟ‡Ëbř>>ăm‚~Ú^ďţ1.„ł“–v0Úg5(ńarFŃŐ(\9ŢÎH‹ÄGЧŰđhŰ! \^ĚĐ. A¨ ¤ŽW™4^ć˅2_"RÎĂâ’Âďkʜć@RŇŠ˜,eßąÉX8Ź?ţ>Ş’BD’ń¤;{†MRĐŚ*aqA.¤mŐ'@ţ€ę|ʔ…Oń­{— äźč]Ň*6äĽS™ŘźŞűšHTś)š‚ďnŠ×TÖÖÄ+Á.é‚‚¤NjôDqkhם &2Ÿ(Uš”ń š]/ăŮ2%[34÷d%vŮxECH t@ş;”&k鼕‚bq Š‚ľ˜%5EkˇžĆ”ˆ^‚ú.ŇŠj(ël;*/md ĘMڎ‘×d#{Q%ŠßEĂň×ďń*Ú!TČ[łR܄ʪŔđBƧDl(źąmËkˆëI÷|ësÝ]–I=É đ(m?Úž´ŚŃ"Q,–Gˆçšă˕DljľŒ/‡YCJ_)Ç&cQcţV™L96ŠCńŒyHőĐŞ5ƒx’D3Ôś€ŁĺE‰J96ŠDJ@ËńTKˇŠéEuŇčeÉxÔý…šŻAWˆŠŚĽŠ2vš¨”c QKšN|’‘€%R3B)jI*–!¤]LćLÁY(Jar*–%+h2Ü­ńŞ8™ë%¤žî4”uśA; ĹOčjUꉖÍBZBź¸PřĹç´űä1hRC”|?”Ô`”AÔ8…}ĽŞ8łR/˙#ćÝŐgęI˙źČ˘üŒôYŽ:wńżwdv͘šQD%loŒěŒÎţ]ţqĂc…w–BŤ%ż#%ퟸ܀.H›ó§ÔTýQˆé p–öĆŚ?Çăž_ź˘mŕuaBäwŠ&m ű2É"ÉÚËçWíV´œbŸÁĺ aq)Ś ‡ţRV =Eú훬"*ř€…œ1Dčńť˝é¤˛Îá(pü˛C6ăň) ܐ Ÿ@ÂńŽĎďFxdŤ6&ž– íľ˛ŤçťńtQΏĄ›:BV8{ ¸‚çĂĂŐśéß>í2ă-ůŽkHâ2B^ěh-ZPЉŞwsV‹xxžƒý0Vkv!hÇ6–ł‚.2ŞĐzp  ˇŒ´h (ĺř¸’hń§żŕäH‚ń%]?u7ţ´›ÇžŹpĐęO…QŔŻí\ɄElđÂö0 Rłą=Œ ˆ=aZ?ڇÁGQ珏qŞÓ!~0đw?ţ-řjü‡čÉyő˂ —tt˛P,ͅ ”jIÇĐĆÖrZÖ­`W‰\ŽŤ†RžłŽ`BƒśUlnŮŮ(ëŽfW‰âwÖprŽ a|şĂeJu ‘!œlŽ îÖ Ĺ¸…°ĆBCZw‡Ť”ěZÖP]Ď6şĂe/šDńťhXžŁáŇĺ č\Ö :Ł˘ĘHŠĐYÓ\!{č\dtŽ2:™‹LƒÎĹzƒÎ™Ň 3QœJ˜l–básL—˙{XĎÜ endstream endobj 233 0 obj << /Type /Page /Parent 755 0 R /Resources 234 0 R /Contents 235 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 234 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 235 0 obj << /Length 3653 /Filter /FlateDecode >> stream H‰”WˎăĆE’ž˘Yƒ‡Ĺ—Čx5/۰1ŁÝtl’=b ‘ŠHľěßđOä7s{&0h‘Ĺ[ußçžzł]˝ÚnCăĚöqĺœŸçš đ§yŕQšMœřAĺf{X˝zŰ'ŚěY,0}šzőĂ'gžô+Č*Wëńń˛úl?yků™ýÍ ßŮś8 śoťsšűĽ¨ŒˇűÁƒ >z$2ÔŢ:Ĺďéą(›Ö[ç~nżxŽ>™ÎM%+5í ążÎĽ.°Ÿę˛k+óžj†Śk÷Żí?Vďˇ+głĘ2?É#8â|Ć&Žb?‹cK7Ą9ŐŤÇ՛í7e~‡ůOžšœÜ ÄÁˇÝŃ[g0b—=y1ţ7°*đ#2œwýĨWßkÄc?‚Ží;:Ş\Ů?yŰ/ňŰrů,YŠ>‘fR” E'AżËýA$Íą-(ŠŠĺpßQ(Ěa¸(}}Ŕ×MŘÄkœdY›×äTHŸ˛lŘ˙F~hŒůĽř⑒ڋh_˜OaÖ'ĄŸáW ßâ˙[kbŚůëPbíG§łŰ°Ä§rŘXó†|śƒ—PAŔ˜Ą$dáä…ČJŃö‡Śď§ŠXÄ׏ŸFYşZšď d2ł%˙G­y€ŠœóLEJËf8‰T‹ďP4čzeäa¸Čo=I™a§{Š’őĂSS.Ä$[zp5oŕĺ]׌iE~%dé\‰Dod“éy@1˘ęšÁÜ[/Ö#ÍžŁ˛äĹf9ÉdÍ˝Š;‰ÇÇ%s&S&ĄşĄjH$PTÎ ‘šYŇܓęőß˙IYŠ×ŘžńR,šÇćÔĐË"wŚ0ÇâÔ ÔÜ8†k:ąęAWU/}˝÷!W \źďŽşĽ€łúQl…Ó´ľ4îŢóÇmćç—O–@l˙_5*‰RaęF}|î|!Kú$s_ugčžÔ”Yté†kë°ĄhZ¸aČ×ö|xäĐîѸß{ß, {w>5­˜‚j”0ÎEÇ6T5 ڜ÷}-NźeXڜ0LýdúkŻZńŞŘ#~Ńý؝ŒZS”;Sč ţä;~g.ťf_OĆq­dóHȤl¤žS6—FCÁoţ™ôůăč Áăo"GQt(%řxoĺœfˇJGŤůbľ’ß'r˜Ž+ůž%xA!ňŐžŸ÷ź{˝}m.(Đ5*ŹýsA*>5YÜłš;“ň6…E‚‘NݔJX¨+sˆs…w€Ś˝Ř# ˝XÁ Đř¸ďŠÁěŮÄUH!ShI`>Ľ˘ 8ť™íDîF“ó-Ÿ…ÔňŸš?cFúa ™Ďôľ%ܛjŹ—"{8÷ŚDĺ>Ԁ'ӍękŽUŻfžęš j¨űżßŒDą ›†"YűçżčhĚD*ôcœS…ŮŐžöŻ'(&K¸œ ›)䝠‹šŮGţkkl¤5ZcjgŠ?Ešî†ŔŽĺŇČî8܆¸ŢôŚíLQÍS3¨ ƒô`"iŘü› Ź1ÎC DţGâ˛{Ÿí‡v×*? žüĎY~{Ď1,&ÜůüÓyÄđL/mu›öÔĎ7˖pS¤n3ĎľJ-!Řš$œýJ’+8ę˜u€C„XMŤk*(ĺ¤ł6(‚1jGPIÍG&YeC§´riĆs•*&ôc —śCšB‰ˆ~ŃbÁ˙A¸\†đ0S,MET„PeZԙ‘SňOÇ뇃JU4XbFwůUKÎ"&jہ9ăBç FBődpE˜’ŞĽ4¨ůÁŸřjśŹ$D)™/šgë‚šŻŁ$°?Ÿ‡ă™˜†Ää%ţ'ßčšíL¤č‹V)F&!bžŕ9jBšˆ›K}ݗ]Ýέwšľ?ˇ1˘ŒšBWŰ Ď˜č‹hőF˜f[€™Q †Ąq7”GK#kŚy¤Ncb=ʉI aîÖ}=ró‘hë'Y÷˝œő+SŸ@QMíU\Ť+wĄb‰™_‡–Č&Ѳq×Č öuńTóŞ"ÓŁŇő´pžţ$sT“9ŹÄQގE˛„_źůźĆŠcĘý˛Ąđ@ĹÎ,&ǜˆf]Ÿ9Č&ů_ɑđáB„#RImƈâĚ7ż˝ˆËbďŃÚ`’ŕ{1ŐłTQuFŢűŔ…×<S2]‚b4%IťŠîUkş­B“°—çşŢ,‹ą^ˇUŻ0F~^ăŘ ŒřA(ĺ#ÓˎäŐ$6J`J 6RcžśžÎŰTć-ó,‚9ĂčšşĽ:ÚδUĄÔšř;šW5zÝztäNŢŇć‘/Ϝ‘t†<ňÓxKçćŔŠßnůYš~‹„\„sJ‡ĄäŚ ÂŮ(›˜űţÁ“BMHPKôœưlgé1-(›ŰëíłŹkˇŔQr Đ,یÉn[™‚¨HęEfŜP!ÇßMř;FRрG°źîŇ[”LĆH&cb˘&‡¸q(‡”…⊈DWËîć>‘Lć'Ó5k IšŢąůŰ.oŒlwd§‹ăFÇŠ 6 ”—KE˘— ž; 녜󲸰Ô/XůŒočEýݛžCóෑů]˜Œ!ńž-9ĂB… Nçß{_Á×gId|ÝžF7ř:§“&x¨á܇ZŃw*‚běoŐôĽÂ‰aĄęšŽŘ:UĹňžôl˜}ĺVBé=Ő%łBg›'PLZ?˛ÖşT‚˜rŢěgŸĆJÁ|(ä,Ů$•łéĄŽҋŢLǜĆ{Śz•Łű ŻÖżę{YňŤéo˛O.Ĺs-~Ź9¨÷öŻź=śßóĹä˝GĎH(ŰK†ŚŹw` MšCúcGp*6ĆbcJ3 Ľ)SŰO1×z˜łšÂN8)0rR{›˜Îöć36çb:a8 ŹĚőšĺgb‘ă‚—™P‰x˝XČNş.˛ÚóľƒEXţŸşX‰BžœË? ”†ógó‘}qjOŻfU ˙œ™Ş.Ł*Ed/&Šá>‹Ý{řrMWÜ4ŠfN0‚Ę–MˆuD:"+o:ÄŤ„Cq„9Đeąš,‰ř•Řq“žŃ=ňfjš|:d˜wşĹVšŒ˝LĆDĆ\2NĆD&c¤“QmŠ4ˆŁYfרvÝ˝“eU7tŁq˛°ŸŹĂ`šƒŐß˝ČS_(&ő^sřr™(ťşNˇŽé\ĆôŠ´ŕä‡Ö`ÁąXÔS#‰ÓǢÝ+'n„ÁvGú€6Ÿ5ň•Ӈ“5ĄčňůŞežÉx“čü*Ů9ʛ” ÷ʘńJBpď%ʇă$}.*͘XĹ$Ś%ŁD],ÎÖ cbˇÇĚőJ}źt$ĚGŮ|§”zÜúrŐ_ŸËGđsšôrW´l ą‘ŒŰ–ž{ęę˝aF*dĄ đĐCý?ĘŤeˇqŢ÷+|؃¤Aí$Žs,ŠžzÝp,ĽâZă @ż~I%żö˛—8–hŠ’ČáŒđƒ…•D¤„)" ćĄ+ô:6_qĺäßOt%ý~  Řćj&ÝFě7S×Ţě&ů~;Ya?Ÿ4ßÍ7OÇÖ¤ÄůŰ18Vt'âÚřÖ¸N֕đîAxŸ#á˝x5˘&7°î!ďŮóRwů˙ˀ,l'Ëň héTš–äRe1IüH9Pd—/ŲͯůلĚ$žŚcŰ2 đJ¸"ýâ÷2ÇρT9ű¤lęĽ;‹1ďZ‹L…¨žŸ N¤…űI/`IĄQqžń•@ ËŚˆÇ*ź•ĄoŔ‚C:Ş’•˛AirP$ÜűÇżŕÄuRŻT˜\ŞĽč\âhœŽ7ˆůćUqöa JSĆë+GJSˇžžR×}ʔ<ĺiÍ=–!P()\„ŁV€ć5-.çäëúŃS°Řŕ:á)QíČ]ÁxN‹s€œXŁ>mĐ1œ†ĂŃ é%˝×âÉ[ŐłHÍ÷!ĆY dÝĽœœÂRZ°Őƒ;Iżl’ˇnĂ'Ň:2!ŃřĚć$JŒĆ•D:I[ËżŠŻ“m‹§ItŇ$áëf3ńađŸÂč¤r$ ßmtŐL •ƒ1ű•_ĺ`,ˇČ‚"fAĄG%^ŕdDU˙ŒbWŽťUĂ e Bévřž‹ôuĂWÜ%Żoqě7z!ů¨D‘{L2ŐĎÓë]†W]›hЇ•‘ú-çĐěżűŸ%Ă~L†}Üa)Ú@š%Α…vrwܧŸ„Ťč,mś—–č7üú uÔÉ ](ŠcUřÂ]´‡ňąŐbĂëbŤrrđ“ÔlÚĄńŘ}‚ě5X+vm >Óbqo¨ääŸëf’ ćWößaŐO}ŽőÎ 蒺ęjK!S´]¨ËpĽ@ˇĺ*M*cOŐŞÚš[U;e(ŘA,‰äšKRřĐš-_Ľ œŽSźř–ÁSON‚2kGé“0&–˙€¤ůnöq7šŇ-T-Ąó'‚Üę2Ř>,˝çMY˝sŔQ}ÝŽş‘Ô?íŇŰ[Ă {km,T)hÂ<ŹťřzMUł ŐEŔ3dŠa ß Z xú)R%1ď~ý`ž endstream endobj 236 0 obj << /Type /Page /Parent 755 0 R /Resources 240 0 R /Contents 241 0 R /Annots [ 237 0 R 238 0 R 239 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 237 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 136 650 189 664 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 238 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 102 517 155 531 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 239 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 102 132 155 146 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 240 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 241 0 obj << /Length 6343 /Filter /FlateDecode >> stream H‰”WێŰČEŢ}E?6ƒÍćXäÁkŻ{yXŹäÁ“E K¤BR3ŢďH_Čoćԅ”,ůc ÉŞ>uęô÷›Ő‹Í&4Îlv+çü˘(L€?},?ˆ˘ĐdqâyT˜Íaőâ՘˜jäiŤŐ‹ß:ó8Ž07`¨Z­çÇçŐ;űÖ[ťČĎí^řÎvĺqją|ӟŞćˇrkźu؟<ĚÁ GSŚÚ[§ř?ěĘŞíźuáöŃs4d~<ľ[ůRÓĘkńßšÔöm]őÝÖü°m§śďŒ÷÷ÍĎŤ6+gZłĘs?)"â|Ć&Žb?cOłĐ őjˇú~ó…Dš_ÄaNńSlŽ 0 đUôÖ9œC„Xe/Ćo Ż?"ÇécăŃď$N˝xŁý{m^“Šje˙ämţqqđ­aIh̛ęílBʲĄ Ăöw…Ÿ"‰´slKĘbj9Ýw”$Js^̨|}ŔhV6qÁփ<0kó’‚ i(ĎłŔţ7ňCcĚoĺŁG›Ô^Dë˘`Iłf8 ý$ż9ÁYPřa2Â$Út‰6•h7Mmš~œĚ#Ë%^8Ńôű­yĹ0KíŻ”Đţ"ďűgSîŚz0VOâĜ˛í8$wŚŢíj1WMíS˝'P]ŘŽ?pŠR€˛ŰśŻ•Ź Éř×WďΝ™zI˛”%_8¸śkڇvb§śőS[Őf7ô3ÖrfóVŠ5ťÓ05zL’ôÁlËŠ”řž›v_łÎĚqčŤzëŃœ× ęr>đ9lß\xF‹§ô(žŇyú7BAř"ŇČ֝™źu|ńA˝Ů¸`†´sŠi 8_ Ĺž|űý ĹýČ#?šÄxž¤*çEŚDEëŠy 'žŘâ\‹ö÷ňÚźóóčŇ~˛ŘO´†ýś68ŒŃ”úŠ1N˅ňşđÔP{NcbLNŻJŮĺ~œ]ł8ôçëŠNž-*ďŻ&Ć/­[G83ĆR|^’-K2 ŕĘąp:š#ĂL@U˝ŽwŰ;¸TÄVîQŁŮőƒ)úÓdBsh÷űvd%ƒy nž4 ÜźmťŞžá•Ďĺ“n[‡ĎT€[źÖŽ06ýsgÚÎźńRâƐВxýĖÁţľ‰ÖáÍŃ` ěgö=oŮQîťúŇíťs)`ƒhá\iž4‡“˝Gˆł›ż|ú4ŢáüËîz N gPŻT";†šçöŠfŚÉ‰ƒ3Ž+Äֈśśş ľlŐxŁŹšś~’J>”tN{8ĚąŹŢדY Ę9°ç B*ŚS}œé4ÉB?v€>5Ź3Vˇ$ě´÷Mír™˝);‡I…›ňsf~şÜ$hŹQK‡\t€ř›öń4ÔÚĹq°žôEt”ˇ/B}ƉzƏ8ŮgĎ%ŻłOőŽ—HpeăB;_•. ł¤uć˜!>BH’’.gňĆK3j⑞ßI† –zpá ›¤—lrÓ1GsoĽăMҩܽDŽڴŇČr,ՐŠ*>á €•ť3nqĆ-Îđ.÷ä %*„/­ş ń5ˆV5b›ŽAç›ŰśžÔh5i“+/˘RI,@ˇÖ$RQ ÇӞŽi˘2$;$a$hÄjjt‰ëEöQ€5.§łńOéň™u>Ó)ĽŚc­i$F^?Hg<Ę[uŮĺÓÖcOd°áwi•ÝŁÚœfăŻ_’ťĄ%$ś~|nd“VűŹ",Ś Š4QUôÝŮÎVţSzĺĂ(;Žjc<ĎýXĂÇ Î´‚¤,ŕ ]~öłN‹Y§éć 8ŔXTQj§Š—ňőÓľc˜´BÓPv ˇqD Ŕ=aű\ňŠĚ˘jj†^n4ąUëz|ą]&^ąĎ;ËĚŐÉü[EAęĺaö aQřmʍóVœąsnÔHu&Ŕ˜Ő‡|ę˜rP.: á–XäPÓ!˘§r‹¸lyHŽ.[d =ďĹśź<ńšZw çŠQÔ8ἠi8žWFŁĚčBsÉJœ)(wg:_Ř\˘zš›ęAްî`Ÿaq ‚žßľÄ™hœŇLĎĎčćŠ$1ÉÇŠ?’Ł÷ˆc@YY{ďÝąôžć–ĎH÷Ą¸mŽ –TŔBüŇ/”ó)šć'űAŰ1äRŤóčËnzh:$";ů/ö÷ZÁ4.$ýžÂř7ó Á'[c.ţŞ"‘Z)™;ŰP¸;­Ö}/ű"ݙ›ű¤vúíRűúĆ9že°@7´.$ĚtÖvMKç%`̕srâţŻ_OÝÔîϓfö„ÎŇ%˙’ô,¨ Î„ŻŽůV“|„ RT>ńź|Űë ă‡ęĂGä0ŒšŕpKtŹiĄ„ú•†#-˜s1^Ż'4ˡJń°ÓwBšŕöě­y6ŰÓ0ĎĄ˝čŚ‘óMĺÚř8ÇBu úĺN,Ín×ʃŒ\Z.fË5ÍA ýđqWËÎ̤"˘Ąě'8éžâů%m@œ“ń)%ÜĆ2;w˜DO;ąO­Ş YЃBüŒĘhťS­ŰhL„Ž0*oď&œA^Ěb*cň›]`Ąĺ¨Ëč–:§š[źęxş!‘ œ _~×Ő:c{ŐďnˆƒřÜťĘqŽŐĐ>Ô[Ój…wä‡6ŻŽţ DÁj+§˝+şĚř˛MRřĹ˙hŻ–ĺ:ŽşË‚_1˙T8î÷ٞŠ${;Uސ;' ’˘ŹëđĄTTůŻşŃݘË{%ÓŠ”ŞÄi\WŮ㍩‰?3î˛0Ĺ5y˛ˇň‘NôBŠ r.RüŠ•‡Š^ŠUf_ÔÓŞÔ5&ČÜ[•žťÔaBźKdXߢŽúŢFŚáYšŕ‹ţZ ß-hrT˙ږ&m`Sůýٖœ¤͜ę8ŞÝ4€^ú(EYóĹ #Š:يśÉŞ_žő×´Fű˘ţz¤Ö2ŕëĺţą”!T‘”ŤxšA!‚,ŹA]˝ ĽÔŹwctŘk÷°…aËŽ~ŢUD;]_\}ŕöLee÷§Ú3đHâęúćł°źmZ(.„žšÄœ;&ëű6<{=ď‹;€ďŚŰOx–—׌î‹ŠB09ő6.V˙ćr˜=˜C¤`ň÷‹™éŽęż5ŤŻţ›áO ůQá=ě+Ţ ÖüŽx‚V}=Ýż0Š€‚iÚ+5ĚűçŁüĎ<đ•gž~Ńĺˇ.ż˙:pÝ_zćGźœ<íéĂP~9j#îü›­ńĂϙö°čáë˜Ö–›žo čš'+ƐĽ1ôP„ď wÁhšŢPfíüô‰8oFOcʚĘč!Őh ŒNŇĚ^ů›^ţ†Ë˙˘ p<œ›ú—ö Śř˝bÎ˙ĺňšŽŇ†€>đxşžŢ_Üđđ—ËąÁÜë…ŕfoZq7z|ÂФ”A4ˇŠ™Űú´ç6Sű˙x}ýÉ´gĹ^hzRܚŠ’!äčF¤bCrPĂA~†ĺśĘzC[ …1—˜ŕá^”ŠkȜHpíĂýç;LÄéňćâę_fŔđŒ ?=ÔđńbgߞŸ|óúŃOŻĎĘ\TÓŮë=ýqůyÂK1ÓgĚýéoӏ˙TÓťʧč¸f (˝Ýt‹Ţ€ţh;á +rdňÔ@ŸVg˘¤ĘR Â/)ܨá!e`žBŠ ŠA­#¤Œßꁐ”‰vĹϒ’ŕ”–ÖX…ާ7Ö°ăˆAÇHŽc70Vw x ¤ěä#œóI¨Qűh†5¸\ĽŤéRb,ćŽŃârc1݉Ň5wŠŕaŠÁ“ŇŞŕ¨ŕÉpBÉÓ(ƒ§I żč˘Ž‡HԚ”ôÔa6QÓ^xe 枲žQMz” €Ôh™t‹Œ&­%% †DR PóOR,”iw4ÍѲ$1$J—rČLI{œ ’ö¸¨ŰJ ˘`”´§ů.ěi1ěq–SžÄ'ŕQȔڈ+ŕ–HEŁ ę,gč8.ťIţG.Íö˜ˆˇĂČîČŮÉŤó“DޖŢŔŸ:ÇU'‡×€â ŒçF: çYđj÷´č˛UÄH@3…0“vš÷F?öBĎŁöě‰w,t.aË>Z¨eA-_OEó…%`˙@Éd§lçޞóÜ=ăÝ#˘ôĚ=3Üó÷0Ć*đË´ńȑÎÇ#&ZäléľËťžj˘M0Ѥ°+†9Űf ď-o˝„Ůő°+SĺŠ [MS ŃLš,1LXbMd\‹I ÄăÉqóýÇŸMUEť‚qŽ%ĹÄH}Ĺc =OŊü震˜ĽžŹK{äœ$Ž3€xCę‡%†_4mf¸“Ç1"}ny9ÂŹ:3úfýSą 1=Ú1.xýĂb)–ß/a^ŠÎ†ÍzdŰoÜ°Ú ëžmNsˆótXśĎŻ%?f{ŸéVE…/Ż*—^+(:[:j%tŘ0Çůę„(zĂA=Fjgşƒ$ űŠk@§M|Žâ|uŇ­čÍĘŚaëÇŐÉĺ7¸6  lHč4ˇm@ëŒ ňbđw™ˆÁú¸‰— ocsŃŔŮĆMźPqÁY–Ľ†qćxu {Ű4´h´;FźšŁYŮ4lý(ńjASCP"(- Ą1>öDľó(†ÁQS=4Œ3Ý1ŠÁ§LݸƒO4Ĺ|Ĺ08ŘĘŽaëÇńbhđh#Ĺ/ĺ^„GPŠsőî<çE„‡378jf‡†qćđ4JsŽihΡ;Fxšƒ­ěś~|!<5":݃áAԋZ@ oWOĽPFSÉdć3am:[qŽľ7ž:ß5´s˝ŁJT sT 5"ď¨çZĄyĂŃŹlś~”đ4ükŹ[ƒ %÷Š5ĘMGŠďÚ¸Ă0‚6’Â(UH1TFŠC ČČ1J ŁÔ!Őp˘¤T”*¤€ˆ“2J…{CĘ+@œ %† ÷¨bŒŢ¤śS81¨š EâpVz“ZЃCŐGÚ5´sOm§pbşN\żŁ§ś[Ń8š•MĂ֏/T>ç› ýś/ ˝ňmMľÇąy ˝\¨ÖLŤPٌ„él`ŒŘ!a0 hJM§ńm;Ń@ěD_kÉR…˝m`ĘŇ:Fů ŒĹ$_š ŁŠg+ÎWpĽĹ ‡—+5´s˝ŁJ4Šrq,AQqG=“Dł˘q ťŐŢšŢQŢśŮ{ۃŒ!$ĎĹtœ•8ăbôR'9xé\;çĽ˜Ö5°éýŽî\ˇ˘q ťŐŢy8×"‚<çPzx§  ô(˘ď)—G”ů\ó 7– şĐĐÎő’ŞÎށšŠźŁžkćě†cŘm÷ÎőŽ’9ŽČpŽSŘ´Ĺfz‹˛p.´7œËčŇšvÎ ŠeŽŞMďwt纍cŘm÷ÎĂ9ö˜ŢŁ"qÔô¨~:ßCĘǑľţ{MI—nǢ}¤LĂú§!­V…örůęż7ŰXzcű&YßN¨qš˝EáOfXÎţÔ,tÚąűÓlQ“Žöví͟~;˙ŢlŤŇ[ۋ?ŻÎO0;mYćÔğÚřUEE]ÔSŞ#-¤´˜)cű2űăü÷ĺ4Î×KÂNöďĺ–ÍŸęŸJ{|ZNÓ|J˙c…ť_ĐCćÓ8o~Ź w…ôŽŹs 9çb"oŤvŘĽŠŽÇxţółZJ6Ή”X‚ĆS_oŠéŘ+Xćݢćťë kĺŐýB“už{zX0´íĚç›#şhW´Ý^×ăsĚJ›ąĚ¨¸ľňtĎLlĹÎ3DĂ|˙dÍtÉťx~:fœą¤Ć˝Ô8…qîýÚn*¨Řöj÷´hŚxÄ‹= XҟЏ(ël^f„>b„AšđĆóK#á€;uy-[#¨%[mxť`Î(m=—Ň óî鿋6Aşv‹Ś2݉:Ľˆx(ĂÝožî“*BŔIž€ţń§î ʁ›H˜Złq86mżmŻQëX‘ćď›(JƠ؏ËŔ§dĚVń^°žŰC`02˙n{Ô1{°3„_jŽ!ŕjĂËÍɜ%Â&ÉÖ,íó˜c…ćą—dű"c5`˝2ÁüžŘéœýĄŕľ/ňíůaÔ­ź°°Fgŕ/ڒ´Á—í„›DvM&wČF”uĄřU›p˜'Áă <0ŤëDnÖńĹŞŔ"X70¸Ż"Đ˝Ô_w“CšśÜhzŠV ¨ŐÝ<Âň ¤uđk0ö‚'đą‚ęŒybÜE'IÁZ=Nč1†2%Wƒü:ŁĽ”GK6uŚ,…šŁB+nú<Áť˘Ч’7 ×ä‹ĂÁ÷K§ ŢśđPаć P’ń…Çĺ8ěŤ*ƒ‚pĺŚÇŤŘ)Äů@<Šřp[¤œÉy,őJ˘Đ@ŠSjîă5ÔŇČ˙Šn Ť…RP뤋M°Č§q;¸@%sť*‚č:4Ńmrşúś1§Ű°ˆÜş}'‡|m6úTĎű' ”Ŕ?ż.(T endstream endobj 242 0 obj << /Type /Page /Parent 756 0 R /Resources 244 0 R /Contents 245 0 R /Annots [ 243 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 243 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 384 528 410 542 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 244 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 245 0 obj << /Length 3451 /Filter /FlateDecode >> stream H‰ŒWɒŰČ _ůuĐp4!Ź$hŸz4­ń؎pÇ4#||@E# ą4Çżaűü›~šŘŇh˘#Řd-Y™Y/_žúnżzťß‡&0űĂ*źÝng|üéםďůQšmœx~íĚţ´zűŽKLŢń2ßtůęíOůÔ­°Ö÷a(_­ÇŻ—ŐçÉ]‘—:˙rCß œ:;÷%śď›!?>f…qץďüčb &]ZŇ[w˝Á˙öĺeíŽwŢÎůä4e~ĘBF,í ą˙ƒ`řΓ͛ş0EٗMmÜě˙źzŘŻSšUšzÉ.B „ą‰ŁŘKăŘŔÓmhZť:ŹžŰ˙J˘ÔŰĹaJńSlÁŽÂô%ŔwÍŮ]§pb—Óş1>Kxĺ{9NƒG—>{qęí{ÍxěE8k˙=™ĘWÎďÜýĎłű€o;™–„Ć|¨~Ł“MHY6”aXÂůÁÎŰ ‰trěd”ōĂ鞣$QšĂpś"÷ô fˇ;ßI ë~꛵š§ BšJÓ­ďü/‚ŻĆٓP<śîMs@ äRŢhP§SVfüšTłź8™˛ŒIU¸>dů6xł!SŔĄ‹4d-ÎĹmΉQ"!°óŸy)]đkÎÓĆŚrŰIúłŢT6ëzÝkšÚ"5ÝšŠ;KÂŃŔ¸9´ÍɌcG:ݚ¾”šőŒ„ÇAł ˘)ŞHÂzPŚĹ ´ĆžƒřjV xRoë,C§ľîVĂg8ÓŞA윬W˝•Xí/j ˇçŢôGk~˛…áÎŸ\¸œ8Ýńč;5áXÉÇk’8Úýďľ śSAl%ĘŹşőÁĽĆĹ9™Hó̜B[3œuy|Öu•íŻ8–c D%„IZ֎apāŕĺýŁC Ž 9ÎpŃM“ś/OpŠhđQ7€§ĽÄĆrĺ¨Tńpźv¤Đ›•P^Ů6œŔ ¸öÇąěĆ^0†8Ł1և×emÂäŇęĘvťzlP÷[xhέ}AátŚěĽ´‹FA2Pń]ŁJš1TÖÇňˇQë’/Ö˝ŸLN'â4ýĽ\çYU>cŠžÂV7EďIÉmpV‹¸{|\2aӎ4sćj]úœN>§âótŁđAIaę-wŠ­Ç­žtxޝ‚2ëŕ4„ĚUÎ2Â!”ĹHjÓ9;HA"×XÂ{ţH­?tr˜–˜níúŠëž´ýČ÷v›™˜ŇI9ÄKĺ&X3CÓë($AvSqݞSÖ˝mŰA›Ţľs‘Ó(wuń„Ě”ÍĐM8œQ“ŠíeÖ§¤Ětóâ’^~QvyÖB><ŔœÇJ’c'ß2đĽžVpޖĎSQ‚Î:›3şHŽ_cĚÝäĂN|ŕ; äŽvrGL ô;ŕ Áhkĺgn˗I()M#‘ĐHäkYŸ*d1•ńÖŁ/YĹÁӿŸ¢tý@°¸c,ęĺU ôň¸;˜fBžŃęô-ű~k+ëźi[äʜհxږă~=čNű<˝(E&“$ !d'íŁŰĆjmÓ~t… ]!îÜŚ”t(mT\*RŢu…¤ˇř)ţSť˛ëZÓLÝ tMrŇW9É RÖ]oD0ĐŘJgľš•{äŢkfWzq{I˝QŃś#'Wh~|Że1ĆşÓ֒8Ü}%źoIÁÚ<=í"úŘyG(ŮRđ‹ćä);ţ]DŢQė­ŻŽ".ąç~ńF•š~ˉ™ …tGý˝;6CU`ŞoE#Ş üBŽ_˝îšĂáŞcGŢ]#şŠŢ8ăăGß|ÜßcGń?îdtRíôƒá˝Ń>=ëlUć%Eš4Ç9ÜބR¨SšŘ)zV$ńŻHJNVw§Rޕ­]´•;Vr?SâYKń$OÂOąpBˆ>ĹćâÄž&ŹÎßjhÖúFn<žűˇ œÇ§ˇĄ97m/˛…QŮZČXV5ÖĂ!ËűadŐB´A‚–ʇ•‡+گȡWň`’ą\șTěFuÁÜzv@ךŤĘ>{ŽPĚĐÂÍĐßÎĎ'÷§GÂtFkeœeí—‰ŕ —÷ĎÁvýşoÖpQÓY¨źěJš¨qďˆL!’UK´ůF-eçsśy¸FČţk‹:Č$ą%ž Bh…j8ç=ÜőÉłîôUŚ|S”9d(ĚfýÂvĚścą}DŁ|śvYÔh›şÖŃź &R›Pä˝$30^ŸÓËŞäOe×7-ÜŞčrl÷‡ĽDAˆÉL˘ˆ’ÂSd=¸Ęü˜-I^(yQ˝D™t#~}p+ŠC=铱2)÷×J Tčö–#?ónÉiÎŁĹjqJe“˛ź%FzÂDŹ­ŘŠ3Čď\Ď%O÷ŰŞd˙bێäJěiŇĆŹÇ^´y•ľ_–™ Â™R|]”¤ýMu#Ňš5?ŤŽDrŁl›-kŤŐ9bjØ SRp…,‡Ę‘ˇj ‰\˜ů+) †WYĎ^„¨,bG­DNÇŁpؐpŕ eoŸ4ýćłńŻ.÷ęRž‚ŸíĽ˛´<ď”pŕŽKbň7U”=Ţډb… F^?Úüsšœ2¸Ż'<Ö Zšj`ľ9ibĘču2•óUÄOzž˙)ă÷^”‰Č*ú‡4PßúärƒKŸ'YĄí"eÂiBˇvÄËŘ'lŐJLÄÄť Y7MXŘývląÓעBĹeŇMD¤Ô_;éAŇSŕ=.çgú Ľ„Cdoč×<×đžƒüĺdŞŚXčUč~$ŸČ5×ŕŔăœu J6ć—Œp"SId¨{(‘H#˜rŽëÉÓ˘Ąťw'w—çOpœ2<Ćň™M–ËŌ ˛(ĺű4Ňóׯş6­†W Ž'F3 ŚËЗ\Ž­@÷Dt=6"ł.Ú,ŐAINĘvQżwEOólϓөáŒ÷7Ńľö^u¤{źš‹m×M=Ó"…6VgŤÂîŕ’[M{"šßŮJ%÷ýbl´¨!ôňšÍčvŮ"d­îĎFuIňŤť6üo+H3”#&o kŢÜߏţŸî˛YR‚đ}Ÿ‚Ă0bEeÔëţ7b=î…@ ˆE0Ç7ŮçÝĘĚjŔ1ö˘M[ݝ•ő•›ÜqB¨›ř›ńc—Kňëjxz˘MZ0݌ë=eUmîhb\ń:€c§Ú4˜ÂĂ˙8ó;1F´fD)#rÜ\Ď Ľő$—k›]熵Ő  9c›ç7ŤŒ÷2ĚÔŕ8ÚS‡eá&w?´eče?˙P|hF e5löjŘlś´‹u—Ř˜ Ł}‹Ť÷˝Ŕa6‡ăłoąě‹;†í˛ž/ΗPG’ô ť@yNĽ7cďúŃb7ŁEš>m<I䯒Ű>!°͟—ĐŢÓ8ĺĆö`ÎÇ="džĂŘfŞ’(.,XšśA˛kTŻŻˆÉćš7ýéÉó”Ll^ŞR™ĆCZD}öÇ(x˝\ţMlŚ3ĘĺŻ ľhšC,úŠ*cŠÔ?ľuÝŢUsˇńŇçŠŔş<Ą7’2x8Ţa'‘ĽŘďX/QÇ#]ó ťŢ‚ÍŽGÇŠuŔŕTĘ6v˘ú ťÝĺÎŰĘâe’—ĝ¸d;băçĚm-ĆF˜ä|°ąˆ‘>0 Žśéne+[ă× ßčєlWĂŔW)%$DŽ—ĽĆÁ‘w¤ƒiŤNR5t;€Tڈ.vlkűŽô•›Ű ŹjÁiËh ĂGŚI`ÝÜäëĚČɞš5KŹÔŘBÂůç4˛‚SűßŔv0÷™„Îś˘žŁ/šłČł›ľ8ţRF=I‰‹MĆ|t–ĎgŔ㌟ž†‰_Š˘ô„Ó&* sLH“ÄU_ža-Vb0]Ç4Ł›Gţ†]hK&7őűÂßt˝ŃźWל9ű…žz(‘Bś.łB„fjӘK˝˘{čČ&3XKů¸Žf–(čĂŐmďmďľm%˛…ĺFŮîy,űXbGĆ]ö2vXs ÚÂX\™ŁŢ˜2ó{l_VߙŻhoö@HÄc–`ĽńE5!}?|ú'Ŕö tš endstream endobj 246 0 obj << /Type /Page /Parent 756 0 R /Resources 250 0 R /Contents 251 0 R /Annots [ 247 0 R 248 0 R 249 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 247 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 146 574 172 588 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 248 0 obj << /Dest [ 257 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 399 530 414 544 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 249 0 obj << /Dest [ 263 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 359 507 373 521 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 250 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 251 0 obj << /Length 2761 /Filter /FlateDecode >> stream H‰´W͒ܶŽ$ˇy t S;\ţΐöIś$Ű9$*íÜ´9`HŒ–‡¤ r×öc$ŠźB^3ýr~Vvm*)•–CÝ_÷÷ő7ťŐínŤHíŤ( Š˘P!ü“ŸE„IŤmšažjw\Ý~k3UZZ*[Žnżť‹Ô'ť‚ľa•Ťľűů´účÝůë( rďg?ƒČku?ÖđůޛƇ÷şRţ:˝|X“>.żŢŔs8č˛nýuŢ'?Â)őÝTWšUŐq‚?m7*ţdyň؏jěoÚů‘waÉWËśîţČa:‰“Jü›Ś{’Kâzđo?Ëŕ~˛Şnatů=0"‡~œřiÇ5R"Żă7‹•`+KŰꟼ‹ŮY+{×Ç#˙ŞęgŚ3’ÂPfô3'‘ĂůgÝRZGŢě X<,fgL=…Ę9œżĂW´;ő\|Ş›RÄöX˝öX ˝„Üăź-›ŽüŒ‡ŇPÝŇŚčÔż[^p¨‹e*LÝBůÓMío!MÁđa)HŕeЊłÁW%ĽěŽG f Đ:XĎö´`ŸŽČ´ÔՙŻá` Lťďč.ÝŁ†ş2lWľ-őPÁZŠ82÷ęľ őÜŹÍlÖF@ĺ€ĚŢń6P†0(yŘqŔ źćta¨ő~Đtë~čdƘJžľxšÉNşš,ŽÎ­{-+?űk\†NO%ĹŔŒĄŁ,:ĐąýŮlĆöťxaöB iőÁX3Ş{ď“yďü ÎzçŻ1ďýٟ{Jń­wčCć‘Ű$ĆjvŸř‡×’—¨đ]†;™íJťćM‚„#L ĹŠ)Ś:ƒŽ@+Ń,ţŮÇÜĄ¤5Ë`Ä™Ŕ‹sâ†]řŘü0P’0üWÖ텡ĹlhÁ†ćÇŠLĽmI)p‹J‚{Đü˜œTŘ<^*l>Ÿ“‹Z1bThÝA’cӀ5#ńĚ@î/[Őľ.ĂÉŽˆ V`Z—ú nÚXöđĆ `§ŚEłis)‘J‚ucŔH DbŹrüCÄţŔLŞ;(7ă@eąđ#Kâhi”ü˛˜şPI ]ĂcňčđÓ'űžšú6ë6˛˜ ) ď÷8×-§˛ĺŠĹ>˜žFˆĽŐÇžka°ś”łXrąÚ(dÖŞÜm…éHŕÝ{ěÁ ’Yőšg>•¤÷~pańů/Œž*ŒłŃ„Ž™(Ş`h H˜hĺńˆśĄQçěL2ązM˛˙…­‹ŠëS[ďz-If8ÝůUôĹĂň9&Žf\.ú~ăîČR}ä_Jž]% KtČĎŚáH3ůQ„Ó˙WěŢčQCÜúNÂ2ŒĚĽrp“Ţ7†CUaNŚŢ—źőBKfgąŠő^ď ;FÉ/óŮ@*¸ŸQ:7[‚+TňçŽTI‚ŐTÓR2P]ťśĄźŘrŻ•y˘ŹçŘÝ. ŮÎm& „XĹI;Ă6"§¨äCš”őčô‚WD­ö °¨Ĺň3'0ě…}‰R˛=&Œ„.)Ł™€ąÜ3ƒĚˁ9ŠĎôů‰3CĆÄ2Ć;¤—RúŠPîŕű7ć §’×ńpA<{DAáx˜ŘuŒčˇnD °âlă#ŹAMăÝe­u!šôDçTŃ^¤‹QŮcą4˙ZâDŕ%,đ˜p \ ldrFBĚH( źůČO˛Ŕ–_Łq| ¤d0¤É –ôČ6ĂŁčwÇCˆž&Ał%PŸĎ\űœ@Ś\Aaú—ĚżŹgƒ"ĺ;Œę ĺŞ;ŞY ÁV ëÇKćťjЇgő,Ąz–0 ”ŕćui\ŔśC8cŮĚ8věP‚Sńhœ,Äý:a6žTáš4’8ź×ĺgşpď8Űýуnń¨! AYH˜űGŘżLgŤjîĄŃ]!Q€?´Šš…ýľžúŕJÝtŒ ˇÎ4 ű}mÇn¨Ą @@OwŚU­3р +łĽŠsB^RבRr̜RŚŠČ“h ĄG÷{fg•×*ô ~:ˇÄFüŤÝ$•'Žťzhj#Ýä˝ĎČp•PÄÁâqL Ó v˘CPw28Ô(>…aő•óBŰíI–/pČ>żTӓŤŠŸ“4ČŽ¤ęU %ŔĄŽpTƖC˝7reíät÷hnÔ~˘Ňz!Ŕ(“ĺ’U]QĄŐ‡ƒÔÖR”[.•‘Ú˘]O‹'sÎz!ŮśkGAŃŘ2ą?băť%ŇC]Gר$_á# ŇíKńqŊxɌű;čE ’™@iBfglĹ9Čd‡zY˜ąşˇŞ;Ö@¨Řp×ÚĄX"ůŃť÷ S°”çVSŹn-śœč¤şHjč * §ŒŒľKŽś˘5YqKP€:,¤Ü˙gŽ!\Œ"ůă endstream endobj 252 0 obj << /Type /Page /Parent 756 0 R /Resources 255 0 R /Contents 256 0 R /Annots [ 253 0 R 254 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 253 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 155 511 172 525 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 254 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 280 343 306 357 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 255 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 256 0 obj << /Length 2956 /Filter /FlateDecode >> stream H‰ŒWËrăČ _ů}ĐĄá)<ůđœ´#Ízí‡bÄی Đ 4Đgýťá_đo:ŤŞ‚¤´ÚP„6úQ•]••őĂzrˇ^‡*Pëí$fŤŐJůřsŻ+ćGQ¨q2ó—ŃJ­÷“ťm˘˛–§ůŞÍ&w?>ę[;Á\ßÇFŮdÚż'_ôł7 ˘ŮR˙â…ţ,ĐUz°–Żë.Ű=ĽšňŚĄŻň0=šb7ăŮlÓŹ¨źéjśŇßź€>Šť"—C+CŹĹ3息ŸMVWšzĚ [ԕňţšţŰäq= TĄ&Ëĺ,YEp$˜aŹâ(ž-ăXÁŇE¨3ŮN~X˙ŃrśŠĂ%ůOž+rÓ?Öoş„qđŤtăĹř_Ŕ*‘á4¸ó迣î>9ÄăY„łÖ´U6ŃňÖ˙Ýl[Ég4ćCݝŹBBYÂŘ çŤŮ ŇÉąN Ĺšf¸o $‚9 G3˛™{Á×ĹĘ×IŕOąťżôŐTݓS!}Z.žţ_4‹•ROé71^Dë˘h€Ů!œ„łÄßžĹďÚŹçóUuŠŰřÄNăÜ‚AŤŔ9Öľéý>Ĺ˝{‚Ą5ÖK€…ú„Ľšłyt3ŔLdßőÎ8$cA2AŹ„ }ąŒY˘UšeňŮlŤ,–oť˛T­…1i“ âOĎwĄúu_w­ůMeľX #gJ­wE+f˛qAr2n>7ăZ“qLçŚÍšbcč<ś7áŽ5VŐŰÓé|¤ŘŐn*ŸŽXHËş˘kÄ ťSiEIˆ ě7‡–ľ“i)&Ž˙üVšú`[Ŕ&œowőéX9OĽŒĆćýs 'ŃŮx!űPěĽŮŹŹÉźľĂ•œ‚{ şr'łËđär°v)ւhBDőNâróRŕ&ÓZáNŠJ=ŰƤ{b. $sŁžj™ęŚ˜Ú•öŤ§č>ĺ*d´Uc*eŞ~lSÂłóXŃ śźqs>qČĆޔ~`Ď׃b5ř˛_Ŕˇä…€đ­jwuWć*/Z>fpŃ]‹˜˘Üçފ[ꄬX‘؞Š;Đx҃\ݘmÝ `\ÝJ_„Ç+‘[ĺEm|éK}n5ll8;p`H U¸Qő×úh^ú(߄şšUĹś÷”hŤíę/šŽ˝ăň8ƒh`k×Ś=gYL4žÜ;ŕʗ"€WŸť”ţîđ_7엖ťÜMł1(L`ö‹űťŠE 2ŽŻŰW"‘o+ÝŕĐşjű] hŕĺ|t6U‡4űٍÚÂâ΀lŁ v 4ÂtF{ŔÖ"Šîqa:Bᘂl—ÜüÂe™krOË÷Ę tť/Ź•YŔŸ°%Rˆ bνbďŢę-vPnj5ö‚Á˛/Ő|ýá4%—'Áł/y ł!#—˝Ě G2”úłĄ2xž‹°hœ¸ţbđ|á˛Q=ąĎPYŕĄ=ň˛•B°Đ[{Lݧü $Ľ"@eiYl܏TžSqEęëkNX[d'=9eßËěٟnęƒŸTí)đî?ţXWHŸUÖt{ŤśuY‚ńŔąCŚs˘ßÜßߪßWéÖrj7pű<8ŇęóUůE?ˆ¤YsŽpd/É5Nـ7Xh'nhŮŚCbů`,m"‘6‘fďč {ŹĹ4néx[;VŇ4Nj•<œbáTşżŸ¤Ń{đ;H›4]|ဳënšž-`ú=UŹ{.é˙՛IäŐÓČ=üsC1wIć"_ŹTŠG’ú‹‹¨ę#TŠŰ䛌›žOŽ$çUŃëÓČuÖ֍peZš2čZ'ľéÜŔvk¤Ř50łŽ°rDÚĐ~@~ť™P{ŚWx}QEŠ ;\6żÓ‰p˛tÔüÔ§Óvß‹ŕŞVižt¨sŤB˝1%V[Ž’ý.蜘ÄNačŽ ĚÔ |löDQ;'Ď7ŕ„AŃ*ńš÷<×čÜŃąđtGö:=a>÷RŘăî]z0K[—ą1™)^̉‹jŔĐŮ6žęˇŃ¤?Ŕ *Ž„ŽóRHŘYôGkŜ{łTĐÉQ2đqäz6ŢnZÔŒz€çÄş4´MŃńpË9vYLP\Wc)q%˘¸2SüŞŹv§’`h{LĄËŹGxˆjs3íúÔRag‡ÖTŒ’2­‚ž÷Ş+˘Ý۔XDĄJCţófا.;2áVľTÂ]ßtKź=ď;Cß9¸v‰Tg265baKzćė[Çn,ť†hZčONń‰IŕI&Eîy¤Wl%šÜBVłĚKٚüNšťÝoŘ]ă:  ˘q[šôĹ<űÄ ƒuÝeť'TZ3J׀ÓŐ\Tąd‡]•2‘čËě ś‡Ŕ FÂĂĹlňű1+g˛äźňډ.Ľ˘˜ku×]ă˘Ôƒ ŁF!08ԍ-ú¤Ł€˜“x­Ä2DňM݃?j@ČtëAĹWyÝ×ՇžśSÉ‰ŹŽz3ĐXŠŽŽíŇň@ü>Č}éNJP¸h @6ó1|CĺôĂžp÷ľ@ˆpZR—ÂýŠšÔşo’M—(RŁŽVŒn‚˘ăĽ.ňÎp~ çUÇŇUč)ІďuÓ Œ({Eßś Őó< eUŸľ0íŽîĘ>٤PN8Ž $Mú˜?)ŠA\/P{P†Ó គ…+OҝœŹCMMiÂ) ęV==߅ĀäOAŸĘâ?ô° ČZÚößýŻhzqůľ€ReȚqüGÖ&&™kw)żXkJ~‰5šĚĄâNOˇ˘pšŹbĺ%ŸJYÝš-‰:˘1Dpvś=¨rüŰmša™Î?ĺ!űËô ż—ňáŽízřÍR{•rŰ2Ľ˜LtŻ2+Ű ZÁ“Ş"Še’^;ˇęFÄ@Ě4}.á’`žűlôFmËTź?úŒľŻZÚsŁéOi˙Äh&ףÝ<ދIŇĺţżëjŮA‚wż‚ăšcŹŔ?đčĽXI,Šń÷™}YđBiK§ tvv^şň˛ŽHm˝Ć^ţHś4Ž,źÉŢzăěƒ2ť…š1v‹×äqËĽ <Ԉ¤5ňŻëŘnÔ †ţ@ŘXAĄ€Ž‘ËÍ%B\‹œ2)ÉÁëňů˙Óýź“›'Ë1–^öęj{¤ţţ@“Ůžš'×Ú´ÜĹĄÔ2oEřĘ)ÝÍJsÁ?!:xBŇťb# –‚Y.qÁľÇ&3wšÂ~ڊI  ßďŁę*ióËŕ<‘&ëfm¤ĄbLÂ\ ˙rÝĚ&é=Ź endstream endobj 257 0 obj << /Type /Page /Parent 756 0 R /Resources 261 0 R /Contents 262 0 R /Annots [ 258 0 R 259 0 R 260 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 258 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 317 488 334 502 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 259 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 434 269 451 283 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 260 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 431 187 448 201 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 261 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 262 0 obj << /Length 3177 /Filter /FlateDecode >> stream H‰ŒWˎŁJŐlýš¨E2˛)HŔfŃŞŤ;ŠŐeé.nς‚t™i<€Ťú~G÷?ĚoΉˆcťş§U*“ŻČˆ'Nž]Ďn×kŁBľŢĚÂĐϲLřsÍ,đƒ(2j'~F™ZďgˇďşD TWĚnyŐS7ĂŘ ŔBĹl14_fżëoF~Ş˙đLŕ‡şÎ}…éëćXl?äĽň&ĐżzƒN†ôÖ[,ńl7yQŐŢ"ó3ýä…ÔĽ~9VĽ|ą4Ó`.ža¸ ý`‹Ś.Ő]YőUS+ď_ëżÍîÖłPUj–Ś~’E8Hč‡&Vqűi+Xş2ŞľłÍěíúˆR?‹MJç§ł…3žkŢ"…q8!fé֋ń[ÁŞŔČpú¸ő衣nďÇc?Â^ë÷´T1ÓňÖ˙žÄśeŇ-ySע•!/+ň0VÂţać/áDÚ9Ö9yqŠŮÝsršŮ˜ÉˆÂw ôޞ@'a°ŔęA¨…zC‡2Ô•ŚŤ@˙7ňcĽÔ‡üÉŁMŹŃź(Ýě<œ? ĚO;8L0ÎŹRľ 2ßK†˜׌Ç5rÜĂ.Ż;Ő7ęĐěvĘ~aă >{+XTUżĂ'ť‰ S›ĆiŐžaP”yŸűjđ§ä ˘-{ nÁٖn“W;W-Ś[ŹQZ•b|f8 `JNńIFƒ1¸ŹşüqgKőС6ßťů-œí'ŔoUÚťä;UŐŞßZČX™¸0%d„čž§/6,bߐŠQäPysďQE|Rťő:pgî`­‰ĆœĽ&çŹĺÉ˝—`cőď˝ZŔyĎě¤W}ĐÉ:gĺĆJ?l瀼ň‘r _EÖäkdş‘xěvÍ \÷Hü€Wö BÚÔpĄ†i42ŐG™ľ‡K's˝C…ĺ¸ÎáęŞSEłßS(;Űwě|ń'›z×0ĚĽ™űÁ[$8ňƒ ~ŁĽąáÎŽ)t˛:™ŘőČ~Ďh”3 § ą}sĹrÄ)W=ÄqÎ:ăŘÚÍdŹ˙xA+Ő)/śŕaiś’qĎvŘT˝yGŸ2ýwDęĆYyOOő*âśig…rmĹ6ŤJ7Ev~vë–utŒ…çc Ů5'ţ ˙ä r9?Źi żöň@TĺĄĺĆ8A> Ż˙UX, Î×ŰË( yŔőŐ]ՁšGUEW`ŽHÉ{Ëżnb ŮpŰtýüźWˆź!v‹őv"3Né%{Ž Tš›Ŕ}œŒ“ĺ 7Žóžźť<[Ë>K˝đúz Ÿ$Z^% k.DF4[8j6î’ ÄM”!~–‚UEÎ!äŃ7AŽ ľ|/šÍT+{t$ăVZÖŕŕŧUäkϰ֤ʠ>VT”ôť—>žŕXŢJőRA"L-ęM-†~7[Ż řĄmŔš;š/$šHŽvšČÔhëĄĎűc•đđbOůs—![9Ě]WÇ^j¨*0`ÝôŔŤMŕŞM^ôÇ|GF8‰LçŞ}ŠŢآ§ˆđ)) Ké^Yí éűĐöUMĺŇ D/xKŹĽyBŁi˜›!ŁUSИâ؂+/ žňš­äVŁjZԁ śO Č%%¤>?Ń—ĺşo›š•ŔłFďo‡eFUƒÔfab?˜›i!â?W×ȉč˘áŞzđ€h*;T˜\B&g9ęď5ěMQ"‘(‘•+)âD˙…Ëń’_°>EďĎJ;óci7­ĄŽE~°0í=‘…Uë?Ö?wĘĘϖ2DŮZ\M”´čZKiÔYŽ™T2†bAƒîßP…hÎt[&aĂÔÔŒ" ť\TĘÁ‘áPJ1ňWĘö•~ď\ĐpbŠx‘T<ńiÄ>%Ď^:/üŽó‚Ÿpžƒ;ęb —á— ň|ärš 23+7]Ťţٔӡׂx¸ŮńŮO„<ČᇗJČĎ0•Śtdâůhů•Ž#Ü`˜q ‚ŸÇˇ™˛ró;$łŹA+Rj‘2ŃłŤbź’[‡zeĽăŽ{˙ň'—œłÖJnX¨Ś“kÔüźj )<¨K'-'76Hčâ3 őŚ2&: „zU1Žh˙]ăb5b–i›ńĎËżĎÔXű퉰_MŔŠ:ćLşšťS.y^ťUIŮפ=kó!â:ق)ÜÂQz‡Ë$Ŕýâ‘JŽčjŔaŒ˜ëšl•ű\ËĺĚő6ň6\čÝ芞ÚbŰ0:–ú˛†ř˝§|•E“G đ ‡ojďV= -uş]•Űv+ŻnG–{ąA\UÜ+•$Ř@šS—j¤c٧pPóŇFNÉÚ/n^a”Ą¸ßľŇ˘ÁX>%$hŠęȘßD<ľe°ÄëLžIVÚbŠ´OÚŁ{Ű óÔÝťOżrNB"đ‹ĺö ĘŠ]đď–ç4¤‡B×ţĚ'#> ű=O‡ČšÜ#cűj˙:ýřŐ!÷Ý÷;ĘÂbԊt¸ŃEĄ:JęÓçԖžƒú˛Ź¨OÔ@lcřÖ+•Ćč1˜¨0H^ŽJĚ;Ś´#łš+”çÖöÇśîŘáĐbn%&NH_Ükq™F™'ĄG¨G𙉈{ćĘĄ)4ő[ˆŸ Í9}%ӄŔD<= 9á eŐĺ;[rژ‘7ě öó?pů?Áv%RqpIĘ.ĄÜdű–z$UÖPr)Ýć4IŮÍĆƜ˘˙ţ­ŕ oŒ1ŚĄđAš“ďBďá’KLœŤéüqú€ˆľť …\ĹS}JgČŃ]…ÔG=ܞKŽđÁ2[Ř`@Ş–ĹíÂ#Ž“/Ôœł.đq׎úâ š`ÓÝ+şTs9›Ô)×KZęB ú™Ę Ý+¤´]ŃVĂ*–ÇÁx‹C(§şĺ z}rOŐ]`eôáŕÄ!蚡špăŁs⹃Iý…E| pĹaH"NИż°š#Ą:Ó[×u"ĉşBN李Q/Mű™řUQ€‹L-úëLđ§3W|_”Şöú¨Ú*^ž¨ŘĽÍ *{˜Ŕ݈ç\ńD¤CłĺüD´äݕA÷ő ς?ŰĆڎ1Î# °?9ƒĎĐr˜ehÍľźŰW}/K%ĎgAŞÚđDĘb‡˛F–ş@ĂŤáŞŮc´}ś5xq›?[žÂ‘ĐÂ%NKhœŠ‰ňoŰŕęęĆÖę€ähďƒ&{[ˆ?<Ü\g/AyE`âKURęR–vsLęUAj9°ÇştÔÔJ„S)÷1)ăD y‚ ˙Żó2éiˆĄđ_‘ăDÔ,Jƒ8qŕX ‰ŢčeHS%Rł(řűŘϞd’H qŠ:Ů<‹Ÿý=#› —TqŤĄ} ƞ.P˘;Fœž¤úʎ…¸Ůź|šu.ł×Jݔ=ké|ŞœüÉ06š˘č†łĘ5ÇěbăhdíJ#Ů?\)dúčťĂStĐŽ”DWľ§d†"ϞÎKťó×Öwu‹6ÂGˍ  ĺźĘ‘}4FŸ2lšńÉżp'ÝZ†HńtăšâľŤÓŽňô/'3R%ŠTŻe¸‡Ác0ŁJ  íÁdük9w"ś_xtŔpt–Çśî+K|D٨GüWQń‰zL=‹ôű‹e—4C„ť9X>°{SäUÇوˆŠiââĹQÂϝFĹÂ: ܑŚ8›$KÉ!šM1ËŘCe¨üť*[* Ęü—zŠ2žŽy3SŮ –%Ľ+¨ŽŸĎú˛ĚĹńPŚ‘…‡–*FT†“÷’ĘIéîNœ4?Xóu36jÚZ$?-1ÝWŠäŢ*xŚAôČáhś˜ĽmĆą‹ę…œŕ‡mzĐ ;ú °űW‰Đ..!!zŃP‰S-<o~ß_ŁŐ endstream endobj 263 0 obj << /Type /Page /Parent 756 0 R /Resources 268 0 R /Contents 269 0 R /Annots [ 264 0 R 265 0 R 266 0 R 267 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 264 0 obj << /Dest [ 270 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 398 210 415 224 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 265 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 397 98 423 112 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 266 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 427 98 453 112 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 267 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 477 98 503 112 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 268 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 269 0 obj << /Length 3554 /Filter /FlateDecode >> stream H‰´W[Ű¸F_ý+řj+źˆ˘”b’ěě˘í.dü–ôAcÉ3jmi֒äőoö’˘ě‰Ž3š bQüČsżéífőjłQL˛Ín%eZ–%đ–ĽH…ÖŠṲ̊˘Đ%ŰVŻŢ †mwL°aťzőŰ­d÷Ă Î „śŤő´üźúČo“ľÔiÁż$J¤’wŐăŘÂőMÚ>źŻj–Ź•ŕKŕ € ›dĂ󸍜m—ŹË´ä÷‰DˆývjkżÓŕMwá)e.żmś}Wł›şŰžcÉ?7_ÝlV’ľlUŠ)5("SŠ2–é,-˛Œ¤VącłÚ­ŢnŽ@i™ŠőGÝd‰j Żŕťţ1Y hˇř1ÉࡊDŞQpÜ|HđwôB˝ú5XVŰ7#8¨Úal}”(Ž^(8ëw.îv7° ą‡Ř~ßö~‚u5VŻŮd)ź! zĺ ,Ľ-S-Œeš‚Đ*uŹ1¸šJЉ m–CźmGfąyˆŻůĺŤqŻńpv‰ęKT]˘ň^ Ľ°,œěa‰˛‹Ü ;XSgÚÉK#g—ő Kź´šp–ąP>ŕ0*f 4ü‹ŤXž ˆJe€‡Ns“1WPÎĘĘsđ2ť†›4Ďg<i)íů ž1>Ľ,¸đ^¤˜B‘ƒó]rČÁÎŽŔ­˝‚[¨âeq…ƒ†zk4m ٢Ěuź´ć“ĽBJšŕV_ĂMšyĹşĚSÓVĐĽ…)ĺ:^{E‡ úxôő2>{’ŔٟťSů@â!(|Ęů@â!(|r‰‡| đÉMţNRč¤ěő7Œe,Ůß&œîo…ŠżQ úI!ô7šÂËŚţv…BŒ‚Bčo´ćH"(„ţFË0ÇÚ2…Šż]ĄŁ‘ úŰ…Ĺţv-|źdßČgž^ĆgOxôG/,㳍 żctJîUň݈ţVBzmБó lőť‘ݝƱďPđíéč˘ÁňŚ˝KďF°ÉăąœŇ0yřť! Ś+noßTńPü°ůiYżüśŽ}HÚÂKčwd2łLÖËdPŚ C¤q*Š–WCXԘІ_$F9ŰQGŃBůřТC-Ŕ{š;;Ę̄Œ|>‘׹4|’×xyíš ˝ýͅ uŘC6>Á5˙:“”Ĺ<SÝH2HˇĄßŸĆśď^cNú-śuS‚í,Ś_wc0ÚŮŢD… ţ}1Ŕ%xéȰݝŢm˜€Ň‚):ö0šVžP"8ŤQ/‡żY ń;Ń9ń¤>ňSW7GHŽĘb”ň¤Juq)Y,™_8ńţ×wľěś DŃ}żbY`‰RƒcŤę˘Ršu”d×ŐĆ †4ýŽöƒ{Mœ,ćqçž{ć¤ňVâ%‘8ÜiÇI‡ďů1e~L–94őQáiĐĂƒdš4—Ü—~PşškłŚŘťÜŔI>U%žŞĄ–űŔÍý"EěV:ŽŰ}ý:ĐX—΂nT´ÄÉŘ•öŕčj4ß/wő}‰YSöÜ" ވƒˇĹ#9ŕđšJÓ xŽg¤Oşö‘ž[úQPŐúáIĆîܰ–véJ߆źwĺ”7 şVÖňfż:ŢŇÄŠÚIœŠęĘÍď˘,ß ďOľ†ěäšÓý š=ö'˙ţ,ö|ÄyӐčIŚâ!SńyôĚôYŮßéy§ßĈćÂmŹâmĚy.3ăvE•™ŐR LU+Ż´DÄ)Đ%Lt“Nš;taůH˝XűžEűÄÔłŽĄpN|cYÁ…Ö¤Nؙo@řŇôĺ˛â¨Dg…Ŕ˘ëąœĄžwžŞ đČţ#D—Ł”SűÄńC…ź8´Ů4T™}‘Xiv3EE)ĆÂĘť7ý Mr0ö]œ<×]öň`sӞŕ„-ľüǫ̋ؖ2ŮÜ}Ĺť3CsË!= 2pzŕžkŽ'ăídŐ_`ˇ"iţr˜AŠ5H=)hŇ-’>B}ˆěęä‹/侎ä=şĐ¤¸żě&'Ěe§1D*ˇ(ąĎ¤őJ8Ӌ=.ě]])QZ˘;Yz¤ÔěIuŒK< éUžČ4ę•C }Ëy“ŕą­0Q÷ĂӗÄüm°ţ3'ŰŘŁv{ďšČLäÎ*ĐÂŮÓUPNčéź:g'^mŮ)םÖŘĆQi‡ř‰CŠ YŻd ^9—;3­ył\…p.š6’$P鈖ÁŚ$ʍwťrB’@źl Ë8gŻĽ4ˇŘ°ŤżZĹńžŰÜNh†Žu"ŤwA!˙^IUŁž€Śd-jB$ĂhŽÇ|lß6ď”1IĽ^ö@úr}nƒ“/˛Öô5Çžo膅ˆäšoIj6 ľ¤f#ŠaMłšh@Ż’Ü =§ŚFźČ驜DŹ)Ar‚•ć’HfěĐmˇaŸv°4Ě  0Îä5ĐRŐţł’ł™ďl)FŒ×%{š: U,­˝ŒďgCŕpßÉůöćNľ4^.!Tü\at‘Î;¸ŰD@N­#%vŔ,Š/윥ś×%cŠÄrŁŮ!´&,5§œ;˛Źń.W*Řôhŕ] ňHYóÇó§˙Rsé endstream endobj 270 0 obj << /Type /Page /Parent 756 0 R /Resources 273 0 R /Contents 274 0 R /Annots [ 271 0 R 272 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 271 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 167 512 184 526 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 272 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 188 366 205 380 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 273 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 274 0 obj << /Length 3369 /Filter /FlateDecode >> stream H‰¤WM“ŰĆ­\ů+ćŕĂ ľ„đE°O‘źv%ŤDVĺ ç0†K¨H€Ŕ]űoDúů›yÝ=ř šRœJmŐĚLOwż~ýćívńfťT¨śűEúyžŤî1ü Ž#ľNV~ĹšÚžoŢu+Ut<-P]ąxóó&TOÝsƒ‹ĺđř˛ř¨7Ţ2ŒýL˙îEęڜű ˡͼ8ź7Ľň–Q ˙ęa>z4ĽˇŢ2Ĺoť7EU{ËÜĎő“Ň'őóĽ*eÄŇĘkń†ič-šşTeŐWM­źl˙śxÜ.BUŠE–ůŤ<†#ĄF‰JâÄϒDá¤ëHľvą_źÝ~#qćçI”‘˙ä[˜“›8řŽ9{Ë ‡ƒ‡XĽ[/Á˙ § ü˜Nƒţ÷r¨7?šˆ'~ [ŰiŤbĄ˙äm?ÍňłĺňYš°Q÷D–UDQVaěűaî§"YN´Ą(ښĂý@A˘0GŃlFáť|]ç^…ÁťY –ę/äTDŸ˛lčÇţJ)őރFc´ó‘yşłőÖ.ҕáˇ#ÜŘHĘ;°†ź[™W˛ !‹Ś -•˛œĆS–Óń8Šg v=v6mŠŢżSoYž¤’ĆD˙˛™ˆŹŇź¸Ô8$şëíIuÍ^ŔéÓZ˘<ƒˇEśĚśHÉátŤ•#ŰTĎ=~î‡ĚˇhG?bńƒY–™ŕÜTu/L€*ŕă’ZÍ Ę T‘b‘1h/ęh+ŻoŮ˙5ůß]ÎçĆŠ›łŠČŽě`x˝ě:0Ú0mĎ´ĘťĂ;85˜)Şc…(Ěľ‚ť!Javؘ„˘–ÝÁ\ÖRŒwî°(ˆłéŤÝŃJą“]r Ćńŧ ˇƒœEŠ“¤´z‰ŮUůź’٧ –ýÍeéŒNŘ,Ćöšˆ‹j_pf?¤ś=v 펼ZĽD:D(jš<㦌ď)éŇI^Aœ…hN'ˆÂŽŞÝFÍ~7Č4x¨Ӏ QNk+]9Őĺ-šIšĘ†~Ů°ŽNY¤_MËŐ8I§XŁnŠléPü>œ şŐOs’aÎIf°Ž‚ŚŕÁNÉ`Ëó-?ŤBƎGy/ďXˆ]çÝč^ pŠĚQIýDVsüĐËŔ1ś.¨MĹÚv7œBĜÍ-dŁ…L,üŽDé?Š0$ŮR1Bš°%‹EuvÄ̚ËȐg—˛¸‘ĹNqDČÓ]×mÎ6j˘ľP[h$ʁ$ŸÁCş,t#’DP~5ćÁM° ‰ťˆaE‰˛Źę‚śRśn.2|ŰŚgMK…• Œ„R2mÎÎiËĽy1ŹQÉák€ß)…˛…ąśÉœ[Ui륊;ÍJžÉO8Wš†ÎŠF‹ă â÷äĎTÄÚGýhŠƒšőa˛ŔBL4äÉźé#ÝÔBĂEśo.´ >ȋćxá:'A›ĄƒÎ˜{ę‡S­ Ľ‚‹•=ĹJ/ łćÉň# /ŕJŢj/֖2âşÍřUe¸qhô%cČAĘ×S}ńô˘0¨á#q=d6OƒÖćßÚľĘgŁÎ'Ăĺ gäL„PڄWş-A˛XJ­,wĎł“}ĽŸÝQ ds:ƒÓ?PJG5SbXĄ4N1¸˜ŻŢ+Ü<Îĺë2Čnž"V89™v"ĽLŐ+7{‘…vPŘŇI#[Ţ*¨;ŞZůátMÖł†ˆCýÚüÓżĄ xv›€ÂŢó•FşŁ8xĘĄ°j<˜ŠGŇ1ÜŠK‡Ť“˛{RčšnJĆľ$8˙ďÓéŠÁ­ÜéřĄĄ#!ó›jExĆŹžn-ł˛U¤^|˘üC¤âzY^܌˘. n­7ŢmÉ]'˜¸ŚI“Žĺŕtßkű(ÉÖq›•ó ńäÄăÝQÔçvŒéĚo‡Có7ц0χoݝ7×_ˆ}űśAŰ-ąVN­ç†zĽB>ęąkOˇY—ƒjtbrżw˘Ÿž›éAń„ɠѧyş‘őœ4ůW7—‹Řygćšj¸¤RĘĺď˛9G€šĽ­ ŞÝ:sâ0{b>ëşt‡@‹=ĘŻÔZ"˜? çzůĘöÜCA—;™×ťőn ^†wŤÜ n šVgžeeą% éëAžÚŠßóŒqˇ‰›F—ĽĎîËp&+KZ7óË×=şŽÎ¨ŢC§Ţ;d…ŠíGˆIű˜ÝQžů!ië‘ęîĺĂ0XHQ7ßm@'şHW 2á÷2ŞOňp‘Ďݰ×ő*¨,‰!dĚŐâI››őÄ|őđÂA '÷cř؜V9ë8łżÚíŢâˇUš\m@f糣­I:Mă8Gx>ŃŐž? #\Săk n…Żľöą.ô]gĽFŤnnÔn[)Š‹TĚ ‘qE?Ýű!Q˜áâhkWŐS1˘ŽŤöŽa~Ôęďš*‰ŤŁ%5ř+R2ŽxďŃ]őžDďež4żá˛Ÿ'ňq;ŮťIF˘1#‘dŰGëU@úGŠWú]œŽ /qҕęśőśŸfý Ň1)ě`Ôđ˘š46w&dŮ`!öĂđu ]÷?Yř8šŕ€ÝšCŃh(‹˘ÉPßßZG˙ż+Óţ—Ëőţ!ěϤ€ć}–tψ8]áh:âpč´5{k B'›´ˆ4ČĺÔ!‘ ŐA;ôýƒşśűéÜżp:) §3!Ý`f‡˝sfŠť.-m/˝Gýśžœvt[€Ú ˇŚv­řičÖßý‡ö˛In†Ąđś“Sp‘5MRÔďš™ě{MBO2ľěTśŻŇóx)YvłjWśHŠ)â˝Úŕ¤ÁýžwáËŰ3•RH’6Hž´vTßgVńLÇۃf"׊ë2ŹĚ™Pj&ŔPţ1a‘Ĺ$űŤÔţŞl•Ő6‹:‰˛,âń—BÚYgâ*D'‚ďőK˘î9"ňÂzţ Ź€ë›Ââ[Ë­¸ÎŔöúZ=>ĺ޲–^űeý^]/ŻCmßH8MEüő:*ÚIťŽęoŠűoBërhŢ/ßpŐĆ W9O.rä󜯛˙Ą5rvW'GĺĺźZ’‰ÍZ'ňŞi‚NzžQuB”Fw)ä25ÉT¨zĺ72ćß˜çýV’đP8&Ÿąđœ Üą¤ý„RÓ{<šUɂűY5szgrĘ@pĽV\)0QŢŽç´[MŠK3Ą;Ž”ˆî_đuk?ˇń›Ĺ¨ĎĘăUyŕö`¤^ŮŻZP! ˆôä‡…ŞĄęňH W+LÔ异PoŒţy“A,O— &0a”uƒçůNˉ̇.ůňSË)–ˉ†ÔŹCCpÚĄaN )i°DžOG&~Î6ŒŰéܤ•şÍĺW/â?Ź‘ĎüďSŒFöÚÉ^K bç•-ȋŽŐ2}%QI•z@–j#Ä@o ˜]üĺůݡ•0ź†_ŹqDÔŻZAÉ-P¨Łvţ–ĽRgÇÖŁfž˘ŕˉŃ8 ´,ˇuűúšœöN…‰qüĂß__wQݏփt<‘’c/GçW°QŒ¨}HcđşPçy‚ƒ2ržŒ’#†ňwäCÚN‡ŃÜ;Ç(M†I˘CY6ŏÝđ’ó+/žH{ůţăîŢl) endstream endobj 275 0 obj << /Type /Page /Parent 756 0 R /Resources 281 0 R /Contents 282 0 R /Annots [ 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 276 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 317 648 343 662 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 277 0 obj << /Dest [ 159 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 340 349 366 363 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 278 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 354 247 403 259 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 279 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 303 189 329 203 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 280 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 311 167 337 181 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 281 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 282 0 obj << /Length 4190 /Filter /FlateDecode >> stream H‰´W͎Ű8Ć^ý<ä -bF$E‘ÚŰ$›dÁ´o“=82+ă–IN#űBűš[EŠ”l‹N°I€6ĽŹßŻŞ¨×›ŐŤÍ†F6űc´,K’Á˙qYf4‚•KšiQ’Íăę՛^’ŞˇŰ2ŇWŤWż=0ňš_ÁŢ,AŐjí—OŤ?’‡tÍŐÉ÷”g”%Íö4Ôp|ӞŤĂ‡íޤkž%ďRŘ`Š[“Ž říöŰŞnŇuIËäsĘ"żë{cđ$‡łđËXÁ˛äÁTmł#owőPˇ I˙˝ů×ęífĹHMVZSY p„QĆs’‹œę<'`Šâ¤3ŤýęőćN„ŚeÎ5úžąÝ̜ƒoÚSşÖ`x§’.Íáo VeT ářňâßÁőę×1â9 kóOU­’żĽ›/ł|€mĽƒ]@sŤt\ĄfÂ1Ę# ’@?+iADÍy˛Ĺ(‰ ÷K †™óَŠŽ @U™%’ekžéŒŹÉ/čGHk•%˙TB>l?§¨Ä¤Ď   ŒsđéPWˇŹś ůdČš7;2´äŰx jŐ{xV“2śźâ%XҟLUo¤jˇŔŞYFebšY&_ĎŚŠ y I5 í], x@2ňĆŌ,pÔŞAf ~Č>]rô'ĎěčL–投 ܀­zýŠČśƒ,Bj0AyrNá@‘<XoŽV§śŢó¤Bt2 j fˇ!íŢş˝oÇöŠnœňŐF­đŇLW›ţÎ4Fš5ŽţZ“YFFkĎr>˛ŁQ†KtáÝΤ… *mő`ŽöߥM¤6'çĘn9|ŔFĄ’펺J Ĺ\ŐóbšĄԉ´šĘ6NsĘ(!ž}Ýőƒ#Í-­l\“Á iŁóX7mGž™ŽG+šóă'ÓůpąĚšRR&Ś€)wNÔÍž}9,lÁRnťŤ@äNdw3zýXďvG3Rá<Γá‚(ŢżyéŮăă!ď96ďňÚő2(ó<ęn7*,BlöÄ4㍪ݧđŃ ……É˙˛˛Ńi3 xĆ2&Ž‚†uĽ’÷)öÉ-ôba…Ţ„NĚd¸~ťž7ÜşAë@„ʄä ›ŤôVěxQ`>v&ŘIĐżIűŠof0Óëô+šßqä=ÄJ„%Ç7¸şt  \ܟÎr> ˆůHzđŢDTcćśWKŚ &2Ј,ĄřeĄü8zŠ”a{Íąd_CkR8ŤĽŔ‘Ĺ壴as~‰ŠK”_˘ě͜†JŠ­íămĎ Š‰Ô’ćĽÖöŠk‘ËыäcjŹ#¸ˇH%l%ŁcRC}Ŕ(œVጥ\‚M3ڈ}ł řźĚďá’ńçP4đ3ŰÁyA%̋˜Î¤đďů„Ău)— ¤cDŕJÝÁ\8J}GƒŔŢ*âQĐ ¸ź—JŢÓ ĄI2—¸÷pŕdwň ʂŠ"Q*¸PßÇ5Lޏ9\Iń‚“‹’ĘâFsßÓ ĄMňxr ľ•ßÇĄ„â $‡Q^ި€áS9)ĘKsœÂWĹÁ•—ń‰ˆ<Đ(‚,ăS #xHŔ2>Ĺg˝ůA?—‚–kUÁäx“űšş™|ŻżĂmUâ§ţ€ÄëŮ Ÿdr?.4i-ᒇâ˙x&/fšťůîáÂɓÖ=ꇎ¨g|ě:ʜQŻ„đ-q”؎˰ÜŔœé"ŒŠ˙ó”P0E™ŽÓ6†{ÚFđ@ŰîiĂ=m#x m ÷´ŕ!Cü/ä§Ŕü蟕ŸęD”ń)=âĐŘ ą<…#ž$(šĚ™čyOČy?ebţîDÎűÓČľ|>L˜čyĎžČy?_fç—ÇK<˙ž3ö^—et–Ú[tž¸t––tô[tŇt°[tŽ[ôůCEH(&ž?TÄs†ŠPŁ >iÄ}.žDńĐBŽâë4§E_7œ2řşŹŔď|zßîĚŃÂoR_=;Cîmß~I׊ćţyás(/hÁ€xč’Ĺ7`¸ Ľâžßƒ„1ýSG—ŕTóVLpFó/ÔĐÜöŘżÓd— ˜ŕeĄ O b]8˘ ŔžKG„j_V0ÁË B+đ #˘ ŔžĎGszNDA€# ü ˆzÚÖ˛‚ ^V&E\ď|Ž(đŁdŽ`y–,+˜ŕe?Â/{0:€ť8ű56H]`ƒÄ’ îdڧţŤ]ƒüľţ|îL ­šďšaËSIF ůđđ*-ŕ-O3lďv2Í`_×é:‡‰ËďéšAă`Ź7íš:|ŘîĆÇÎô'wŽmzsÝÚ€yáMÇ%ËrŠöć%˝°—ź0-ŞŐ|nt-J™%żÄ+í‰ůf:Ňę˜ŃKNfG>ëď)+Ą“čßЉüsł= uՓøm› řű͐ţ셜ÚnAĂ<€WÉ;ř>“ťt0D¤ŢĂ{5Óa%ĐĹ)“Ře*¸Ąœ!^_ĎŚłB”"ČÁŚu ŤƒI×ę Œcɟäé`ŔšÎĄ[Ě'§śK`Œ2`Ŕ—äsŠrČÎ|ƒlÉpF\Ośc ŻĘÇŔš˝ůűh,ĆňKc_’Ţ4;˛oĎy0ƒłâwÓˇÇóPˇ ¤łjˇ $dߏí“Ë š1ęŔ'°aŘçk"č´† Ó^ŕK;ČÖcd5›"ËÂAvIâţ˝xŤńo–={]:Ó2Ť‰OštФ/5}äŘś’í`šŇ›ŞmźçžlÂ,Cé: ¸ĐĆĆ麂ąţ)ĽŮ!î„Ń=)3.ź…š˝ĺWăÂZř)u‚?›őOm~†‡Ő­×¨\ŁbVö36ޞ‡Ą`Ř{ĹŁ@]o7‚œőˇpœői\—MqÄȞ(?ěÓxĽˆ+œ˛‡’ÁMű$ŢÂtĐwü¸O1řq ď[˝ÁÍű$ƒ›÷i\—J‹:řŸdp˙ŢUíĆ7ř‰Ÿbđ?‰Ă˘e§ś"¸‘Ÿdp#˙[ˆŕGzŠŕ9<ÝNR‰p˘ÝÓ͐œVÎái#fń¤˛xŇ9<-aO ĂÓüäđő‘(Łçş.űöŞě:x)œ‡ę6Ęš;W\=­ńLóžZतťť”U R\ČŢEv3aŐĽśŁě’-$ÇEâ_ź>UŮwI€@÷˘_ç~b‰-wč`,SR˝Ś;HPńJI˛]IÜľ+…űv%q׎$îڕÂ}ť’¸kW e"đŠÂ"5ĄH˙w}PˇdVnН=‚ÖÔY÷Ľźű& ­Îş+Éŕܕfˆ]gđîšÁú„`pîHç!vÁŕ܏^Cěľ<ƒwˇ †ĐƒsŻC“łŸ­~đýRŠzc?xRëžV2‹'uĘâIrxšă,žd0‡§ůÉá—Ű&˘Ť›ËýGžČ€žéPś H˜wýuր@ÚŚŢ2 ň‰Ëľ­˘Ş×őŸF›ş“ýJáž_ <ô+…ű~Ľp߯ú•Â}żx¨ż FkTż–˙4ľŃ6Ňžá?CđŸČ@ůĹŕý‡dˆ]gţC3„>!ź˙yˆD0x˙!×{-Ďü‡fÝH0x˙IňţłŃś_ä3ű™ŔC­óxŹ$‡:x¨B9&đÁ<ó“Ç/÷ŐĂEżŕüS_ŕ?ŕ=Ľę5|ŸŽJ•ĐŁp8zá,čýé0°ëÇBĘRńĽĐ|(𩱯ü]є’pď{ąƒá…¨ĘšOEĹ&wĆŻÔ×"##UŇ6Yť"Ÿ¸\ •‚ÜëćUýJ5eşw^߈+賆޸ŃS‡oč)ą‚ˆç#˝(˝Ľ"œˆŕő˜Œv1!âůAŻé^¨'"x='딄Šp"‚×{ň‚"žü€ŽŕՌŠp"‚÷‹4BŢ/ˆĎGx_‹´ HšýľÔ˘”=R@ă7]ëώÜ;‰Š÷nüţ0 t/¨éN؅\”Œ}řô (^ËeQ• g‡ýĄâőü˝Ń^PʙMđb " ‚(ů|:Ú÷çÁŠü…÷KĂKQŠRŐx(5­şWf×#ěi ×x…+cŒóršĆ›ý+j¸Ď§eřőLďJ§4ŤäҨŸť2<ěĎ#ťŸ†]ąë`•Şô >ƒ°"aĺüšVNˆ"“(hG6Š7&öůôi‡á7żý°?ĚoŮr;°oă4/ Q~ížy,†ŔÇ …ťn ćĽűÓ´ űč??ЌĚbwë ÖP křâxjËÓ"pwţ"¨×~fP ßfEšOă5pG6CÁ@0ůÍ2žŽŹ-á‘ŇĽĆ0 Ľëtźőté|Ö\BLŽE´RWžC˛ÎĄk~ßßďŻÇťq‚öţ\ž˛…}˝aöi`ívŐ`ËđÇŘçß=~TÏČů8ŘÓTߞîŚ ö[MĐSU‡¨ÚF~9ŽHßMř˜rkŮaš—ů7[8ŒË<ÍĐfýS°†q6+¸99Úăźě {ŁÚ2î •Oˇ endstream endobj 283 0 obj << /Type /Page /Parent 756 0 R /Resources 292 0 R /Contents 293 0 R /Annots [ 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 284 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 374 693 422 705 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 285 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 371 654 420 666 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 286 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 299 546 325 560 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 287 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 377 483 421 495 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 288 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 377 465 421 477 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 289 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 377 445 421 457 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 290 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 155 304 181 318 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 291 0 obj << /Dest [ 159 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 449 254 476 268 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 292 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 293 0 obj << /Length 5691 /Filter /FlateDecode >> stream H‰´Wے۸­źę+đ°dʂ‰;˜<šSľWʎud‰3Ł­ą4‘4ńúGü ů͐(ÉhZ•xjŞF”Đ tŸîÓ|ą˜=_,$lq3‚ˇmËüĹÇśáR’9mxăUËŸfĎ_ [úe ;ŹfĎ~/Řía†ľMCŤŮ<=~žýZ˝ŻçBq_}ŠeĂEľ]>7ŘžŘ=ŽîŢ-׏žËŚz[c Ŕ:,9vőÜâsł\mśőźĺmu[‹ąŸ7ëá—.ě”Ř‹O!ŹhŞ÷Ýjˇ]ł×ëÍqłŰ˛úŸ‹żÍ^/f‚mŘĚ{nZ…‹.¤fZiîľf8Š“lßÍnf/PžˇZúp˙p7цk6Ă_îęšÇápCěŞöľĆ˙ NŐp~źŤĂ˙ăp¨çobÄ5WđľxL­fŐęĹo'ůŔŮÚŞ{§ń)xf2D™…Ăü‹–[1xÖŐ2DŃV}¸Ÿ… …0Ky˛bĹăP×6•ÍÖß°9űK¸” ÷ŽŠţُaŒ˝[ŢÖÁIWŤ°Oůća#ši$`ÜM4Ăĺ|ˆŻěc…kšjŒcóÚşm8ɤ2ńć8¸Ó–ťęĹćČ\ ‚QáDáŤ=˙júŻyą>GŐ9*ĎQqŽ6Ăm%HŃúţěń1œ˝ąĆ3×XT ŽΞI‚óže6]8;$eaœ2aq¸˜ń(Dz|ĘDöšKiŕĂsŰ8ևö$Ŕ×୞ ˇvÄuĂ[áNWHišń’´ ĽC §pĎ9â¨ĆF{°dGÂpç&p>ˇ~ƒťŒ˘Ł „äŇLă­3SŒć´ŕNMá†k#&ň Z˕ĽŁ ZNăżÓwĐčxĄ~) ZľÜŘ ‡–^Oyđ‚+IGA{ԖžĆQB´#¨# |Ë Áň 9üe1xŚr‰Hŕ™FžIPĆÇxN@ăSĆżŰύâ­G­Ú}Gz‘űšűyT˛_jÇMPţđ‹Q(sDŽâ›h>>‚]\Ł,lk¸9ľ~*Í0§ „ýęaůqsż9USƒTcœř¸9ꠒ8íWĎ؇ęÍW=ÖAÇçP?gYÉy˜@\%ԇşĐ‘Í …Dˆ[{DjĹy'¤Ĺ†a¤ń&KˏUŰBuŸÓŹĎYNÁ‘äœ8NÁ‘âNŔ‰ŕůMŔ)3|}ZźEyx˙Tiń-×MKŠyÂŃ˙Ź*Š5e!‰ő‰gŠbLZˆbL[Čů',$ą°(BYˆbJÇ!łˆ˛Œ>C&a!‰á„…ÄEĘBť3 ś¤VS|ř5ó-ŠV$žs]ĆÇLx΁ç,”ń1Ćž#XĆÇř”ńëŐĘlmÝőj%ŻQŤFĄŘ`Ë:ÄáÄź Öńnt+ŘĆ+ÔFô{Ósřűś/Ř”$‡^q}oĂ4íE#žňmĆ:ź’ RvĘh"kÍT-ى¨e4Ń´ˆf’–ŃDŃ"šÓRDŻO‰u“€~*šAĆĽ Őf€'ÄŚź?kMŢOI ą?) ľĚyqÖrfEyRęţ#oĘű“ĆPţGf÷g…!÷gî•÷'}9Ů_–:˙===!.œ’[†sî8Ľ†€SäËp,§¸•á–2|˝¨H u˝¨¨Ť^,oűťÇ8ţžšŻM|:{˙‘óâKOčD™*E˘\ßě Ý쩚ŇŁľ‹^<Âēt1Lŕ}łŒřDˇ,`„Ër7Pí”paÂAjˇ¤ƒ\łe#\vű1í U=á ă԰ÉäžA8Č0á utňšó”ŒpŮAnů´ƒÔť&$M8uP…˛ƒ.;ř~ŢŔ˙0řŚgŠB#heĽšRJ¤'rűC— =kßŐ˘ MÍE m%9cďŢ?G•ʁüŁ[ŽŮËZ4„eč†=t?|‡îŔö5ř_u5<řęđ°ŰćÝeO?ŁŤĹ3‡GŃhŽj ÷`xyrN—F#z× ýľŇ–˙us8îö›ŐňžmwÇîOçÍ/ôdwh˙Ăîđ‚ÂŘߡěaßÍCוćéôŁ{- 'güýÜ šęŮu>c.śŘ=B*ŽŤU ˘Twď–ëĂ3vźŰŘż;čˆĂŻ_jŃ‘ KŤř[ׯ?>îˇÝë;öz-ÝĆPĎVŮB>¸0ý9ĂőN˛Ó˙Ëî¸Ům٧eÖ ëyź IŐfˆ_×˝ţöx8~ęśGvÓ/ U˙˙OTťaűmś¨q@N °Ý°s¸ČęaƗ¨ą˝÷/ľĘ" 2.îƒĂĺ¤bş\ç\ŽŔű<$qŮžÜ˙dĚ3†ěcŒ[Šňä š~ł|ź?ţ™ŽË}8^=ŞM=ŰŰş_š<˛ÇĹűC˘â2$ŻKlϧôů”~8ĺŕÔN%F—xJNθݹ{ϰęv(§nĎp;üŚŞÇX`ÇĺÇűŽ-ˇkö'qaçÍć÷¸-˜Ză”ý–.Ě#=B!k^\ř'Ě@‘ÇžXjšXšžXŞž3ü˛[w÷ěí+~Yhţtë7q`ě}׹CöUODôH.‡|#”ű.Śkßz^Ř =ń˝ `ÇpáťŰÝ%1Ü3áŹNZ`ęRĎAłPŽŤP‚ěS›Ţ1ŽÄâí†ďu˜œŞWľÄ„ČÉ<żŕîžç ăpd‡ÍíĐQˇuřżšA'#ĂňÝÍx¸L‹˜ţІšÚ!Ť¸&f39\Ӄ'˜&Ń–÷-(žš°‰ş`žVwNoßFöťănľťç첅†nLŞTšFbÓY4”CfbćŕĹi‹f˙—rř* žÚóŻŚ˙šësTŁňçh3\cbňŐ/0GZB?~ČřŤ[¨:5ßNáažĽqĂ­qÝđVç_ĘBpiÜóFޏóBq&-Ä —Äşië'<¤—˛FÜ)źufĘCœqI qĆĽqĂľyHC.i!šS¸oÜÄҔKYHS.‰ăĐŇë)qĚ%-Ä1w G ŃŇKř>–”×yŠ–ţ˛Ůż#ƒ-JR8|ÍÎuP&n­ŐAĺtPAW$v'B(ąfń˛.Š%ś¨m슗ӦQČS-¨śłÖUý¤"ŽÖ2Ťů^ş€[îń ÜËě âË7G7sÎxđÜÍzĎxˆř˛‡ŔíźĎœ‡€3<÷łyŹĂy8ăÁk{†Ŕ[Œ‡ˆ/{ÚÁ{đĚÇy8ăÁkËŠ‡emaRRq Ía -iRÜăŽC×ěÄ+SŠśł{›mßíH”˛äÖn8›ŃßaŃüľAĘ\śźuœ×nţćŻQŸç ĎJvhœQlş;>Ü6ƒx•QÉüźű×ÖžŇwŤkź  üęŽDÓ$›ĂÔnÇ9 †N‚żŰm3ŠO ÄxżÇöčxdŮîlw!ýŇím>9­¤ő܎>´‹š˘úžéśÍkŘ"…ýÝdÝVÉ&Uř;4.~[ ´š?vb{߸[űáßâŽjŰ:P1¨¤›Îžlą´ yĂoŮ$f“ţŁ&”Nš'{çual]P\pxˇ¨OĽ;čůë°1 MT>ەMś˘e‚Ě}ö§Ę“‡śkťÔÜŔ°i|{ťUz¤cJš@8ÚyYgýľÎ9Ú kܧ ÓÓ$üÖgc#ýÝâ˙n›s˝ł/gQpm°:íl [§ÂÄhP+o¨ö7öqÂF)äö•Ć­[‚~nmőšäąŞć8#IßIGzéSň2ŘçgyvCąôŽ<`W9“ôĹ=uÖÂôZôĂ´ó(vk睔‡NĘݑą™~xŘ8—ŁĽ’Ă0—OFĂ0Šôşibٟ2>SŽË"ŽN˜đţœ ÇÇLxFŁOś&6ŽÎtúg´Ľ\&[Wj–ݐ'ŁÓŰ#>ţW–„+ę’ńŘN›Ű}#vÍőŐ.4.9î'›˛-ĽĐ4ďhImbn:ŽřtßtgMś,šĐzŠŁŸDž'@GY™)ťŮ­­ŔŹh“8 ĆG (­K^e…ŸjQ{t8ŤvgľęxÝ -bţŰńˆ˝¤şŚąĚmĹĄQěIŻR›ĺÁ!.(:i?ݟj& >ŐŇD1Aśćp¤9уíôĘŕŢAĄ¨Gc;Eíş•ZňÎ~n‰ŤÄ­!@ˆé“[łwŕÇůčžW"ťô֚ŁŽ Ü>D‚T¸˝ęüŤ2¸!YVn‚ŢڔÉ(ÔfŽŮ]‹CĄülLĚ )lř¨3Ŕ÷ś2¨ĘňżŮBNžŚűš´­Žnƒ•RP7*x÷˛v˜ľi^ŃďŽŰƉKv"~OĺÍţhc‰{šŢm™:Ü>ĚkčM(ňíţ¸Ăq,ď¨ůť=óůižL.$Ł—ńž˙䆉NlFńßo˙óŇyGźŚq‡­ívÎz$ÄĎáMýđ‡Ţ€îűýîŃ~갟ڶձCsˇ4Žě6ÓfýxxŤhâSvú›éîŠŃ´ˇcęŠúD!<'QŤ˘ĄˇĐ€Ż*×(z-Î_sű›sTŸŁę•çhćÎŹhŞŽěŢçGÚ{Vŕ>(kĚN53¸ú&Ök)ËyúDý伜¤KÇĘI%ţžŹÇżßüEVDó9<ŕ_ůäđ¸6ŕ|]6âĺŮ-I)(‘ů˝RŕŤě\­3`Cגsóâgáü{ŔeÉĂ%şŹŽxó­”köôšĆîü"\—ůóšYgR˛ż\ę 0îdšäcŻkş=°§×h—ŹşWYÉďŢhTš1Ü×yÁĂŘŻŞĚó•\kŞŢTh!sFŤ°Ös…šĄ.šŸ?ÇŚAĂ×3ŒZ¨ý2ŠvŽEˇ ‡˘Y†CŇᘴe8}ŽaY„ßŢ<ĂÔš^×őcöBe{˘.#QĎűöKZŇřÚŘ`P<šh0Šĺłőů<‚f§vÄ!¤ÎjoŢ<vŽSD ŠĽhxj1—`’ÜŰÄon˘¤éĄŔ\dHŔěŐv€<ÚU“ý;ŚýBKŒ# |+c逺kY?"łŕ<Œ—DŁÔtŚ(%ŽŞľäkœĂ}‘3x¨r÷eÎážÎ<:‡űJgđ%˙Ž$)JR’ôgç'ˇqb…{ĆA…^–fĆBĐćhĄĚ—Ő—łŕ嗵Ť`ŮBPXŢB¨ƂQ6ą’ ^'Ů=ÄZ[ś¤ˇŞ‘ąŕŐîÔBą¨XęÁՋyڟ<äz™dđ'YXĆcŒƒŢýQčQf˜ř1ŽŐŐÚäčŻĺŮÚÇ<ă¸ÍPڕó–żoÇŠÚíf/ş~jޜ“#•Žű5čPÜܡŁřýŘ Řu‰mI)”‰Ŕ×ńx8ôĂÔěDß! ¸Çčwâc3Œmߍ¬ýńBŽJt”óqrŠĎçű-ϧ°W0ocÚe ÷!™%{§ęvboôπ+’NDŸŽ*äăνŮ}Ź”YCş( yŒ‘ 1 w˝•4ţDEŇmSťĹMÜŢ_mv#*Ăú˙™<(*Ešě_ă˛7tżSFl†F|Hé÷t3̐ýͰIWLWô>5ˆßԋۆr!6űýS¨‚(Hö(M4ŠňAa Ť‚ťRBq endstream endobj 294 0 obj << /Type /Page /Parent 756 0 R /Resources 296 0 R /Contents 297 0 R /Annots [ 295 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 295 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 309 496 335 510 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 296 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 297 0 obj << /Length 4628 /Filter /FlateDecode >> stream H‰´WMŰFĹ^ö _чČŔ˘Ů_dóg“`XĂđ萅ąDÍ0˜'$ľąóCüöoîŤn˛)şé1°Ć#’]U]őŞ^óÍfőzłŒłÍaĹyVUËń7^Vy–K)XŠt–YąÍăęő˝fťŢž–ł~ˇzýË gwý ďć9 íVëéňŐ‡ä&]s™™äS*ňŒ'ÇíÓĐ`ůŚ=íîßm÷,]‹<ů{ŠwŚôĘP§ëżÝaťkŽéşĘŞä.ĺą_NÍŢ=ŠiĽŔZür^đ<šŠwíqĎ~Ú7CÓYúďÍ?V?mVœ5leLŚ+‰đŒ ŔT™QŠ!ŇR°Ž^Vo6 &Ť”0´ÚŻh›šŰŕíSş6;ÄŞ¤Kţ7ˆ*Ď$NďSú?¸ ^˙4éBëďŰÓ\Cýř4°Ëo\”om”ě]Wš#'Řď§şĂu9­LX{|Ŕ$Ď?ąűj#e6ž;Z€dF´ÉƎŠŘí?S*=O~kťkśńsşýő9Ýô™YˇÇőźÉ„ŠWl‹ţj,\‹"+9e†Ť93ÚgF_dŮ7{$‚Ră hˇ‹}ş:˛ĄeˇőXá)ĽK†ž“1Ü7ý˜žrĘŐwőpęŽ=;śÇő\7Ž)şɟÔ–™ĽÄ~;lÁ‹ŽÝ6CϤţ,TćśV™ •Fř\Ůü&ßĺ%sfŚ”Šł”é9eăîßטp3hĘéä6]Só`ĘiD㔸9(@€&ŮTňy0uVqĺýđi€ą.1ŠFÓvvĄ?;wźŔ‹BăÓӞŠ`Ÿ3÷ŘÝ^RěyĄ b‡ŞTEicŸŰ…]ÎRx^ŽÇ8 čRښĐĆ´Ál†źĚW^˝ zLhř99V“žœŠĘKđJ-á:+ŠWyVńňü A§1 b„Ŕϗp“ĺbĆqÉ奇‰´yŒX^– x ŻĚ‚‰nŐ2ž‰žzŻJ˝äBžsˇź”K¸Î”ć uU‘É"žY•8¤.ă&/ö pĚŁCK̂’ĹŽ …QK ϤˆgAô–ZĆŃBqZHœ˨/ás;aÔW.2őź°'ržY†=…°Żž‹†}ćƒđœ— üfó…1ŽeVjQ¸Q4ĺŚ1^Îc|Ôę7ŸRŇ|ĺĐ,˛grŻ=š/1^0¨?‰8šW×G›i‚2ŃQj¨!Ź8kŃ{ š*“dęţHęÎé0Bw5é—}k°˙űSXČĎ Čő$F H•K§źUϓ{ă2K’Rv¤}KE)ń}CîÇRăóî’ă1|"y÷,áÍcřÄóî‰Ă'ŚGp_Ľţ5’T#á‹ô˙ŽO<™ŕˆ˛Š>â‚… +vĂWěŮBŠĂŠł0)rÔÂ̂°ݏq ž' “˘Fó03)baRĚh 3×Âź"Ć-x6F,LŠwnĄJÖ_ôŸŸKVö•ÂsðŻQöÂsvðO]žó„_.Y˜Č+ńrÉ_%Y0oxĹ˝d‰Y˛Ä,YÜJ–$ÉRöóÍţXÉŇN˛ IN…N˛Ě(YôÖ`˙÷ƒ„ëĎ&8M†ĎRPľ˘oź|"꼨Šo*[ÎYTśbřDôî™Ă'ŞÇđ‰ëܓ=†OlŕžLü+Ф¨Hć[ɖ.2”!ŞZ^­đzŻY~}L˛"ë'Ŋ­Ÿë\ďő*şŢó#ź~RŤŘţgţ„×OZó?ó+¸Ţ+Ut˝ç_xý¤SgëĂ2Ż˙DŐ¨ xVŘ+đźj×ŕYIŽÁł|_çÉźĎ2už§á |š&)™ĺ"7/×$ůUšó…ČKŻIł$9ăŒÝŕ3¨˛šÄ&•N“J§I’4I@‘DƒIx=2VJŤGEÂĘĎypJ MKbÁ_>ĺPAnöJzŞĘŻŞ<茇­°€ŰQ9â ł2Ŕ ‡řY:;ˆ ӈGLĂ6ęŔ÷mŘÁ ‡řiw0ő~ā‡#Śq­ŸŽ8˜ćyt~…Ěp؁řqÓ‹8đpÄÁ¤ç’v0Ăa_Â/gƒ Ŕí0˜Ž…h.™Fo´Ĺ4đřó÷sswęj:_sĚŇ5Oa˘JtĆŘť›×d<)›ń•ŽŮş7Ňľ¤áđ6ĺż'źôx‹Ixsrřá`7Y—˘'0PáŐ$ýSëđ#ôőóŃMńÜVč’ç*Sş[U™T(űĺXűR1N6ăL`ĸŠf5cţćČí7GňžŢîŮűşoNCÓűěr.br—nš[dĺgş˘ŽY_ďh5†ŻĘ$rľšozöűŠîđ…RbˇŸ°g™ ZĂŠ;öl¸ŻŮŻ Xžl{ö/ˇíľu†OŽg‡Â;ż‘vmŰí›ăv¨‘I,Ţ@†ŠÄď€5GöĂ­˝­ŮéŘ ={B!›‡‡Ć*Ńc=ԝ ’O×EŚ`qzĺ0ř)ĺŠWíBl.žÍ÷cLÚǤ]L´ŸŽF-(!v~:î­Ý294ÇzOVHšëăŐŽ~ŘĄíl"Ű~`}s‡iĐ`M/4xQĐrČ.îvŰăM^ą?î›Ý=š¸ŒHúˆ¤‹čΒěDÖd˛ĽXtŇĽdŚjw_ďŮвۚńĚónáHA•9‡7EĽü‘Ä̜óAy+í˙M3°ˇBK‰4ÓmqyŤí­Y]˘ň—(żDsˇ…Ă€’¤óßň( ¤†@DĽ~&ĽÂx\xXĺYŃç€ČúI磰Á!Óʆfđ[?Ş| .óLU&n~ůČúIăŕŞÔ ćG‰­> ëLiĎý$đąőŁž/Ŕ&/ăŃOňY?Š{ FźÂ¨óُÇ֏ڞŁU˘Ö'ĺŽ,˙<7 şc>5óœôaؓ6Ϥ Þ4aŘ=ĎE Ă>éAxNK~ńÇŁ83čŻůxä/ůx”0Ŕé‚O>=™÷ăôCŇ@Ċ„Î;eŇŇ寧´Hž  ř×"kúůy==ĹL âŠ˙öŞéqۢˇú+x”‹ľkJ–%5çíĄ@äĐ"šČ˝VaKŽ>vŰüčßí~Iś5^Ř"ŔFć3ÙÇ÷Čě˛$̄ťßƒ+šĆ*\‘ő+S?ö—Č8ĺě¨ŒÝ#•ł;¨rv‡UĆîÁĘŮZťď c˙ŠÖPCéögőÚýÁM/ş~>xńľöë'ŢĐÁi^_OŹĄÇŒ'ĄŹ‡ÓźJňԘąű NۇúLŰďŠ(đŠYÉűE*şç‘f‹4ƒD蓌W/ž‘~ťűD4 âR…ÖIrcĆý,—¤(ë*~ýWR”.‘\]5ĚŰy ‡,ŕoŘ5AZű ‚d2đv&‚'Đ!G \gç"8‚e#řcÉDđv&‚'`>‚;Ř\gç"8‚fűੁ‹ŕě\Gŕě<š0ź‰ŕ žŕ艋ŕě\'ăÓŔDđv&ÂKös*l@RsűWˆœ.×"Zc3qœ9Š”Ą§Hú$>{[>öšIŹAÎĽšhŻBźűđ=X. ™\„xŻňBźŸIćŔÎoëCoćwem>ŞV43P)Ś Ě:hOue,­ş$_¤ Fw™Ó§\Žô-Úš>Tî_űÓńx^ŤŐb-GľÂŐĚfH_şVˆĽƒG×íĹůG[_t—řWĽÝi˘@ÇžlpźĎ|đĚßčĐő‚nZ…5¨ƒ­ČǔxÇ\*’ˢű--í–6uˇ9Tó/¸ĘŮĂM˝¸ÚŕœČîRiQˆBb1NÁYÁtrT‡l¸’ş}ĐMqľ ŢÎčţ¸DĆ bf(.@ŕv‰öKM-4ZS˙3˝O2ŰšOfňĄ7Ł˘6svÊŹĚp:ׄĆÜ.Ç.eđHíȂ^‡?šÉU÷0,|2ţÎŁ´˜.ë2Jˇ7Yńc4׎ş1˝’•.(´ó’ąŽqśą ĂIHąŽtkBüEىvĐ#ô=Aˇ{Iľ+ÍLŞ!ý.&ş/Vş‹áůÁ˜œp)í•n$ńĽn>šk“÷ÎűĎ$‡:Ib÷išß(3Ţ(šp<€‰Â0zd˜"3ş˛ŐžˆÝÁÔň$Ř֏łl[~1ĂZÎaräEQBÇ+ěť=Šm‰˙uů–CĂ>ÁĎńH”Ó*(@ľľ^Äóž´ß{ńœˇ˘oá}¤G†ËÓ¨äŃgŮÚ6‰˘)ŸTӊŽ ŇŞ+w$˝Ł…@˜Ý†šoúŽŤ+q,ˇjaß(żă8UkšMŐÓZniUK:"ç‡CýLyéć˘%~‰›ŠYySPú­Í˜L͌î⚍ä^S/ŇJ|Z‰IŤŰçŘcŢFŠĘ¤)ŮÍęH’Eی2$Ś‘ćŐˆŁ­ňJ—ŽUZňwd ő2. U‹L‘Ű”;5ůRFÜ]úŸ‚Ęť^ = ŐŽRąkŘ0htŻířL[Ó5èŇ(bĄ=˜-ŃƋ˛Ĺśť˛ęUńyö úöÁy˘–<Őĺe-˝.8>ĽÂőtjt^ UÚQâw(WU‹C]=âKo'ÓéK,ˇó¨čŇT% J-T2řBSÁ˝Ś,ŘWúę¤Ě&îœ;űűá%„’ö˜óœ8ĺwçšpŐ3G¤r°}ĆÉŢş”{hrOőŃNtĘĘSBJ”@„@ŚÂĚčEnşaÖŁ AeP]nE÷\ŰÖYú–Rüříüćr˘ endstream endobj 298 0 obj << /Type /Page /Parent 756 0 R /Resources 303 0 R /Contents 304 0 R /Annots [ 299 0 R 300 0 R 301 0 R 302 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 299 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 323 660 340 674 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 300 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 362 660 421 674 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 301 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 332 523 349 537 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 302 0 obj << /Dest [ 497 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 329 361 355 375 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 303 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 304 0 obj << /Length 2940 /Filter /FlateDecode >> stream H‰”WɎăČ…o†ž"uHÚ%wQ3đĄ×q۰§Ń%`]>PdŞEˇHj¸TľýCţMżˆH’ZŞz0(@E23c/_ow›M |ľŮ-|ß]Ż×Ęß}\{ކZEąëĽáZmŞĹݛ.VyÇŰ<Ő勻Ÿî}őĽ[`ŻçAPžXŽO‹ĎúŢYúĄ›ę˙8çúşÎŽ}‰ă›fČ÷łB9ËŔÓěÁ˘C[ză,üowY^ÖÎríŽőǧ%őÓPňĹĐÉgńß÷ßÓ÷&oęB˝+ĘžljĺükóˇĹťÍÂWĽZ¤ŠŻC8âť~Š(ŒÜ4Š,]Ş5‹Ýâőć;Sw)ůOžůkrÓß4Gg™Â8xˆSşu"ü–°ĘsC2œ>îúíŨť÷6â‘B×ć-‰ĘúÎćß'ů€mkY–€FŹÔ>‘fP”E’ ß_ť ‚Hš#QÍូ Q˜ƒŕdGîÚŹŽÖžŽ}o é^ꊼzEN´”Ś+O˙/tĽÔÇě‹CJŒҹțÂl#ně/žĽżYk^Š“ ךřO~ÇâwčĆnŕ²0öô?šÂ¨Îô}YÁ˙_SçĆĆyĽZúnS,?SąÁH˝ƒÓř§2 `oȧ9â×ńŁ×ęx0ęSÖ[=h9săŔ˛XżoՍ=8*oŞ*C핝:ś˛ÇäŚŕđâąP[*sĘĎľyRŮa0p×Zӊ7›?Á`Ú7Á@Ei”(%Ľ@0É,L—ˇĺZĘZuÔń¸œă¸ÖąXQŢ;1"Wr S68ƒÍîJń˘˛j›“čŚÁÝtŠn*Ń%ŠĄnHN /Ě7Ö™ęŒ áj¨ŮőŠO[wxťčž \Óö›7>ęéŐ9ŕ(ůŤö%Ů.X:ŽZňŻö JZTă­}UżŔ% •˘ńŮRńƒŃz"gLmŚ@á65Ç2œ>5ĂĄPCgЍÁ Y˛mEŃCÔUł“źŘŠłd.béŔ$Áő ýzó.ŽÜx!ýÚgď…gŸ~ßóN?:•î'SO{ӚšĽĆĽ)„T*—2Ŕ[JŰ3¨.”Ú5‡CóÔýp˘t=ëLH'Ú4Ś'vîA“GçčN3óŢ9ú—Ç'™*­‚—?ł|`-‡őwŠ'ńĄ5ÜO Ÿ]ž”\Œ¨Uř;ľxë)%kŤEœŕ„˛Žż(ŠžmžĽiŸÎy-]žšúępP 1ń•ó˙S]eňé;@ęc‚ˇĄ˛çxO™â;ěP[ĄĆ?äňŻ|”˙TJň0ĐąDwAó *ę՛żÓ` ‘qĂňß;Ô&Ż6cýŕđŠ5HĚţZ7bŔ“ě9PQ‚ŃđbÁ2˜6„ÔŘ󊵾sŐ #አüłéŠ2ŕšĹPႤYĎ™°‡jkdMć;ŕ“™BŠĘ¨éť+w…‡(nUÉs ŹŽMŰgh-ŕ›Š;“\:.Ň­"}iGŔ ƒŹ0%F8eÇ@E•iáp¤c@cénÍČÚ3žS\ÎŔ~™ă¨ž0†›ů‘LnÍřĘĘG{ܨ ŚĎMżÂžbG ľé‡"¤–‘ŸĚŁHÎ$…l*ű=Mçw„Éó„€Ç2r"‹ô3Ëp'vă{'ôĆB.YĚ,\`äŻ%Íč2ĎŞFMt?œ7p(ťjrF›%/]@îUý|(Lű2ĽYrĆúĽŇ Š đ‡áH…ƒ<GĘ“#N5Ńh” óä2šĘ‘LŮÄ|ďćyÜt×SńłŢZvÎ"W$őZ؏$/օâĚÜCĘ}6łŔ‰eIŢx¸-˛¤-äáŇŠ&śTóľşą‚‰n¨Ÿëë𓠗í@9śŚƒĚuň:r/s~~w”}ťÂĺŕ—'ô÷,¤Žý3˛0{M NXËw‘RËZ QUA.î ‚),\󍧉öNq&Žmě%Ôű[¤ö4ôśSlS˛ČPŸůgˆě”{О*ąˇ¤öŃPë uavXHóĘěDćp'<‰VŐk=‡ƒixŰŽc˜Ů3­B×a‰]Qű"KWŒóę–sßT Z'ˇ‡:ťÉ^0ĚNe‡Ž9é&vrE€“70ĺ ď~2†.f:^VŕË(Œˆ>ŸhD…ö­ě…QU/’ĚKçÇ D[Jd~člN űăý]0!210P?ĐT‰mďóYłr}žřŮVˆ&ôƒ3uđŒ0 'š/&.fŃZŤˇYŸ)' <Ě# ÝŸť*&ßḰ¸Ęˆ„ú ĺĆëߘ Ň[[e=5Š=‚Ę.d›Áf?Ţ1¸wŮpčŻ?3Ɖ<’}hNp \‰Ă oÁAfKJĎtIŃź…hւšŘŐ1ëKŒ]:É=×ő´ł.čWŽźQŇçN—tœN¸˛óůü88O­X-hŤY;“€8u›Ü]´–?%Áć4+Š’Â†‰VÖS "sŒŠłaQY—JôšłWĚdř–ÓP˘ěR.'(kËźąŠH׺.˙+‹ŚdÇăł”v/] Żě­¤Wp‡“ŹFÔ˘ Äâf;~`ꎐĎv~˘ţ|K‹Ů _CÖ̉޽vČž™!0EňęžŔ7 ňžo5 "~ˇÖŇĐe÷̈ěĚ˝G(‚Ö”RNXy@ĘŮЄ 4wsÉT3]Œ¸˘ŒtEJH@‡Aänm•âŮғ=ŠŚ˜ c’ĄFů”9ŕGśÄöŚ6ö•Ŕ şÎK劝ěFk.JŚśƒ{wMŤśCßă ĽNC~Ÿěe<2Siě×<Z×Ţe.igŽPüBJ MĆÁžeˆj‰5gĽşpâ t$Qu×3TďNJ‚ “ÁĆ0ŠŚŮöYy+#œôĎÔ,ĂÇ $śb4;u%™[S“bd´ş8ĽťˆîŞ˛ë(„ :›n8´0ň6ŽíQžĺüűŐĄŒ$Ů$ň–oV|¨Y,‹Aö¨c×|=ŁËYąŃĐ'V4‚WĎK™5nŒ[ť÷ ;'ÖDĽ~ĚZ{:I•Ć܅Œđ4Ć7ĘEŽ0k„ĂÁ×ŔŤ:´aÖuCEé„Nž’űFhT݊$ŠfYďËm)ןí@;ťô‹ˆŰC\ ž#€úýržb;‚ˆQ{‘çŇ>ÖBŽmĄĚ7[Gn¨‰=e›ďۆĄÎOlŁGšÁlÜeʝu ^u^eK‡ĚnˇB¨0Ď­Ÿˆ­—ŒÖKk‰ŢÖôOś™Kj ´­čˆ):ŹÎłÚ2> ş’œD€ľ)ROš˝=7÷Nô“š$đŘ_Í:gŚ‘ž00šQţęHTź=öô[Ą)5(]áh†Kڔ]hdĄ­.˝Ź–Dɤџ4úVăž7ŞsTq¤÷ň"Ąá'@žîáћ9LĄ}źY}rˆ‹ÓÍ_iWJúyeí+ě˙}WA‚@ źűŠ}€š@ŒňŕA‚ƒbśŔűvJX1z‚,íŇí´ÓDŤVf˛ MŹŰ`+=-W2Ŕޞq§,Š`<Ĺž‰ţ‘ĆţŽŐ“‡ŸÓ~eA0Ť˝‡ĽĘĚžzťŰŽIxœĹĽt—‚>?.Ž_ŞŇd+aŠ9ŠëGąÉ€ťAg˘–žŤ \ëVJg˜RŕnÔ|V€”Ú`’1%ôšÇwřƒ¸ţüö‘)bUšŹ-ácJ\œ,KuŤÔœŽ÷rŒ#!CŘÂɓwžlŢ šÇ endstream endobj 305 0 obj << /Type /Page /Parent 757 0 R /Resources 307 0 R /Contents 308 0 R /Annots [ 306 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 306 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 143 152 157 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 307 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 308 0 obj << /Length 3733 /Filter /FlateDecode >> stream H‰źWݎŰĆF^é)ć’l-š3ĂáO€^ÔI´H ĂVŃ5â^p%jĹT+.$ގÎ}_  ň }Í~gţ(ig´›- X$ż3ç˙|göŐbörąŒłĹzĆyÖ4 ËńĎ>6y–K)XU¨,Żeáł—Ÿ[´XÎËŮËŻŢqvs˜A6ĎĄh9›ťÇ‡ŮˇÉťtÎeV'ŸR‘g<Ůľwcă‹á~šyÓŽX:yň§2Sťt^âwżn—ý.7Y“ܤœ öŐ}ż2_::)pżœ—Łěeíqź*UžH42BĹ5o uŹĄ'DŢŽyTƒ 9Ë/㾘p„TŸY¨ŤŹTU\úMV—đ&˛ę‚‰m¤ŒjRÁƒKx ä% ľČDŻ፸„cčŽ* ?ąPˆ&“eź’…ÄÔԗń:Wb(*tSŻdQUđŕ^ÃK•VÝĆă•| ŸćĄĘ@UGćëónăS/Gp߉a|ęŁîť ŒO5Œŕža|ĘO’w9–ĎkV6D ŽwŤ‰wíĆyő)­2Eš~ ńœą™•UošŞ@U ő*SGę•đę…0ęßcuBí𑖦HÖ)ǀ$ŰTAbW5\=!U—äœŐuHk\>z ŢěĚ -¤ŘŐE!ш öh ˆŞŚ Ę7Ffľ2Ö:í”z‹ľ¨œŠQ1:—„RŢżŚ[íÎ9™ł~;ĄG쯎şç*\GÎú9&1utTÂ÷tLbęꨄďë˜ÄÔŮQ ßŰ1‰Šťcčď ‹¸¤+Qŕ/_Äeƒe…ůpƒUœÖ!ť"Ä`[ěŇƒmî#°K| śYŔ.ĺř‰|×%X¨ÖWĺç捺@0ą‹ŒĂ㙨{‘9ŇšČÄ4¸‹LÜ_Ș{Q‰kđľŽhp‘ \;Ä4؋F<žc"ÜE"îƒoޘ{Qˆkđ}í×/¸ÔÍŁE7uCŸjÁ}%ĂřT§îŤƧGpŸÁ0>ĺ'Œ?ŃWXŁ˘ŠžżčĹ3˝9ľ)âGňHýô‡Ť(ö+śJçĘŹBýŰą °ByÔĄ•—x‚˘*\zi¨ĹJ¨ ‹G7BőíF]óQßzaÔ5^őmF]ÓQŸę úDšq Ăö-~Î&@e/_Ř‘ón řóą->ď—@ĚţTźđyˇbç§ňĎű=ď |ŢŃ,ţŠE‚ç=ůÇěOM>ď¨?v~jłHým{”X x? űâF`Wť0ěK]ćðOlvy Ă>-ařů|ݐqÉĺóů^ţ,ž§żđ$qž˙ž]řÚé>&đ )ęâŐŻa{%łńÓ˝‡y–{8ĐśQÜҚĹ/đZÄG 8ޛ Ĉ/l`‚Ă<1F#đÓ1ŕáˆǜQ~>Ă&8lŔSk܀›đˆG 8îÖŔsDŘŔ‡ xrŽFŕY&bŔĂŽ˝Łü„† LpŘŔSř)ĎqNÎőŹťgÁ‹Ź(Á‹%Ę-ĽäŽŠx陎[.zÝßÜﻔC?xnÎS.ŔHUĆ؛w/Á~U"R0Fœж5"c˙Ń|čý6Éí0öĂΞܾËX8…=‘Œç gAËÎozä9ܖ‚•Đ_+ENW…#Pz2:|\o?c ĎźÉÎţŔŔŠńčÇv{Ď&;ÖýÓ>.ťnelÜtlßîěűMZg5dŞü—PęË-­ť–şýz;< #KçUV$bm¨ß™ŠŒ8ăpř ťE¤s˜žČáqÓŘu?2üşń…ńĄťöcˇňž?ôŰ-ť†Ű=ŕ=ű‰ÂËdÇذgżO%UCŠĚ؝[Ăľđ†š7ĚĽűÓâQŚŽÎ3%§LÉ)Sň,SRgŞ dJF2ĽLŚäĽLůÝč6ďĺL]]ĘTá3H'›ÚP3műĆľÓĄż1}ťKé˙Ď\\¤Wę´ĽíBŞž*ZŮúY4ďHe“ńÄ äüŽł*ŔhUö&% RW %ߛO{”žIíx7z̟3Ě'OL¸ůÔTűç†uőż ëąę_ŸÚFůśQŚ„ßôŤŐśŁ>ŻjÓćć ťžG°Œ.ď÷{ӖÝnÜÂ_+ŸRŢĐ ďÎA‡CˇŇîë$%űn +!ŮěÊM%ŮŁŒGf˙-ŠĐŕ܆ÎÉdÔĂX(ăĺ9xćŻ6ŠçŻ2ţVä/<Őš§âH Ök‡´ßśź^Yą/~g­˝Łľqôk–čşJÖÚI‘să¤Î„E%Ŕ@Rk—Ti\Ç.–ú܊}HPd­ěŚ;ŒX;Źß™÷ťýpCâRŠBB(:÷:óŤ“l7z–Ž­–tůËńĆ1m\Á@;˛M{`É <4hjA51YG_#Dňă Ńo†}˙=Ińd؍íöCjI ĽĹ˝ôŒKoĎŽęUżď–:†Cż[vZíś=ŒěV7GIÂÉ2Ń"Ť4ix|Ź3r­]*M =ştŠZE'4xiw+­÷"+@Z€B´ň59VŐÁ‰oŹi[Ϗ×5 ӎý” ڛřŁ ÇM•—xRú|{Ýď42l öű^?Sˆ kŮN !sýůZ‹Ŕ!ÍtôźÓ_Hb|ţ­ĺ]i›ÚĽŰť-‰ŢŇč’~§łŞĐ|ʚϴVvh`‘źu|ťŃœ6>´G<ˇrˆRœ0Ý C€[óśÖÂŁáÓSFΐ°Ľß‰-çMrşňMÉű˙ÔWţކX smÂßIk_çŚŃuΊWşéëވíĚŠ3%Öĺl›˝ýl…—TŐ"iˇć50_Ţöó…ůëRŻšwŞŰ śv-@[úęî W}¸i†ůŰä/ĂŘŞ T›}ç֒efv[ˆ`°Ůő^0k-ŒV;€ňÜměťˆ`1 ý҈ˇ[vxčÇĽ“BGßÝC+őD Î1lÍÍČńąšŢvMĐś'ü.fŹ_ťŰ—ć!’˛ÎĆšŇ8'Ă#e˛ôŢéÍąŹ´Ł˝‹ýвą˝c#6-“ÓÍĹý%×Ömߒç˙%źJvۆč˝_ÁC2ąäEFO)’˝m€.7ZŚk!˛dˆrô7Ň´ź$˝X”Ľ‘łź÷†¤ü)¤˝ţş)ýg˛ˇÍ:ŘLŹâţ/{@ąHʓ}€ůVä//kIź1/|Š4p|̌ňáďޙ68g~L0'"Jč]YĂsڗG )RÔ`§Úi-BȅźOÂë^ŔKŠrFEÉĺ!š˘+%ITc/mŠŢ¨11œ­5ŢЁ^+{ů‰Šć¤ŁŰcuE;MĎľĎQiŞÚjXy˜ƒŠ ˛Ôb…Ý / L˝$(ŕS}#u‡ŹčjťíĘ›űfWŹďěŇÇĂěĹŰůݖ˘OœutŹXďĄ^$B^fŁ—Í^čfp׋­Ĺôźs:/sČů×ńHŮ6ŻhŮQʐ‘VČ=+B GaÂ}–Q-f2ĐĹňžˆžÖ6O đa,Ŕ#ˇ4ˆ’^í[뛥\ţ8RV_ӋQř81Ó?Öň؆ DúifÎŤ kŤ#ŕŰÁš‚cH=ŰÝ[ËÝXđďĂ`¤ýÚIóš'JEžČKąók´žŹŁC@I}.ű]7ž$ËşDś‰ÖÁ†™qrÎş“ĺŇügO]kŁß”Ţ“{ú0$)"Ô|łQ(ęJ] ÍLG;R{ÍQÄ› ä_GTfÎr ‘°ćĚy˛Ň EĘNÓäžŐ˛pŰ`ń•ĘĽąçjš5ŢşeXĘIúi'Êxl˝QœgŘýb#÷ú´Ô?{%›KÉN“ŞżEŠ_ĎźE‹.ŐŘ@]‡Ł˙ä}ő,Ý>‹Ý>“¨Y‘ Š}YäˆKĺĘY‚˝éŠkzÁ€5OVMKŞC9ŠîŹ÷„{WuÓIő[#˘•`íÂfP¨,˜ÁׇYŸ÷qk‹Çm”`Ě荱ęc°(ąóâŐc›*MhžńMľ ÚČ.œ%_…Ńë掱˜=ĽĄĚ4u°Œ˜ ¸NÇ<œŕŔ#‚kľfÔŢÚĺœÔtú+šň: A´ 3ƒČ›UĚ kĽv Ź-+?Œ*#WIMâ1›źĄT3¸Oaw™MŽ’ë4ĚŃFŸ˘Ä3ł¤Ý ˜8 ÷f<çJ>ÓXáwޘŠĐ%¤6Ń7)bWŰEEJÍÉŤŒŠőŹWŃֈ=ČŹM•ž$Ĺ #Úł>×r"˜’NěXrMŕ=O{:Ď_IŔIń¸ş vAžÚp€ć'1*ˇjЍ§éĹUYkÎI- ŰX(Ź{\í‘H”Â…úôćÉU•ą˘f"~ ˆ`eŸˇ÷ďţ lUů endstream endobj 309 0 obj << /Type /Page /Parent 757 0 R /Resources 316 0 R /Contents 317 0 R /Annots [ 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 310 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 443 706 460 720 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 311 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 404 656 421 670 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 312 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 356 579 382 593 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 313 0 obj << /Dest [ 309 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 406 557 465 571 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 314 0 obj << /Dest [ 309 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 420 291 480 305 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 315 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 170 88 196 102 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 316 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 317 0 obj << /Length 6512 /Filter /FlateDecode >> stream H‰¤WێŰČE^őýH‡Ýź5äa˝Y 6a ˆ˝q4e1Ť‘šÁ~Q~3§úFIĂŇĚÂ`Äć)VW×íTż]Ěî %¤XlfR&u]‹îąN“4˔¨ň"IuV‹ĹĂěîÇžŤŢˆĽ˘_ÍîŢ’â[?ƒlšBŃj6÷OłGŸâšĚýŤ4‘Ń~yZ|žčNŤí‡ĺZÄs•F‹!0&‘Ą‰ç%~›ĺŞÝÇó:ŠŁoą$Hź?ľkűŚĄ/žĹŻ”ĽLŁOÍŞŰŻĹOëvhť˝ˆ˙łřűě§ĹLŠVĚ´NŠ:ĂAd"U.ň,Otž XZ)qlf›ŮŰĹ d:ŠsĽéüt6YÓ1S{ŔťC<×0'ÄWŃ1Îńż…Ui’‘áôrÓ˙Áu÷Îy‡űŚîýťR×˝ Băö]lŠ˘mŰÝą]-wbß MŮäĘDÇęŞę#qßěş'T>š+Ԉńž–a;=n§­˙ţ‰MK%%ŐŇ4t"‡řśbŞ€z_/އa›!ëÎÉ:T™ĺĘ í~ŰRë#?߃ýĐđU'vÝŢ0ťĺwÔÝđdűIÓě)”Š7b ”†0í„ŃP0íŁi†Y˘iônNGĂżí~ÓšQăř°$!ŽÓę`ŽKű…'RbŚĎw_îĚ8)Ł_b‰ŤˆÍŕëdÇ[ Чmł^‡%#ßG'ĎÇ0Ó)˙ġßvO{JŃwJEc  N=y4"›“Ůy$őŸžŠi2RfJr’Ćś -ąČÉ]iíŃěŹýÁš’y…1ťź…kXp+҆ŤZň‘| ëĄBó8†ŮëdŸ„ÇLž†CNÂcMĂ!&á1zÓppý$<úeĆMôvť•:‘ód1ťNUÚm5ś[×üßţÓ­TN?ĐxÝ AS…Sďe‰ÎŻJ˜§Š¤8S_˜ÁŚëÂ]+%uV™V¸“FďbşR´q™›“–žŚJʑŻPŞgÝő#(Ű|ÚÇĽšÚŐŃŢ6›ő•ń •Ő8šć%)ÜĽ´§›”čŻ VxďfQ¸ú˜F‡˜öŔz%61žˆ+,uô1ŚŢމo[+b兹ŢČčgbĺ†fÚcœ$xg|G†8c>¨ęú:‡Y‰ĆœÄ˜ÉŹDHfNbĚgV"¤4'1f5'ÄžEź˜ÝjÎwŻ’IE×WPJ_uaŕp!ŕpîçpď|Žgđ—_’ăÍÔöZG#VEšMtt7Á8üĆĂiđ̨›` a‚amáä4ř …ŐÎhŻÁ§§ÁOŹBŇ0ÂÁÚҊÓŕ'VCH<6|žč‹ÄźfřixŒô4Â8 1š†C&áŃťÓppÝ$<úe~=çQ­Żgxő †WŠNň’\“‚fÍ-ÍŞOľż<*eľ"_\<íOç ťvhÝz˘Ö˜+ěĘý$‰śÄ˝ ő}ţN5ĎÚěn$CVb 'ńBˇLń…Îżë~˜bDŃ9OS ęĂ}A0xp‡ű’`đPÁƒëüśăóş"Çż‡ŚŤ,Íyšrř šâ4xš5p4Ĺh4ĹÚ0†“ŃŕiŠŐ0|ZC )^CH Fƒ§)ÖcŇLk4ĹÚ0ŚŁÁÓŤaL<.lžäu}‘˜W4ĹŔ>ŇěÂČŔ>FěŔŔŢťě\ÇŔŢ/ üjšĘ5\žĹëi*{Me ?\&ÔW(•"ęő¨^[őżĐ Lq86=vČÁ0óWśS\ƒXŽ¨’$}Ö¨ĽHäĎźÄ ÍJKx´¨żƒ%r!­J–%8<¤#‡ű|dđî3’ÁCJr¸ĎIŽgđ_i8Ýŕő,Aą’i9Ń,Kxœg Vƒc‰3 Kpř|I/óš%Śá1ŇÓpă$<Ćh˜„GďNĂÁu“đč—Iřő,Q"i%_Ďů+XBBkŽĘʨŻÓĘk'şpڕÓ.qAłĐćń¨A_pŠŔ]Ł7HDäós@ĺJâ]JĽŚË{#ÔÄŹ%š÷ ґŽ1ň(jč¤%}UQkdžm­ý‚4Eű9Éh¨œkXˇĄ• B׍ )]‡€œ“SH6^Âç+RŽ—đYÇJ„Äă%|îą!ýX‰ĄTđEU|—9ڀЧbaŕp„˙ł^mKnăFôWđHŚ,™ŕL*ťľľyŮJĽoůRű˘s<*˒"rfÖŸĆ­AiúHšLě!u€ ű ŕœ„ÇœĂđ|€sč~!đMoo^bĹ­Ś;l°üŒ#†hʼnY1``+†{Hé ъ!CJ¸ĚŔVŒX€!Z1ŒCĚŔV ÷d˘C†$<¤‡¤mĚŠ%ÍĹ ŔóLKđ,<ϑĎ ŔóčJđ,t<‹_oĹ5=ŚťŢŠ›5lDßTŤ}á6gĹĽg˙¨öů˘!żŰů?#i­§uxßćÖ^UçߨwóĎ ’Ž!ÚqĄzŐäźŚ×Żąš”bzlg}"< ŕŹP„G‰œ5Šđ(R€sč~)đ… |őۨKŇ[m#ŕgl1DŰH Č6ŰÜCJ'`ˆśRÂeś ĚŔ’ Ń6`’hdś ¸‡$+Ŕm2$á!=D˝č#ažÚ† §LË0§Q„SŽd˜ Â)ş2ĚĄážŢ6JúEŐőśŃžČ6萍.JlŸţ_śQŃJŃ6ŕˆ ŐËÎmč˙jeCŤéçśÁ8ľ›ZcuCĐ)žÝ˘#ÁëTsu¨š¤”/C޸ąîρňZeßiE÷J’{˛rşuoT;-šqo<2 َţÝż>¸1Óú1ŇŮşÜŃ}ąo›;÷qşpKîÝH{wýv|ő­węÎ ńd›×îî˙iÉÚ0˙Ć3˙Č+ˇ"gČ-ťĆťœ•6SriӜpţ>ÖKk%ŽŞiŻ>ű6äöŚŽ{ýDľ}řě„~ý`w7&R!sěłĂw˙Ë*"O÷TˢͰˇ’Žj2Úg1űZ&ŤňůčźS¸Sĺgx)—,ĺĐ*­iE%r¤om ţ•"ÔۊJŽQťúj|ˇ…cŃšVŮz@îÜ˙őŮ…ś(~ó—™aYąűWłŇ̐¤\ĽuĄŸétôZm|m_›ă×úřľ:~-_ľ{5…{)NýüLßRśý˛5U󊾥ěěWiűŒűž$â¸/ Ąď˜1€ž1ÄžânʄӑL%ö!ôď—EߝY!öˆ!öoiŐšB_B_qş@łLÓ űÄűŠs¸)š3gˆ}d}Ć íŕ\Śc߀.áé>ĐׅЏoŠOĹ.ÂIÉ2Ě2á¤!fˆpʞ sčE8ĹE„Ű-ĄÜÚžEÓˇlIő§.ę†Ëm—ĘmíëŐĎ?rŰhëŰ?ÄxZ űeßúđ¨[ę€Ę–ś×ĐEœŃ7‰žě<˝Ť˛˝1YáëşóAőh{/ëţîăÖu]ţ§AUËeéĆśÖoě4*°š8Í7ą_GďrŰL¸ŸżŢűĄĄŁ#ŽŚŠ‰Žú(o×äÄUvGŽIptZ¤ŠÎŚÁ§‘uuÇ‚#X_PMÉvţĎHmo­§uxߒ2F˙ţ,—Ć?Xť,é:f_IsZ}jÚ6GUôB8‚3G\(–´BiÚWudôĹ_˜ťŔů: <Ţ€spoŔůJ <Ţ €sč~)đÚž{‰KUôńVtŘĽ~ĆĽCtŠÄ€\ 0°KÁ=¤t†čR!%\f`— , Ŕ] Ć!‰Ff`—‚{H˛ ŃĽ CŇCŇKa:čR2<Ď´ĎŇ(ŔóIđ,<ŽĎB'Ŕó¸đő.UZĎčşë]ŞşÂĽŞ˘Y6}–ZúśčŘŚ*“荧˙œëŇ:Ĺţ0Œ´BMł¨Š{ČŠĘg‡AuËe!Ô"ćs‹.G\(VşĄˆý—Đä‰Ć`—8ËáQgA"<*ŕ,I„GMœCđK/m૗¸„&ĽťDŔϸbˆ.‘Kv ¸‡”NŔ]2¤„Ë ě˜%˘KŔ8$ŃČ ěpIV€!şdHÂCzˆzŠŽ„yę2œ2-ÜFN9’aN€§čĘ0‡N„S\Dřz—( rßžşŢ%ę+\BˇTîKú,, ˝ŹgôMĎô$=GŻŠ!ĄjaÜ%¤'‡ř”ťcżÉ*hM]fš†<䣕uŠ—]VŘÇś!wČ>¨Ç\k*-ŤźÎ6ÔÉ´™rpŃRĘłwš.ˆć­~ÉC_Tú%~ËIlUĎĺn‡ČkŽű܃’Śŕ–‘”G°¸Đˆ¤/8‚%†F$•Ąç żîRgß˝ÂquOÁęĄá8&Á!ŽáGpˆ=€cŕ˘ŕr_Šwš4ý lÖ&ˆö‚\6ŔŘdŃüŕąi>°X0?:,\?%PžüÎOçGwĹóYňüŕ­đüI#âüčŹpý$"y~đU8?Š ä?ĘŁž‹°>Mž„ŚÔŠ('NBSZD”ƒ.Ą)¤"ʓР˝ÚLľŃËVýőfÚź¤ĺŇöüv@_¸–ËyiéŮ?Ş}ž°~ľóĆź&?[Oëđž%K3™ęüu_ţA( ´RĆŕ€ őÉfĄ×Őkü 3Ëş×ŘβDx&ŔYšâ8ËáQ çČüRŕ+řö%Ö@"ßÇŢđ3怢;$d€ýî!Ľ0D‡€ )á2{f`I†č0I42űÜC’`ˆN’đ˘^š#ažš… §LËđYŻ–Ýśa xĎWđH•"šśdz(P¤č­@ ¸)r‘mĆQ-K†ţ‘äƒ;KŠTb“˘=8f8ä÷5›ř4NÂcŽŚaŸ€IxŒî4ěC7 q™„ß?4RܑˆĐť‡FúWC#Uq"góđиů_C“Đ+ÂS#xâ őZŕßIꔋ–z=6<ž!L*\ÝA|PĂ˙ƒ†^ŕńƒSˑ!¤–†ŸfđjôÁˇaˆÁă§śAßɆŸfđjfpbbđx€ÁŠu0^O #>ÍŕŐ<胗¤ƒÇ Níƒ žU #>Íđţ\Ľ¤N—ŚéÝZŚIçvŻ)ęőÔ7§š˛Ű-NP抪ÓÍŠĄç*ÄIQ+ĺdՄÜěKkkČVUě§ńoœą—ű endstream endobj 318 0 obj << /Type /Page /Parent 757 0 R /Resources 323 0 R /Contents 324 0 R /Annots [ 319 0 R 320 0 R 321 0 R 322 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 319 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 678 153 692 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 320 0 obj << /Dest [ 318 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 309 510 369 524 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 321 0 obj << /Dest [ 318 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 167 266 226 280 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 322 0 obj << /Dest [ 333 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 317 161 343 175 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 323 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 324 0 obj << /Length 4973 /Filter /FlateDecode >> stream H‰ŹWݒ۶Ţę)pIvź\ H0˝Šă8m'i2śÜfęôB+q˝l´˘*RŢńs$ďĐ×ěůŕJ€v=îě̊ä>|?ß^.×Ë%g[Ţ.Š"kš†ĺř››<˅ŕŹ.e–+Ѱĺýâú›A˛ő ‡ĺlX/Žż{[°Ăcó†Ö‹+űř°xŸźMŻ ‘ŠäSĘóŹHvŤýŘaú˛?Žď~ZmXzĹóä/)ĆLiČŘŚW~ˇŤuˇKݚŹI>¤Aěťcˇ1_ZšÉ1żEQyňś]÷ť űvӍ]żc鿖]|ť\Źc Ľ2ŮRd/Y)ĘL•%ƒ§5g‡vqťxšźĄ˛ŚäŠâ§ŘІÂĚM€ßôűôJÁ9DˆYÉ!-ńżƒWy&Čqúx—Ň˙Ń8uýzĘx™ Źľ|EŚÖ‹äéňßłzŔˇĆŔ&ĄĽ^tz˘•§,3Ę0,aý˘É*$‘V.“eąJtş_P’(͜ĎFŹłéhÝä‰,ň+XĎUÎŽŘ×'HŠ:Oţ+˛š1öÓęCJ‹´Š yĽpiž2,y&sţŮ Žó&ăyŐŘ çĘI™hÜą]H‰K÷+ä¸Jślo6pźkőł‰ô{J{•\ă~ž3oş‘uë6f$ąM%H~›Lš lěĎ ňBÇMŸnľ#ßÇ„ƒů̘ Ýô7×ŻŘ ŃW%Ď__ge]Ľ&%˘ń9iLNœ›5Öéô&!Žĺškđ'c iűMřAoŽăvěŢ>tăZťűÝĚŐyŹ‘GčÎŰ4t].‹|jŘyőŒ˛z $ëŐţu<źÔi“¸Ęä4nsá" GÍáuJ{}Ľ˙ďS›çýÜmťńąV$ž†CŤGŒě—$•@l.™´ćŤńůŠWYYűü™ŹIˇƒ¤v|h׺UđŹĚĘ_RśBÝ&÷mÄu&ŞÓ€ß'˙@żJîąkPŔ~ŁkmŽŚŔĹ|ëÖnáz ťÝ­nśí†xŤ7a­š!Չ˜ËQĆwÚŠ7ş‰Öô•>ž˘Úlľzě­}Šdlőžoˆ™4ŹXŤ‘wű)-ԓŞ'Ňň>Ą%_őť‰ŮŘ]‡vŘëś\'k_€śŰ­öą6G&č&9~[š¤IˇBí|ˆ¨†äö4ę€PČÉmO˝ERëäz˝ÜJ/ˇe?˙řĆD´ÝęQˇŁ)!6äĺĐ´C‘ ą°)ţŢľíƒ'c=Ö?°¤Ż¨|@/Ś€‚AtĆéaeÜźoŮĘ| şĽ{Ăqˇm‡Aw ĐyŞËäšő5˛ŃąÚžz_“˜9 ćęvěᮛö3[›<Ř ěšamšĄpŽ›f^Ż[Ćý~kžŢO>šˇÝˆÄëľgaf×|2#FłĆÔ{–Ž7éÝ.¨Ý}ˇ5~š˜śÓzŸRA~¸dDči(o˛}N ęƒT˝;S=C‰9›á˜vy‡D´ťużévfŠůŢî†#řîmŽĚöÚŻÖżÚUĆšşí–Ý´ěřĂD‡Ă†­űűýjœśH‡ÍŽvEŽú›ăŻĚ@łđŞŰá“^ýžÝlśÎĄ:áab$űm¸ˇ+Œżł_[GXBoúÖ}œ<ĺ’7É(ÎHăĄßnŰÀŽ÷`bTşýkTN˛O•Ć1ô4lu0Ż… ŕ%HÝn˛3ąĐňĽ¸“/îYÍuűýs7ŒýĄ[Żśd¨ž:•ŽZžiîĎW"ë…ďb•‹´šNž=6ĺGÄI-^d\ŇęôŠD‡˝í°ďíYt`ÇAwfZ“–cŽÁ›ö@űĚTT—ň뛡7íO%G"Z…cŤfˆĽF~Ňe§3ăôDţÝöl´’Ôo4żf˜%Rfźđ"Zˆ™uťŰţo-T°HŕӉŃl.Cg;Iˇb4˘÷ýŚÝÎΉ2y•Ňöf˙9ZÖë¤y2ęąÓ7Óé†=řŚx×? ş+ݙASbn]Ëż_^‘ryrĐ)=SôQ—ÚźDuţtŞĎ‚8đ˙ȍ+mšÔ&ŃœnPڍčhZ8)śë÷TK„DďlBW7ýG/]VnuW*’ăô›ć…+•UňT–Ď yÄ9÷¤ßnŘŠ7Ż‘„R_I¸žK5(Őq:vZ&Đcž:c˘:ׇőéą ŰCj• ÎŞUéîCbvZˇĚŁsN˝é%(VăUä•}­żĘÇŻĺăWńř•?~-ôŤĘőKÎNŠĚqťh”Žazô1¨&Ëšž5ź’3îઓJEZ4{r7ĘRâ:Ř Č}‰EwœŮMçiłJ9ŻRVF4čW\Ć-oJ9ˇPŠGx‰óśFĚ/Aśü2ޏÇ’:YAĄĘ:n7BQ_ÂQ€Śž°‚Ŕ%˛"jA .á<—VPť<^)Â~ Y5Ť4V¨‹G+”›­ŠW˛Ä‰'W—q•Ë 1”5ŘTĆ+YÖt‡š„+xpŠŇ’ƒmEź’Oá~? nq\şNÉ„=“ðŁaö ÎAŘW/ ťÔaŸ— ürůDť-TV8ˇQë˛âŽÝÖ'úř>yů)%[ý‹§°É9™Ÿ‹ŞÎJ^Á=@Ě̗ҙ/ŚnŽťlŁ”y¨rĐü3Őj˘Ď)‚?‘xl$žĄÄ?;Ń;śŽ,&üÂÁ"fÁ,ź…ŘÁ"bÁ,˘>řrF,؃CԂ/x؂;Ä-8JD,XáćÁ“&lÁ {ÔOŤˆ+ÜQ žx1>Xž f}*@ž AŘW: ť2a_Ł0ě „}vðK]öy ÂĎ^ě? y|žđň篏2UŐĚăFˆ*[óţŠƒˇśţşŰĽWtý …˜H߁†‘äĐÂ\ŁĚłE^Ş_~f{ó­7?CZÂÇněŚ÷6Ę óĆÍO–)kč´ë Qq—Íš˛8"EG8˛DG¸šEG<ŃF%Žâ\ń/Ń/)!*Ž_Üm”nƒŕnŤÄpťW"¸Ű,1Üî–îRÁŸJ|N‰—ŸŁ_¨UQ޸~MřýŠY°úĺ-Äô+bÁéWÔ_ΈŤ_Q žŕa Nżâ%"Ź~EóŕIśŕô+ꃧUĂկ¨Oź,_ř#bžęWö•ĂŽŒAŘ×( ťaŸÝ0ěR„}^‚đóő J!ĘŚ|ž~‰gč—Če&…äÚ<Ę#œ~)§_ÜXŸˆâZJ§@\+JXm޲,7†Ť óوŽx˘{ĄĚ(–úŮUĆE\5°cgśě Νز3 ;vF`ËÎ0ěR†ŸĘwN„ţúj!°žŒ‹…/hEdž• 7?ŚáůN(bëű†ç[™ˆÍ÷5Îw"ďHžo%"żgIpžˆŘúžFáůVbó=Ď"ő÷ô˜ŃđT‚čź´tV¸st^–:Kú9:Oi%읧ă}ž&đ<űéUÓŰ8rDďů}$KĂ&)QBC˛É"@€ě`ǗsĄ$ÚbF"6eeň7vđžŞţ˘=,ۋ9X&YÝUÝUŻŢëÖ+ý~I(ßsĽYW`ŃuĹŢŤč˝Üďzc˝kžąlpĄ›J‘mťä?)ź“nđÁ\SA†F­ 3œk1Ăöą˛Â€˜FaŔüĽ!P….żG/t§Z Áś&Ů=l{Žd÷Đěź’ÝĂW°‡Ě öˇŸSâŤß#şd0ŠĘáěŻH‡äÁkGô ‰‡ŕ!¨‡¸†XNÁƒ×ŃC,řꇠ ˛‡ Áƒ×14󂊈kˆ°@4ĎD,đ< f!€çiąIćDó|€@ăâ ‚YŕY^ Zt>@4ĎxËţœ qxDƒkîu˙ŹK4nšAW[Zœ„ľŠ|¸˛˙cűxštť\'ŞXä)|”IśTę§ÓÁž,pŕĆ?ƒ1y2Ś‹úŻ'Ů:iÔÇOvĐ~ĎӌHľŢ™Ţ~>Ůá×Ń ?÷öŠľßűN]j;r˙Ĺ.bTęsnkňČîĄ˙WsűËΨTă:“üYeŸSŘ×ÉK↨O=nů~Ţ.6ËŹÂĺĹÝY˛l퉛ž( ÷ÇÖ¨ţtŔz°’Q=ôĂšďřn‘ÜŽíţ¨Nd9¨ńHßx7‡ëĺÔîëtA¤ŽĚäřר} ČiÄ×ToąŐ?`Vc}=ŚôŠI R‡ńŠ›QĹžęΚ=(skGÄŰľŁQmgˇ™ă—zĺďI:…ÔNzvébƒř_Ó\Sš…(ďԍVˇNjźeŽf˛]RÖîN"(O ^yňŔżüN?w`ˇc­v¤}Vű8™Ürě–ýw.Ž[äĽáUő։:őźŘGďź°'ú9ŠcoFиŃěůV‡HvGúŔ&›śű?ZyÖ!]ôHé,"ÇľR˝Ű0Đ5ŕW#7dě§Ö=?őüůÜvŠć™ź Ÿ>äęPŰąöŸ˛˙ ňQ$ŔüŐ4Ŕ˛ĆžČťšŇœrƒĄ7ÍúüŮžœœ×öÉ/öƒ]Î^Ž[¤őaԎđ´u_8^?Ý ŃoœCŮ[cmi[Kââůq‡ž(‰Çö‘YáHá7ÉâÔ<ńŢĐ'u°îAĄ`㍰I ,ü† ÉÜŁ-şćF§&ž†ó\b8íyÜ÷ÝXˇá^2őšąÂ# f%‰şxZüX{Wzˆ°JŔIÎ41ÇĘJŰÂôr§v×Q‘ľáĎ5=ҟ…Fݢľł‚% CôQíšMŠ˙o­œJ~hĎ;?ĹŕÇDçëpbtÁ# ЎÜ(Üh jôDĄěăIq;xg7 Žć"ƒQËäpÜ$~9Ď*Ť}a]†~ůÔ Ű‡_)ĂÄ^ěäGFJKj%Wî奁n žIžÝQÉ R—ŢZFڌÇô/†}˛]č ócňkšóz9bĺônŠ00w(ńć(mg€\đ†&´xí99s0˝2[7gKüőĐü ¨$Žfd*j–\™csDŢ_‡˝ƒŢž?¸'ĘŚšâTwϸÜő—˙9Ş—ĘŐ~3iÚbR˝őŘŘłą&˜Şűţęž÷ tô‡Š ‡Űc}寜ˆÝ„“ĎŕÜ=Śô­vž):!ŢwśĎIďjó÷ű?ü6<:”  endstream endobj 325 0 obj << /Type /Page /Parent 757 0 R /Resources 331 0 R /Contents 332 0 R /Annots [ 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 326 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 497 706 523 720 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 327 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 233 425 259 439 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 328 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 428 284 445 298 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 329 0 obj << /Dest [ 270 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 250 242 268 256 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 330 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 480 242 497 256 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 331 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 332 0 obj << /Length 3224 /Filter /FlateDecode >> stream H‰œWËrŰČ­$;~E/˛h¤DOŒW˛ěqMœŞ(SłgMĄ-Íšâ$Ÿűň›š/€¤(ÉNJUٸ辏sĎ=ýv9š\.ŤĺjÇábąPüÉ×EFiš¨y–‡Q‘.Ôr3šźîsUődŠžš\~¸Ő}?Ű(‚ŞÉtřşŸüŹoƒiœ†…ţgDaŹŰrë-źžtťŞš)kL“H˙€ < Đě`:ƒ˙ÝŞŹlLáBß1>Rvśćƒo&đ.üăYé[SšśVďkë­kUđĺŸ&XY5)Š0_¤HĆIڞ4 ‹,SŕéŞřśŕǜЌ•ox˛J0Ë 3 ;Áůń"œAńäL—˜Ĺ™Śt_`’0ÍIrdQ…ňžÎ‘Îăh ťGE¤Śę ƒJđQQĚ#ýŸ4œ+ĽnĘű1AŠďA ‡4K†ó$ĚŁäNđä p•J•Îçě|műj×÷Ś'O:ˇ6'^}|ĚÂ\_+ŰŞ{K7×]šVŢt›><:ŚHĆcâx8&–fťR÷@U;'AufĹŕ4A‚;Ź=řŞ+Łîœ{Pň؁îČ%đ&‡MŔ›^Uź}k:U('żW„hő˜Â{źKŮ>¨Ç˛Uěz˝ŰŹOŞ˙Ý ę—Ë8bd'‹0ĚČnZ6v,4ż3eË'Ů-$ěżí'úďmíŞÝĆ´ŢÔęć:Ţeă§ľ:ăŘŞÜ Ő á!‚ýŤüňˆčÎşôĽş“EŠ)ƒšÍPÂňxÓbĘŘÍZĹZ3‚VDĹť0AűUÚ8pC•=ÇÇ UtݓŠ1‚BŚÍćď„qUh¤Š |ä1ٝ>a×ř˘ř‰[Ÿ­Ý>MţL’Â@Š”ăłaJ{sń„ţ‘8ČůŒ€ži;”âĐ 3ýˇ`ŠĎţŞâ„ Z]¸†j3#Njˇ+ދÂĹŐf ¤fV2†›p¸Řz҅\鄝/°Ň–\k١ňQž—v]Ţ­”´Ł–„pjľęÜF ލmν5o`bt ލ•€-˜čůiąĎŚ*ľžYŻÜźéĆ4çěiΞŇÄJľ*˙€ă‡ó/€ˆČ­\×ă>žř[%´)ƒ9Ő6;â¤Ć›ă¤šx~Ľ™*‚†;†”ĽÖ¸#ź žäÉf˛`šč•yA#œ'€”ł´ÉľÚJđ]€Ť@yvťlŇTKő¨MĆ˝ÝŔs…J{g=δ—óD)éúœcl çń*ŔÄďů# …-$[ow7/aö,Żĺ =* 5e!Häw+żq,šUëǝÖň )Ÿ"+ÓžŢmS˙äƒĹĄ5”2ekę9ě5@ý4ŒîĹ3â*bVD0;ř" jíOss-Qu†ľË  źDń—Ę —,WüOč|-˘WŽS{ë›Ă¸Ě ö}ăvk‘ ĐŮĺžF{áĎń÷“÷iô=đłů&’‡ü b˝âŃwčÝ`SyťŇ; Ô}ieR%ě4ĎŔ†‡ä°é8ˇË Ëľ659#U잃ߞt旝é=+łśśúJÄaąHnŘŢ?ő0Ŕ–ęjŕDžš\]<Ÿ¤xČĐН}„öüĆÜ É5˘šm7ŔË#TB¸őďńv3ÓďšPż`bź8vfŕPá8,vÔ2Ä9 eěę¨pO<ƒq#łŹüŽ\Ck&•I„tM…fúýx=ĺŤÖĐTSě—˙ŁŻÎ`ˇ’•@˛6HOf@’Ç:K Ş“|qÔAסňłbš hË&؂%5|őbTP’y~§@j䏣VÉ^Ń/˜î›Ű˄G=äżuCú Wn×ÖĐ@ˇîŸ•lZ¨o°Î3=X6ÎOˇrHôý=›Ŕpn˝“ĹáĘqÖżgˇ!P˛ n`T°§ŮËÍŚÇŔEŰăU–hœfĎŘsΨg“ÍX‰ l7˘ű‡‹ĽśCĄđĹŁ‹ą¸HĘ KŔęşZ”!‰Đq­qĄ;†4jžCŇŘ6Ő`ŕâo/˙’ŚŞĂPűÝ =¤zzœë[ŇoO€č{îq׎Éě(ş=Š+ăĺomŹLď‡A2ŒlčěÂT°3TRJ“ŃŠXPY› GhH'š~ŢË Č1|vôëö,PCčöą„Żk[… _fă CŸ ŔqBAŕľ+ĹÍťâƒĎ_÷tޘíˇámŕꉋt(Z" Ř24RŽóťƒˇĎ˘˙â-[J8w>m.}¢x÷.ŸEEVaw”VÂĐ=ăJŠ–eďä6˛oNď´űrÜ˝jn€]żAŔ=¨ n„Ă'Í4U Čü&<äŸ…ÂŤśƒ†–ęÜßdBý÷8ۊĺ!ŐöXB=` žN}K 0xžJ§ó~y˝UžA%śĘ1h@a‰=.nśTŁÍĄÜ÷„zÁď0ƒ`ă:ZĂW cöé­`Kaąô÷Éb×HěKöc+{âôyş?ÍËfŕßăh/Eéʜ ÉFň…XK&&r}B.‘ ĺŸ_"*Ӄɴ畲ƒŃezç{Ńäjgâ”kŇ îçŹÇ ?­2–nŁB°ýČŽd†ą•s˘Ľ-ˆ5s˘9žŠ ĹčÍâ0i¤Ç˛ńBď<‚â;×0ĽjÍ^nŒ ԇň N^Éűp˙ůr$PĹŕëIŻ–Ý„a xďW qq$R5<ĂTęąR{ä D‚QHŕ÷ťłłqB[ÔC/qlŻ×ë×ěLŸ¨&BTńĺ&ôR§‹ôj&Ý-M,äJŔ%erC–Ž8B“6…U%ÓĄ‘EœhiA\D/9V]6˛ŽuôEPřĘćΤ¨´2hÎ8ďĽëĆn9ÍŚ/e2Á$5­äšcăĚ0EŹĺFöIŚH—Š?ŔőŽp9ńd,ŹQ€DKÁ §MßŇďäţŚ–=Řăiś§EĽýć@xß6Äŕ‘h_¸X›°4 Ô<™ri2Ùîg8F/ÁgMŠzŃƒQ=ÚM_ЈMôtU–MS÷ŹUť5oÎn‘#öýĄ@„ÝÉÓš€Í!ř`:ÁY_D(łţŚ-ZđĐűɑˆiKłć÷†'Ą­UΎLŘ]8ňCYjʐáŰCVçdőaôż Ѓ=Đç6§.œötáX!mސWě¤Ü’'@—`§QŒ"°O쟑%IŇ&z÷ž°PbÎ4Žü˝nęZ`É?"ë?°Ń0n˜Ř –­Km1˛›όşpů¨Űě›oŠ­œCŰĽ˘Mdá +jóT˛:P_Ń; &!!6Š'ÉíŔ?k@źJ5wv€jađ`+‡Ł˜š]ĺKvęĘřťÁŠ,”H Ă&ŕl:ai­„ô赚8ő×÷Ԓuźć<˛áxY~xý|ú`ˍ endstream endobj 333 0 obj << /Type /Page /Parent 757 0 R /Resources 335 0 R /Contents 336 0 R /Annots [ 334 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 334 0 obj << /Dest [ 309 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 238 637 296 651 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 335 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /F4 661 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 336 0 obj << /Length 3492 /Filter /FlateDecode >> stream H‰źWŰnăČE’7}EyiÍćM$ň4ăŮM6@ŒX@2Á‚˘ZcŠ-đbĎüF~"ż™SUMIö$ť ŤŮˇęęS§.ý~˝¸YŻceÔzˇ0&,ËREřóŸeFIŤUš…Q‘”j}XÜÜ™Ş^ŠĄ^Ü|oÔðŔÚ(‚ ząœ?ŸŐ÷ÁŇ$aĄżqÝUÇąÁöľ›ęý]ľUÁ2ŽôďŹÁd@KF,s´ýŽŞ›.X–aŠCSęűŠŮʈĽ1ö˘5&7‘žˇľëśęĂś׊ŕoë?,>ŹF5jQaV&¸ˆ MœŞ4IĂ"M4]ĹŞˇ‹Ýâýú$EXŚqA÷§ť™’ŽÉoÝ1XP7Ä.Ý)~h… )Nƒű€~GQęćŁG< œľţŽDŐ ýŤ`ý÷ {@ˇRŚДő_t˛Š eECÎ7e˜D:9ŐĄ˜k†űš@"˜ăřbEúĚŽĘHg&ZBzTDjŠŢŃĽbš*ŠU¤˙™„+ĽÔ]őĐ!6Hh_š`ögq˜Eń›6Ś‹$*Ô**Ă8ĘËÄń‰IôI×}Ţ7ué˝zvSťU­E§Â˙ŘBŃŃŠŠŰ’Ö…ŚŠ! Ť5dŽ˜×mxoS;hţ&Ą-‹~$şŃ~śZŹC7WÚ]ŤqĎË|0ˇjpneAźa^ŰGđ-;›0?™0—;Ü4Xľ™ĆŒÝ`?ŽüdaŚ]€-šî{CĄ?ł­r]Ž­˝V[űÔÔVý6ţÇ ŽUýčg-4x6–˛[Ś÷BŽŽU%Ę­Żpž?ůŘŰaŔRűd;ÜŔM^;yY>“á(4­ ŻmwŘĐtƒęœżČ ŞŢŠLňMH şÄz‹ËyBHJŮvĂťń‰ivÎőş¸ôNÄŢWLC°OK,“Ă8T÷Ő!ŕjö(Ň[\%I#}GQ'§Z—FobŒf‘nćŨ9–ĚuăwŁ`Rą•ĎĹęEéGvLósá°:A´…ÖŔW ż\đHPZ“ŘRż,°9P­PĺTě…\ř'É˙†šÁŸęˆ0YÁ˙P'îŤnť÷{,2×"—2“‹Ĺ&¨´ŒÜMź“I——6ŽÄőűŃJBQ¤^q¸GGIďČ1›ž¤OřHÎ+9ÂŇX//éxw_q\$ÓßzyĐëéˇ%”.wŐ+MčôŻY5PäK|^ÁĂ8 Ť.mbŁşťU—Ł~KçĆW4˙Ş~§ dxQĺRf Ş °ŸżCRI…€h<|AďK~7ąŸ™|&…8+őż€ Uäŕě˜w÷ (9ĹšuĹ5x0Zź¸dSm_VšČ'#NÎF*ƒRO”î ů?N’ڏqÝҐóhÍżĚy\Ÿ;”‹żŠ H*ŠŘŠťj–´—Ű%Km+żœç¤o¤ô „g3ó ßלDüIʃ%˝ĽÉ˜žŔ…oQăqzFœ^„V‚-Č9Ť’‡ďřˇâ‘Z& )Ě7žspiźz7M‡Ňskţy&-"˛˜)BśÜšśuĎM'ď2ľ›NŻ;Ţ5 [¤ä|ÍŞ‹ˇž';* †ŠŤMëŮ6óiçžvušHć/bčK¸-ü‚"ČĄl÷ÔôŽ;0Ű}md$ÔĄ€ÍeéMč? ż M˘Ňř%qLoB:*͊ äÇ/Gťľ;;Kšî4ąî†ćĄłˆyY“öU?ožŒöws˜5‘ÉĘč˘čJó3Óýí&Mô•ĎőďZîĘ/•ŠüQЧŔHČâe2=IÇü`ÄŁˆ[ŤŠeŔĽţŚáe"BAÁŔŹŘÜôŕ”Ma@yE]Ý0Ż^AˇœŐ'ƒDE:›ä%Nö3ť›aÚ|!œF;÷{‹‘Ÿn˙ř§Űéë*ô7őőƒâ†=ˆ*¨ôš?Iż¨žčüäŔ=YPIcĹá‚uË­ŤŐą$şťĆš¤š)ʄŒČˇđˆĘüçáńÝťőťOšy çÚÔgŢdG,pPškđBüX^8ܓ•4 }0ÇŔ‹$;6<Ô]K]ăJ9F—̸c~>Sž]žŮÎýÁŽ?ŃE!Ÿz:Ť3:Ť3:Š îßM-÷ĺ—@­g@ĆHIă'dŰsPŇű“œ)ՑŒáuÉ]”§Ŕ$™wOń›ƒB™Łśť8ŮU~p/Kö'ůćĽ|r̕ţ?Ŕ-<ÜĐçŃÎŇÚq:ŁMĺŇĽ\ĐŚžü2ÁčŁ řMASˇS2ďdŔŚ TF2JpP—ŕ.ľßAů*Ó"T‰0ßŮ]œëüą„5ľk’f^ śčÝ"ů%œţ5ÖĎU3˛ÓOçSDřEÜţ/)ČŠĽ+î+Ž*ŐMŽ>6Öűďěň2,Ťk™s#líş­|zffTú5Ÿ…łłđě\ý/Řyw3;mßťţarŽw0×{jP >Pk ¨’ ŔšJQÝś”ÍÉe;nde’ŁvpP°Œ†*4Ř#R{ĂڀŇQRŽ/ćď8ÎÂ87ĽJbŞ4J.0؆Éٜ^ˏÍĂÔó@Ř#šMbčo~Œ[‹]—`ó~ҋźSźKü˘űâ*˜ćńŔWBĆ4{KěÂÓľ*G:ďł ľoÍa(ĽkĂ­â T!×öňÉ~ vi[Ęň—ƒ(7?ř+ăP]Ľť5Ă8„˝äm9ĐPýľ¤{ęV|Y’şրĎ_.•˜;6yĹäţ^•˝ř­%ÚŘ‘E<íŘř휫$öÍíˆdÁxY ™Śľr!BEľÜŻá˛"÷vŸŘÎ@š~ň[e-Oě¸Jć[őÍŹYúőłQdü™1ї<<ż9ł^d(ľŮEń?юmBF’Nî!őäő=éůŠŠ„ Şbˑz/EĽĐŰ9Ňź’Š_ătń_|MjVŰîܖŠÖvĎŞÉt4ěl8ćrČšL‰ěČhŞ÷řň×ÍźŰ7§jŤúňI9ő*ƒËĘłŞš+ÁΖœŔWO—Ě#u!ľšFâŕ•;^űśčJY“ńś6UAÁ‘ä…Zą]öţc“ś v f1Č%JâŔ¤„Ő‡ťń.ŚŃƒ!Ňf` ¨ÖČ~h_ÔLą‘¤ą™hĚ*™Ŕ%ý“đÄGš|őCÚŘó˝Ăůѐ‰ą°_‚úYÉ{&ˆ5{Sߎ%R)ďÒK‰Ű4Š’pPígĄ)P/ ˘çaŘ+1h›ƒ.Ť‰÷Í_ĐUa[ź”yqŻN ž~¨DŹRŠg đ ŠnŰr‘Ôý˝ŹçóćîŻhEœ endstream endobj 337 0 obj << /Type /Page /Parent 757 0 R /Resources 340 0 R /Contents 341 0 R /Annots [ 338 0 R 339 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 338 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 434 404 487 418 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 339 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 115 389 129 403 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 340 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 341 0 obj << /Length 4031 /Filter /FlateDecode >> stream H‰¤Wێă6Ĺžú+˜—•iŤIJÔ™y˜Ě%˜ÝÓH؇ôb śĺś6n˰ĺém,ň=ů͜")‰vwä, ˜ąŠäaŐŠŞg“ËŮL1Éfˉ”ažçLŕçşšE)–Ć:Y”łŮýäňÝ^łůŢ,l?Ÿ\ţt-ŮÝ~‚ľB@Ń|2mť“_ůu0•Q˜ńÇ@‰PňMąm*ˆĎęĂ|uU,X0U‚ °ZҔÁ4Ať[ójLó0çw¤Oě§Cľ°3%I*Ȣ•2‘‚_—ózł`USŐü{öÉ‡ŮD˛ŠM˛,Ôy„‹ČPޘĹQfqĚpŇTą]9YN~œ}€( óXetş›ĚéšÂ^đ]˝ ڇBŠď‚˙N%ˆN“Ť€ţ{¨Ëń8Œ°×ě=КOř߂Ůź÷ŔŮrűŮ›M]vfŠPf„04a™‡ @¤c^Š 7p_HłRފyč:řšć‚k)ŚĐ.2ÁŚě-]Jѧ,K˙# SĆŘUqĐ&e‘\œt0;„ľ ľP/ŒťIa/—Ř<2XťnŽq_•˛€Š8I ŘÎ\ƒ“Ńű('oşyŞoëËăř$őQZ!؍vBŽ+ÍCËčHŠŕŽuF{˙ĘoÉľŽĆŐľúHĹďĘć†ßö1GÝIˆP‰4éîÄŐčëx˘g\ǗúŸŰkřœI†]łĚŠEcx$5xDaOĄ¤^Dźş@/VčÝVÍE;ű•ĄXşeoÚUÂź‰TĄÔxKë[0Č,śŞ/śoD “+˙zI OˆsÝż^<Oô h<Š#höeóĺÝϟéúďţyĂĺMđäR‡q&óöîB¨¨ăÔňĆĺ÷ě—r]ű@"­6ŤŠŕeՒmĘyiç÷ABżĽŃÄc@\˛ď/­Ó°$ •$š:ra=5Oţ Ô<Š#ÔŠŠ`#Ô>lbśi˨É7˜Řż(\%–a%ŻśŹ]Čb{˘MÍ`Ő-؁,1Ĺnťőóľ˜˙ˆGŘž˘54Kř5ů˝ńzUš”2%(é)ĘŰŘM‘›mÔۛďe LĘI‡2]ƒ‚>uú؃5Mś§g$Řmt÷Eů/ ë—YúÄkŤţОŠs}˛ű_Ϟ‡ć‡JßCń~W…í#YßëSbݧÄÚ¤ÄrDJŹ5ňţý˝˙¨bşřÝĹ*Řý ŮG=)Š.2ąwŕ˛„Ż‚)nĹKPܲŢ`Đ_˝°ŠŇś°éËAx#”Ş/ǎáŹ]zx==甓#tđ^]Ť/%ÝiˇŤwĂ)崍âÖŚľĎ32´+›qvHŚLé5Xi[ěâ>}LŔ̜䥫%‡ T89ŔsP–>=”žžs-őä/2ŻĂźąîă˛îóse#3ů°ą6Ga—€$ŰˈƒÍ°1˙ˆť€ň֟3šjS"č. ŕäR*‰ÔóVC=žžs>9Â˙Űâ¸G8î–aŔvݘa˝í ÉíœQZŕt¸ťRńóĐŠń5ŽŻç\čNŽđ,"Œ™‚ďË{Ćl Ů'ű˘Oř…ű6„ąĘZFęˆG%ń(^Óăј3WՂíÍ  Lő6­ĄŮhœ#Ş -Ÿz|Őäë9“POđW ŐXhÖ[hÖ[¨ËÎáĘÉĺc^Üąó|Í7wŹ´Óöżśkíŕť@w ZlœĄÎHžOĹÔřJÇSsŚ˝ž Cq_’Ł6•Î(GoíĎ HpíŤ5ë5Łl5á()јÉě.á”J%üÎ,Ţ7f’)Sd&”jŮ)Vá aĆÍâ•ů€SîV™l+Á› Ź´ÝՆJňç1_đřzÎýäÇüzاçz\ĺvůmä緑Š)c˛Z;˜ľílÓ 54+;,ŮŇćľQ+ąś \Ľq*6AiŤ`˝/]ž™‚R†™W]Ź)lܕÍńkEaŽźźťŻ%…KŮň°™7U˝aTšîY˝)‰şą˙c s[Ka/jŻ8Í‚ťâ+ölżŞ6(+ŮG„"ˇŠ¤Úç. đ6Rˇ Ś)š´ŃC¤ŘĚℾQô‰úŁĆÝQ]Îľ-îJ ź›9Î'bԄ/mćJ$€7ˆÁ3{0[,hop@ľg›ş1—4ˇ‹ííH˛fÍŽŘěďŤćÂ\Ď>Y‹´’ašž`mĹĺ’Č#1=ťÉž@”ŽŢŘÜd„…ůGd)\ş8%"KâëjSÚěQł‡ K,J*EŘ'˜(Ć;ňěżp˙Ą@Œ7Ąç°iŞ5C§Ú´O$^‘‰1˛~ 8ľ ; ëCľ_&‹šŐ@ĂčÚY™f§ KĎř9{XUkČÇÚuŹŰť[xáBŠśjěŇui—’"'Üî3Z‘…)cFPŽźŽőŤ­HĉŃČ.–Hçű%9Ĺ]I~ťśĂăْĹxy;ľrS6_QĆy2m/2wjj (­.ś-wŽ_/\g^¸•hľ0:Sĺ"gFњÂ”}ű?9ŻşŢ։ úÎŻŘGűŞIłvě8T<\ŕJ B˘/Hyqš ąšÄ%›4Şř€îď圙ľ¤Ą5źŘű9;;;sć 'í\é›÷ Š6°\ÚlE Ü-ż%§Fœs6˛ě !89…‚´Żŕ—ţńő,fšĹăĽx0ą9x>'CžqÄ|ˆ NÓS rďvťĂÓŢ PlâÖës¸š 'öj ő­öQ@ÄŠř3b‘ŕńň4Ô3%•%L;Úv­ ű)ľ.Ɲěä˛ěř‘~+–Ŕő€†IB‡Źŕ„zŘüŕ€Ëî8@Œžj2ËY—‚k TŰ€tŻUĎnqÇŔňœ¤,¨7§‹ś ˇ`P lŢ V!ˆuŐű/!3:x'2ţĺ6ĄŢ@Ÿę˝ŽeZM6^5GśŸĺ§oó Ľ˝9Ňľ¸6ó Ńgkh&Io¨úŚ|tĆ#!‹‹śeősőŕLƒä*Ŕ“Ő“`ˆœiÔLI2mŇmxĘ55ň{â-Đ"^ŃBČ@üĐ2s~—1ëԚJđxvdRč”tˇ1ë"46îäŐł°á¨wŠ7˛Z˝‘ čnSńQłhQqŒ~!§~‡ť=>YĂ}Űsö`E0ÄŘoœĄľůáŰ e¤X‰¤šIk`ŰŘŞ7•¨fŁŐŢl*ż'HOŁG'ż€çlč8r‘liëi´0őRĘQőOOځú)Ąžh× ™ë?X)IŰnŤ ,Œˇ"ƒůeëVˇqDš“é=žDQ‘t.]´.]t )pŕÁۂp Í>Ă@Č 6x|‰<’+y*w_:ŐČĹ *°BZ]$ŹYńÁUĎaąăĚC/ěUAœş“pňHŸáţLSr°Yž—A\šQČN˘“KÚěźć:#É´Q&)zžľP]m{^ËF_ëCăˆÜPĘwŤŹ¸Ţ°ŕ]9ŻÂDOi…íŚZŠ4 ěƒ4\c˄ŸFĘ4ŻĘíÇ |/$#ŕÓSWržĘ֑GŐ`4iŞ:؝üO5Ů󞤷ç­OĹž}÷ľńnQ ݒLbnÝAńÂčnLƒĎ÷uíBKÁË>¸Łiú×s ę‰dTLŻVŞśwav)Ś­6Ÿë ؝e+ ŘxÄËϢů Ű{×̢ĺŔÁÍâţę[4l>}]ŽöÖüT‚BŰuĺ§P<˝:=}÷t°ć7?̢Ń,~Ľ—͆ăÂNťú§Ł™IšŰ1ë˝Č|í~ÓV[ćžçÝU73MTgŐ҄u€KďKmď^†&Čź% ˆVo˜(éž$ŮŐĐČúŰéBLk') žvšEvÔËNYW'&ßĆyôA‰Źů Ý9?ű˜đ€O`šť¸ĐÂn4Ż™Óč ‹ěH{#(Ă5°Ó-Ťˆä}e`Y:žj˘źż‰.ĜšŇˇďŠóǞžôŽ…ž“1˜d‰E˜X”{ŢŮF%kľ…ÚZűaíQńV+ă:ĘPVjÔz4ŠN tֈ¸ó‡Ń ątŢÇÇ#ŰřşĄ'ý }!ćßbÖöąô¸cś Ú‹hkş“ůDƒ¤¸/ËůZţ•|ufeţÂísqM–ߎۑEÝXtЁ (uţ–-ćLśţœ˜“jş˙âŸN.Ÿ` endstream endobj 342 0 obj << /Type /Page /Parent 757 0 R /Resources 346 0 R /Contents 347 0 R /Annots [ 343 0 R 344 0 R 345 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 343 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 110 448 163 462 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 344 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 203 448 217 462 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 345 0 obj << /Dest [ 270 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 415 176 432 190 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 346 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 347 0 obj << /Length 3609 /Filter /FlateDecode >> stream H‰źWëŽŰ¸F˙ú)¸ *kHęŽ4 dł™Ĺśi3ččLČ2íQăą\IÎ$(úŰžC_łß!)ŮŁx"-,^Ďůř XĚ. Ĺ$[ŹgRúY–1ŸkfÂA XFžHƒŒ-îg—ŻšˆY&XSĚ.ş‘lÓ̰V*fóŽů0{Çoźš ü”ö”đ%ßĺűśÄöEu(îŽóóćJđŸ=ŹÁ¤GKZíÍc|ëu^”;ožůßx’ŚŘO‡reG4íTŘ‹Ż”ąüFŐnĹ^ŻĘśŹvĚűŰâł×‹™d%›ĽŠe ‘žT! ƒĐOÐAÓDąZĎÖł_ Hý,T)ŮOśÉŒĚÖŔWŐޛ§PbŻ˝˙%´~@ŠÓŕG˙­UęňĘ!úÎZüH˘Š˙ˇřűÉ}@ˇĚN[@Cs¨kŃÉLƌ†$œ/3?ˆtrČsB1ćî ‰`VędEáťf“LđHŠ9¤‹T°9{IF)šJÓDđ˙~ÂťÎ7˘˝€ö…IłC8R~$ÔĂ6)Źq)€ÍƒľkfěU K˜ ă„Ŕ&ĂcčĐć)3]I+Dˆ2e¤¸ŚTĉč‘Rß;žö˘(„a•ű֞ŕˇÜuJO*ţB¸ŢsÓý}zěFqŒĆďÜ@÷˝ő ăŸöj'Y(„ŻD,ä٨q@UÄٗÂ(ľÖ=äeűž´~őćíŤ?ŢrAí[ďůP9"LDŽ}˝çRKe–]—ĎźyҲżzƁsŰ-[śŽlłfĹÖ5‹lo[űŮ•SŢhŸ91—€0ŁČÓĐÄićŤ4Bc/ĘOh(§¨Ńíű ”—‹—ˇücžĽöÇ^ĺoť†S°‹Â>ę)皗E0˜.ŕ,ě-BBBČPŻ5Sűƒý˛Ň|~A|nęÎí" VšËMoiŰ!ßSä‚Ďč(5lołč<°r:°9=°űš]ƒFBeüčîŮĄ'đ1ëů(OůÄ^ĹÁ6ďÝw›ŰoŤÁÂ4sýşl?;J\‰Ä%Œâ'ž’aĎᤌă4ó¤‡ĘŠ=ËdĐą,"ŽťŕĽĆGЃ@’Dœ!Ř!ЙąÚKČ˙42dEĂđ]š$Ç=PŤ1óڐĘ7lł ŢcˆEŕ_&Ÿ@,˜ŽŘ@NąFw\zń—şď„żď:Ő ,S=ËŇS–Ľœ˛*}ďě§\ˇŹ.7ĆZŃÚĘípłÚâÝ wněS˖NRëĐľ]°ra”_*Rę<Âáä”x*ÇV˙rÇxΊqMJr˜łd4ýřˆÇ.ńę Ąb“Ö9wˆü0•٤q}âţvIiË%+‰dőkƒLPY84Ţ]@<œÇYéĺÂäĽŰc(”ž&î OAŽx{°voż] ܄Î؆ÎđťĐP։ źÂqź$\5z"×$Óáz,ćIžL‚%ŒŽá3ęçŻlE<|ČH"):RBÝçľGe}iş­ůG‰O™yy:f)”D+7Gŕ(Me”Çgz‰;”ómŤ’ X}Ӛnľďj“rmŽ0H‹Á3‹ëI"<ŽT§çQŻ…;†ržpŞi$ɎdG b‹tď0ˆšc÷šęÁŽlŔ¨›Yj&OręxŔ‰”ŻQr5^÷Ř äüŸ]¨1dݐ=é6ôŔˆL);KŒâSŚçŸ†jźˆíaČůFÇ9˘ŇBĺ>@•o<óh2#;͊jך6•c1Őf O% tčk§ úž•ŠŒ1„"”Yvţý¤ĆËץœĄrÝĺ¤[^ëÜźQČËŕaś=>ÄąXsEîʯآŒĹ0…p5˝žŠčM¸žQď5)T×U};­öNŽwœ™Zć#wţ š34Š"4ޏ;˛Ű°­i¸ŽÝäŘ`˛­Y\ŮqZš$rťŕ;Ԛöą'šŁA×ROÔäjzĹ8”óńc,Ă<Šˆś6ŠŘDłłkzĐ$f!‹ůÖ˝Tž’—<\jÄ}[żŒG °í,€ÓkŢĄœŔőžâפ?ČšŃmçMă Ş¤+÷D÷*|Ćţ˘ ]~Ô §ě@-đ/á[˝ÚhśüÜj< %‘ŹmÁť{śŇËBSîĽbľŠƒó5˝Ę9a,Jćá÷]“řtesú݉'2T8ԚŤńj´'ßOÔŃÔ1idÖćŻ)?€ŢË|š5Ÿ š7Ukz Uu ,żzmýĆîbWŻLőÁ´í;Yv­[RT+mKľŃ`fˆJ":˙úQă媔~–Éŕ‘œóĎOŹÄÉŇěîÚ2‹ý,`aćÄąIIÇŕźk†WĺćPă*gÁ\y’ě }ĆnôÎvVŁČĆťí˛ë›KˇŒ­ň6g„jĆۊľp—;łXłEu°k oN#w×ůŠuWŹzÍł,ë§&ŞR€Ţa$ü4NűzňpíԾњ]™b¨ÄˆW/Ă˙ÁžW{ó„ÁŰ##ĂRVíđ:ĄQŹÔ,Ŕ&Z'`éâN;Őş <‘ZćÖŻŽxŰčÝĘ]‚ł$D|9.75ÓÖT7œ­ť˘-ĄÂşŹ›–•ťťrYś kqôňаuUłźe[c–dĎ)eĹ ěCŕ$8)ó…°ěé`ô#içˇđŒÇš ’Ňťü҅šçP˘l˜ŠqáŔł9ÔŚ(§Ň0÷¨&Ÿ#1äpwŠ-d­]˜ˇŢ—MCfÂ.r’ýS¤Î=ЗQżŮČý¨m]ť´‚5Â7<Û`ÇĘíďÚ\ŕϞcR—ơ[úw̚+_$™@öŽ/5ÖŹláĂŰmšŇ „ˇwFĎylÔŠšö˜[çťÎ P)ežđŸ=đ5#ʐú„Á¸/ť;GÚčŽŇÝ­^хć0 -ďqœŃP˜ •=Q(ÇF=LŠöŘ+šÖť#Që'B_6˛zzźl}Ýe9Ŕ8§Ň:Ç˝I€×\$¸ýžšá5lŠXóĄÜłmšƒę!.~Ĺ"ŸęԘJ‹vDÔ¤đööȞřҕő֟€•4ĹĹ<@Ţź0@őţ7Žá9űw­˙qpkÉmŢ´óśšołĂ˙1ŠěkMžbĆáĺ֑ňŹ)7ĺ™ ô’ç[ î\ÝŚí“ qtéw~ô\mÄÁZ7ű GgĘ“âž!Ęf”cŔ[4Uv đü0ńŇĚ`ƒQ9gM›×-jÔöÂFN ˆJuIţĽ°¸“fÖôĆ6­yś0Ŕh˝xćt<–1ŽŔ~cĎDH¤¸G—\ ¸: OĆ,7ą1AŽ }3NĆ5ĺrŤM"Ŕ˝‰‰ Ş(Ősśw5ŽŐĎ^×&œŇöN}CšĺĐő9ŰU-yEŢM˛‡ťG4Ő˝îÍxÇŤí ˘n°&ľœ€îôÜŁŔžoˢĄŒR ‹üŻóň鍢ř˝Ÿ‚CDJ˘đ'„¨çVęŠRŐ[NđjQ`˝Â ý&ýź}óĆ6Ý´R/ëŘf<Ěź÷łž˛•>A…$xDwˇ1F]ưňUXZzÍOÂ4čĚq oh“ÖJĂJƚƒiôo̍˙Vë]ăY>X(ŐIýkŠ”úěô†âŹoCJŽŁOČ]čÔE”=]ÔU$KZőš Cz‚lnÖ.ŇŢDY?é„] T•˙ˢZłú––ŠëĹěŞX„ŐŞs-ÂE˜ű3›C÷N؀ćهN ¨ß*Z+_mVD˝ ‡|Œň˘6đ*DAAA:&=„ťäço˘‡ŔbBżő“Ď˝NSňÇ)d_[î~ÝOúQÎő]+ţ/ńďvr~¤×ž‰ńÉ Ôď!ad2Ăß]“AX¸ˆ /8ůDASŠ‚śQ,)/cĘKšú ć´ó”Ř=‹|ƒ—Ő}]\Kń‹§a?hě΀4ŢpÔŁ˘fßÂća”šĽfËթÛďň`’sâvî[8˙Űa=îß%ń0Ÿą.z^”*&čtbRö!gńŕBÁ¤qxŁ~Őç=MOş2ců‹űpÎúÇäh^M;ňŮsq–~QˇŃŹ\nJç ŰIßé-‰~U|ŢńQĎƒ>҇l‰Ôî6ąŞ'ŽFtąg­&ĽąŮ ŰÓ<łĘJÍ{Hť§dľ— 7!AW8Œ eνiý,1Ý*5ËŤdÉWéd6ę‘˙…ŘLňY JL§ýžb\2†(ťňYˇNßügíŃ΁PŞ“Çṵ̊ǐGŽłş.`ÇxĂůËćšLr“ç#g/ŇAA†Ö–LRڃ°%~gt{źbĚů:ű=Dí t6tÍhi@ŽfF) Řôŕ6ţŒ=  "śXŰš8Ň5čĚ–Ţ*–n[/‡Äç˙-š¸…°k˝ŰSÖzƒÜ]՛^ž6 ~\űŞîĄLĄy¨PâÇ&ÔI x‚G•ę•ä°“–\¨pˇ¸,÷”SŚ:*ÜŔß;řO‚Aó ŸL?ӄ‹Â>ň„řvÓhű{žá}­_âš\`Ků˜ä~+@ˆç“†C q'ÓtäX‚Tc‡Aâs fsô€dÁľ†•üč׎Ý+¨J˘"mĂY‚´Jq˛g°…cV'zIŚ΃đ3¤ŠŰć)ˇBŽfgösż˜`.ž8Šë“"]ŕΤžůUňʘîRşNöĄŕ„)ÁYl+'‰™'ÜźÝO§ŰŰčhŚ-‚]Ę˙OŻşśŸťJ­Ş32É_ˆÖKÔ×_Ÿţ{#’K endstream endobj 348 0 obj << /Type /Page /Parent 757 0 R /Resources 353 0 R /Contents 354 0 R /Annots [ 349 0 R 350 0 R 351 0 R 352 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 349 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 204 565 221 579 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 350 0 obj << /Dest [ 309 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 206 405 265 419 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 351 0 obj << /Dest [ 270 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 472 330 493 342 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 352 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 454 264 476 276 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 353 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /F4 661 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 354 0 obj << /Length 3743 /Filter /FlateDecode >> stream H‰ŹWënă¸F˙ú)X`ą ŚąBR÷ÝÎŮídw‹b4ţ7)EŚcMmË#Éš´čK´ĹźB_łß!)Kv2‰fą0`’âíœď\žĂďg“ÓŮL1Éf‹‰”~–eLŕ纙đE(–„‘/Ň cłőäô‡&bEc– Ö“Ó/%ťm&X+*&ÓŽ{?yĎ/˝Š ü”?zJř’oňm[bűŹÚˋ|ÎźŠügk0éђV{Óm˝Č‹răM3?㷞¤)ö㮜Ű/šv*ěE+e,żÔEľ™łwó˛-Ť óţ6űóäÝl"YÉ&ięGYE¤/UČ ôÓ0d4QŹÖ“ĹäűŮ П…*%ýI7™‘šÂ*řCľőŚ)„ƒ†ŘĹk/Ä Š„ŕôqéŃk…:=wˆ‡~€ťf˘ŁŠ ˙7ű0°dËě´44—şÝĚĄĚaœ„űećǑnyN(ĆÜŔ}B ĚJ Vžë`6ɏ¤˜ât‘ 6eg¤”˘Š4M˙_ŕ'Œą‹üÖŁK´Đž0ÝĂ쎔 ő€Ą›VšŔfÁÚułúŞ„%L…qbŔŢăĚĽç\Úíđ€(SfťëJl‹ě'ŕÂ(ĽSŢóťŠ|'ŠB¨ŐčÍܓŠ_ˇŰëźžĽîży$׋B…řxĺYkZ_‰$Ţ ÍŐhy[ů? ź~cœfžJSť-xí2˛{"˘ƒ]ŕ8Ý 8ĺˇăxI˜E˝âáhY†[á5ihEYxVŒĘľľ'`7(ÉTo…}k† űaÇčüÁ}čÚ/1e'ž’cFŃk‘n=@÷âR]7$*Ü‡wÔOŻź/:‚b™ˆk°őąŽŕô4¸íüŕ;˙]7€0O՛ňĘžîó×]Ŕ_Ś EEJőÚ$căe¸•˙ë(^°÷Č.‡›ž™dńXĹ~ű4ÜłUdSęyyťŤľIq,˜*JŢ!|$žËSŇŠEEźË㥽5Cƒ\Fń€ (×\lcsÎXą$ řC*uLĘŘÂKŔ3ťMaٰ§š1$‹Đł(Ţk˙”Ť˙bĹw)bcݰČG^)Â.uËţŞ›jľ3×ŐzŮ†Ý—í’Á@:{şŢ>_ëMŰ`áŚ)›śÜtT^Y_xÄüěŚÄšäS|¢Oá‰Ő 4„T.{Œö hĚŃOꄑlň“`Ղ¸l­&附°? Z8V: Zt×Pp9ƒ5ŚŽ‘|Kŕ\­7 á ĽmîÜçZƒŒ?á'ö3˛ÎeöŇe­{ÉĘăÖrŻ~çEľ#lue˜Xc}[ąŔˇ×Me×$)š~ś8kŘ\7E]Ţč9+70´­ câŔNXťÔXsW–^­Ź/¸ő„Š"ž:;;a_ “l*ňR3Ť×ú`YË!>ő–IöžKČłnXžhuÍśŐ˝­?t=ÝmĆ Şîő;­>aeËʆ5ůB“ΐȕ3s'Ů㪢jWŰń˘Ź›–ÂYužËnô˘ŞqƲtVš˝qH%{¤‹T[Ž5+ƒŁÍćŐćß-+ŹóçĆŁkíBçĆH•`YkPěP‚RW|śtËśuľ…ŢĹŞrË sĘß)^č’>s{‹›ßt§ßŻôüVSŹé°÷fេBrX : ŹÉ#í4Áuw!ÜšavX÷˝×°:ZŤ‚­xšţŽËDIş:4áX™[čű‚˙ ČGQýXč†ô šęQ0⛍…"âžűR”‹ťÚVҨĽ€Ăĺä-9jÎ쎪ÂŐs“´÷y‰uŇ,D•+rÉĄďÁë‡ˆďśwĘü$„Ú|ĺlćŔűxqA`ęe˜ü—Ę9iŤ{€–0n–ŐnEÎČ ˙67†9Ň Ě şR¸ʖíeËžF!lˇPŐ{é\NCPˇŽ[‘á3N oKŻ)§Šu–Z4—gČěf™nÚi[M) ŻZ¨ŕĎ{ZťtŸ5+vľQ ý'ŽúŐă§ÍÓÇ#"Q&1Ń“ŹŠŞŽřŮŞŠěşM5ÄźZ,ʢĚW64[]”ř÷œúy˙lÚźŐ͑ůÖ'¸ÂfĆĄhř˜sYr5k˛a&čbťótʝ&’OÉţr4 `ů ˙ú: |j×Ŕ“ GC&÷65<Áú Ťp •oč9Ѝ˛saÜa~č?`čTíK–AÍâ(ę'텰uÉmŸb3ˇ=ŠV0î2Í0Ä/ŚóqgŰ %JzÓ¨?𕛞-ݞňÝ÷Ľë¸Śˇź@ĺ„GŕáG‡ŔV7ŘŻ7fÉĘsŮš+ÖŢԜ˛Žěžš[ťkL…cćör“ÝgČĺěƔUp›źÍât ëř`á)KT4{źÝŘφZŔwnRU0•ŠĎĆăAšúa$Ýű NT_“H6˘0Ď2<9ćđ™ažô„ççĎź$Ř'CÜďëß°ŻÎĽ źS¨­ř‚yU¨—łŕA‰ÄOsÄgHľ)ˇ˙`KßŘ­”HôŁ0~ 5‰ŁcöHGvĎ)BĺÖ<žÚ+Ţ?¨~˙ś{Q‰‡łł§×§8Š'ŐáDngpJ9ű(E”ŘiԚ)mœéĆfxԘ4MsĽ™k*ŘEFpv3óČ6ůƒ¤E†ĐxÇŔÓĚBł"áӕŮ\mn™˝˘taB§hÔ>fŘăuSÄPTFŃłŚ^5… pöń1NŠkóŕ­j2Ŕź^ƒá—Äá‘l<ď!G'üZ⩇ź wˆ§I”ÇrGăá<:ᡁ3€“H˘‘Cąâńp°‹ŇÎuť˝ÎI°úöĘ@Fý1¨Ż¤ş¸zců‡8ŇňĐTqPîQUÎţóóüé\[.AFv°łMAóKłéÂÖŹywiţ‹E• &ŠđlŽú‰5E lůč™*rg˝pťŔŃJÂí˙žV€–Ů1’] o‹çŃJÇŁutĚ­ušŠę.Kźí:$(eĘ"c]˙Uň=/Ͱ6 lyŘ1đpŰfgżą›G;śŒýa휌ôLńË,qŰÓIłŃ6úîyjJŸWĄ8L=t6éĂS~m’“14žőˆg=âąEœrŽ.ލg^Qs÷Š1Ěޚešmvö›ƒÚ<<´xđdÄÄ˝%â~Kô{ůH•˝YSš˙+Ýf˛KjíâáUđ|XFĽŻ˘ŻŇĚSR㹂RŒf›ăs~śQ tŒUzĚ6r|Ľ{|Dů‡qŘM}Ýu„'řƒ)Ď_ŽNűv;f žš(˜Ř˙Ż–ˇm(şďWp)ubROg¤@Ń-:łp,zŹ@–\‰š`ň)ň˝=÷^ZrÜq­ĹxHŠ˘.Ď}sż—AÝWarUF>^‹P É€Ę셚Ay÷N} ť?wňżW˝{†Đ §5aů‹JĂJ8˘öwœëáÉAÍ5Ĺąœh_žó}ż\Ü÷Sý*Ł.%IâtĘD¤ŕˇ8îdŮyޤ>qŽt•#&] ‘甊4¤şgHÓśŰX“ךukbŘaƒ;íÜúxE’ľć3ťVŕźĄdԑAřđ;\ Ó%ů˜Á)ĺYŁo“é î‹sŽ+źdΡKž(ug1áulBQÓ¤˙ě\â¸AÓůľR'PĹm˜Ň i]i9šż<ç*L:]S9ĂTÎ0e“9ĄŁ@őŠif¸?d{]K­4žFyĹľň”aęv26„^‰’ÄŻs”Ý.ń4ůëZMßVpç\ŻeŔ3pĹ \*Ŕ!h>´öąá§8#‘iňčđŸ•D/˘ŔR‰xÔ*—šxá‚°•¸x=ńl`j¤ä–Íé4ÜŔÂ$Áăz5ÓSуŮSt…&ú‘>Ot\#Z7(ý=SGdܚ?˜ŕażëÂź?( ˇ ˜ęđĐS™?°úR´+údaíbúU~_“Wj_ŰŚţ*LÄâš|EjşNaĂ88y~DßQ]Űŕ0Ă,Hoč ž O1Í÷˛Ń kEÍ)›šŘfşghbv‡´TÇîKź*Š—÷Ťńř‹jępcž—b§Ú΃ŸőőÖĂCݝm€[ˇ% CáTî•.0|‰yĂPӅóęŕzÚź ›é>çg1V˝|žÝ‹Ż@ćČP'Ÿ˘ĺ$Zń5šR$˘ń¨*ˇłcC|Ň˜)Í Č\Vň3Çq|ɎϿƒn‹çš“żƒçsň<ŮőÜTŠŮ[g›[O pärI"žAGţŁţO{•y ă0”¸üœÜ‹eŤ†Ł“můtďDš,śŐ@xŻA2Ý9T–{ Fź$^KÄpďšfKÂR7âşŃľÚ°we‘MDVŞŞCLWlşxĽöĽ˜ßˇŠ˜gʎŚwHĐŐŰaBBY/Ô?‹śűp=j’ˆƒďG_gÓ-2šĹĐœęŕ Šç¨ˇ„ş`ĺž%IŠˆPác>Ü˙ôďçčĆr endstream endobj 355 0 obj << /Type /Page /Parent 757 0 R /Resources 356 0 R /Contents 357 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 356 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /TT2 776 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 357 0 obj << /Length 1909 /Filter /FlateDecode >> stream H‰œWݎ¤DގýçĚ44pšęj4łÉtb̎14T84ŐRŐ;YĂ _Á×ôüĐ3ťk˘é¤)ęďü}ç;‡Żö›Űý^Aűă&I˘ŞŞ ßVq§Š‚"ËŁ¸L+؟6ˇ_ŰËŰb°Íćöťťě÷Ć1^Ôlśóđió.¸ ˇI•Á‡PĹQŒőŮőx|o.M÷śn!ÜŞ8ř>Ä=¸Ň§ĂíŸÓąnú1ÜVQ<„ -Áw—ž•M'žĹg’ě’8¸Ó[xÝöŽ7#„żěŘźŢočaS–Q^ĽhH%*ƒ,͢2Ë5-LzsÜ|ľ˙¤eTeŞ$űÉś¤"3c1đksˇ%*‡âŠ` 3üďQŤ8JIqšěBúw˘ÔíˇŢăY”˘Źý7tUł ž÷ż]ĹuŤdYšąP?"É ČË@ƛP~RE;t"I΂šź¸ ŘÝ7ä$rłRW;šČpľ¨â Oâ-Ţ—1láĽhŠ,‹8ř; x[?„$D‡)ËŞĹÍŢĂšŠňXýgqŠxÇ{ź Y-ô!ŤŤ-$ęŻ$#ôX ŻÖxő‡‹Óp2­†ƒŸńŽŤëgsEs8ô 0Ç儒ŠVîUŤ}*x…'-Î=Ô3Ő(íFG! r!á"[ŕŸřő#˘ąstĺĐŁ*řCŢŁVóř÷‹<džňO$3 ĚehÁŻ#Š(°4>đxđ{bkd| 3żďCž9h1ÉВ'Ů= ĐeŮuţĚM ţ.u8MűöZçĎô2iĹű/?‡ÔŢY=Ąś`/糙0(>ŽŤÄ• @w˙l.ĐÔŁĚՃ5€ďcŹ8ܚT…Ž—+:™…óŒűćQ;˜Ňě+Š#† ÂţtËî>źÁ‹ĚĹ_łŘđ™H.î!Á yĄc_čIÜ'\ÖĽ\"ŮŁ›Ĺ™˛~á“VŻ>ďŒuŕ Řł÷sëĂv'ŽďýőM> ń˜uŘböůč1Ό1Ć\ň2űq•ď‰)ńÔC¸VÉĚ=ŮBwÁŰ;őëƒvϙ**uÍTĺ˙Ň3Őd.s Oő{=q>5KNMÂýś@ëfÁ°zpŽişDĹ-ËBíĘl•—/ňr‘Ç’ H €9jŠNŕ$ĽvŠţľ€({MdÂ9_ř^cN§zloPážé‚ŹhőĚąvnŞG{ę­7“MLh ćäZ‰Ž¨B”Ţ-JďDé3#×z¨îČîR•9ޟHiscšžÝž'míeí(Ţ|ƒŠÔČ*"wÚw+Aއ˜a{TťŐď{6i1ůɌ:ř´ĐŐçEžŚˆwť#üĺŒĚ”‘™č2AŠŇłá˙G^Ö> endobj 359 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 200 554 208 568 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 360 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 361 0 obj << /Length 4743 /Filter /FlateDecode >> stream H‰œWÍnŰHĆö˘§č#šcŃlţsć4‰3ƒ]`6A,ä2ŮMľ,îJl¤ěĚs$Č+ěkîWUMО#g°0 “ěîęŞŻŞžŞzľZ\ŻV‘ŇjľYh”eŠBüšÇ2 Â8ŽTž¤AXÄĽZíׯűTŐ=o U_/Ž˝Őęž_`oBP˝XŽ‹ß˝[Šă đţđŁ0Đ^[†ÇWöXoßUkĺ/ŁĐűť=XôiË`üe†˙ÝŚŞ›Ö_–AéÝűš–ÔŻÇf-_ Œp˙ľÎtčݚڶkőfÝ m•˙ŻŐ?oV ­ľ(Š -c˘%*‰“ HMóHufąYźZ˝@\ed?ŮŚK23_ۃż, ,Ä)Żóü6Đ* bRœ>n}úDŠë_âIăŽŐ ‰ŞŢ_üŐżgţ€nĽ,   _ęžčfƊ†$ÜŻË ˆtsâU„bć1ÜWÁEłuŕ°š—Ą—ęp éaŞĽú™ŒŠhŠ(ňĐűoŕ*őŽş÷éăÇt. '˜Âi¤at`ؖ¸XKlQÖîy;+mIĄ mśßŘň(."ą< Ô­é 54l­öޝňŁ8D ˝sßí`kťŁg2q˙Ąžĺ)"¤,ŚËŸĂžÚšg˜ĎÁ&Őčƒf´8ÜkťßŰŚŽÓŤÇfŔrÉÖ_˛#ČŢÚ~PMĽ*ŐUťŽşľ¸ďýí2‚Šl \łÓStd“š™¨Ů´ƒĄ"Í vźi;őůőŰßÔÁ˛j™× ÁŮĄf1’PŒĐ2+´ć˝Š“ą!H3„˝wƒúč˝7ťjhĚG_ÖÔŢŽÍŸňüŘš§‡42ľR‡N|$­ţ&š•L˘ŕdTâ}:śŰą2…dÄÔ~JÎćĹýĄâˇĄšŰ~"ˆˇŹČoěěX˜í­HTofß2ťđDĚN^`ÍŃm ř‡â@î¸ýŽB? ţżA–’,snćbzŸáwbvd‚\6b%^Ď'Żç‚U_íÚ0ÔĽW ÇaVőŒŔťŰëhňyÇ)™cOb›j9hIďÜŰď~8V=TőĚ ›6–S ë `ž{:sޚÖGzëfł1i‡@ĹqěR*ąOVÄbĹĎťQťÚI˛E’lšŁŻ˜#0u)ˇ…Ź4>"ča8Š{f­†îhČG°,ő(3—˛dŰg_: žŔéUÓ2&‡é*>ÜWŞ‚3Zóx! Ëɒҕ?ć‚e]‰(€…Đšk§/ăƤ”†ŃáXq Ç\V œöd×ç×vgż¨ľyhjCФIńÇmSoU<l7¨;ëbŢů=|:Ď@çřs˛ć| ĞŃ)˝Y2G ѤbÁ|aŤ‡ÄCšÓý¤z—ŞÎ;K铠ŇŃIË;łłÁG_9E]9E3î$p€Ň3Öe2ÖKřĚ÷ęÍ‚J ¤‚|ŞŠvĆqHƒ 14ő_üÇ'gí Š™Ĺ/T BFjÖkőÍjÔ´őî˘AďľAq1AAŰU­xÜހŞ˘„Š8Aďdžîý'WÍn8ÖW§×ĂîHąőíd&…][уá;đćĐĄ,Éu…#œ÷QVźÝHÁń˙ÂÖŤy ÎË`Ż8ĘšĚţÁ§ÔűŐ-k~žĄé¤_*úÝŹŢC×ȕЀ‘ҍĘL‡ĆÂ8¨­Ű˛•-ęÁܝ7Ě뎲3}ďŹ{“C ‘{NŃ!Ę撒)šíÁˆ”n0ë•úgĎ9ś ż<) äÚA^Űu0Łb”đËTL tÖ´#őĐ+ulŇzXi7¸[™ř–{•3y9ŇĽvBÝž™÷ĘĎĐa,ËÓ@U¸jœšů.¤ľ)¸îöß.&zlj´vMÍGocöŐNŚ5&DĚ>,˘óřŃ˙‘‰w,Ň ą´¤ś&Tî1Ž%yœ¨(Iƒ$AK˛ÚϧŘ3?šr óÖÍë›gsh„EĎ*z4ľúŠkő˙i „Uczč}ŽĹţ2Bë'łtN˘ç 7oV‹X#XShBR„™ş\Đż3‹ÍĹuüĘ:X2*gëeĺĹَĺvä° ÍJ€˜x˛~á†Ďú´ž@@™Ÿí(PʑKo˜Ö/ÜPÄA–ĚÖCš^Łů–¤Hƒ¨¸ˆŇ…ĺé‚ Dph–Žëč¸| ‚ěÎvLF\Ú1)qé’WŤă6ÂäSäś˙ă˝Zvë¸ačţ~Ĺ,ç.<˝Ľľƒ-Đ ˆnŠ. ÇÍM8qšţHżˇ‡ŠŃľÍqWÝŘW‡:”ŽČ#bwP ŽÖN•\˜/ń? :|?F4 |ńÝxKüsxlaň ÓϏŚ>ľ¨HŐ8ď0WIMˆƒ 62îšŢ)Ădž6xČ汇œŸ‡=–m„ &xČćj0_ě6oVș`FŮ}- ÉXóˇÓ á>ŘŁđć!(UĄ.ňPuWşAĚ+‚ĘX.őŽRĄß×G*bߏ‡ŢČR7__]ż˙V§ŽŃa<=‰Hk˘ĚW!ŕř‘ÚĽ!NäÚ^ĎHÜ}ô.hޤQ2ÄBůú¤3Dću†°‡ĘžßaˆA"t†hYô,ĄáˇĂöŘaˆęŃAh‹ě3Äœ’-E]3Ž+†'.Ā Ÿă4#ˆ ź–VKüŠš_AŰÂ2ĹϤ‘ő™P•2ÉdKö)ücÂ/5ŇCFŹ K,:#d^g{¨ŒŕůFh„‚Ag„–ŐĽőeěąĂŐcńř"O0"ĄĂă„&4ľRᚨ1@8˝x‰2aƒ›_ÜŢ4Ó”5ioúű†˝Ž&$*k˙r\ëSőŢÁ› M¨ŸťLŤÇÎÚŠó´~čÚ÷|沞zäţž^̝ŔşLP:e…'N;@Ąę,nŁgq["żéb}ĺâŢ>'mć‹vŻqöŢĚŻŽ•[ô#Ńp÷–˝Ď~'ÉŕćOŕ%˙łĎ<ޘˇÔIţŚÇY"žÄA z+xÍMâ}˘W€Ÿ9jńHý@+[”žĘ#™×‰Ä*“x~‡JZá’`ĐɤeŃłÄ2v§~ˆ‡^?tB[ä Fy }ámď(aë(üŕI˘?k É­ĄX‹4ŚČPî&í1{7 ­›Cj? žĄŢŕ•ÉÁękŻžĄÖúˆ"—Żđp°%řőKg‹Ěëla•-<żĂ-‚°E0člѲčYâÉčÜ[Řc‡-ŞGĄ-ň[p„`BĽÄV}’ăⓧs:H×8’Ŕ”9>Ég——fĚtůÇ!âčoş|ިf+Ý50é^ŢPéó×éŽýC*AÎH”źiś‡qx|Ľ SDćuа‡JžßĄˆA("tŠhY YÚö(Â;Q=/Šŕ,m;Ę=˛Ź Ň$™˛Ř܋íŒK+nţńŘzĘ˙F:˙˘żuűźNöPiÂó;4Ń"MƒN-‹žeÖř˜ŒÄŽËúűßćeŸdž÷iđčűÔ0<˘”ÄC[[çÍ6MPLŁGßIu ńĐÖČn‰~˜_Ą¤œ]ú^k{)ĘOLă.AO­Ž˜z…䡾¸|Öä _Ż&÷÷öCşłá’űĂűˇwˇ×íMĄŠíšyš.ŽoÔĄĚ%¤Xľ˙ŮFÓŐͧfŔ?´ă덥ľŢ›jť>żg§›ťŻý=;˙Śó‹Šw.Îfú ÷őCŰ˙żęôóôëoëôć`|\܊ěKY 8ýą[,vڐ÷hřő•féa[ĺHČŰÝüŕápՃ#đXÖŔݒ:|`JĄú <¤„>/˜ůëÓŽď&˘Ť­iL‹-T¤óKččHţ1­ˆ}őŁPć1BiuKĆ6ݰĽĹúź`ćŻOS¨i岄5ŒiąĽƒÂŤ%۰=ScZ¸Qɏ@™ăĄ‡´şĽă›WŘŇb}^0ó×§)PZ—ĘŹnHK, %bńÖuЍ ĽaHËŽaq¸ł›Pf?DhămÝÍRI†-+ô´‚ĚwĚíë{)Ô´ ŹfL‹-”C5ąfmé^Ř1-”™âíŕ”Őƒ#đxHŤ[0 °y…--† ósűú^ •„Î÷-Ł‘˘í},íŢ!‚ř4&!mš śŰ DŠŃąN"ȸ­A_°%eˆYňŕ @Ç5xL_0ŠîÁ({„Ó8CwFĺK]eNňi˛žŁĺŃ VŠ<’‰4 ™˛B•ŘeőP$ę"…ú–u1×,”WˇX¨ŃŔ…—ĆßÖSÍÝ,2č‘[ĽôPQś•őX # Ś5Sç›7›´ 4GS(Ö7g< 2ŃóT38i*˛Ą1ôĽm73šVGńŠdńíd] }Xo{Ŕá|ŤłŘŤÚ rľ@ĘňŔ™×PŘg*ՍmÜŘăăf!píîđ8ĂđĹĂm5Hʊ3śËB2¨ďŞŒ´mŞÁ[1mťjʔaWÉSßŐîŢś•fš°´}Ľčľ‰Öm5Î-$xWŁÚP†]%K"eČťJO^O"…wŐ8,—˰Ť]ZňŽRž+“="ä2îQ0Ü9Ř#QçĂŽB_ćqW/˙ˇY| endstream endobj 362 0 obj << /Type /Page /Parent 758 0 R /Resources 364 0 R /Contents 365 0 R /Annots [ 363 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 363 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 280 480 333 494 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 364 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 365 0 obj << /Length 3799 /Filter /FlateDecode >> stream H‰¤WŮr㸭źę+đ&&M,Ü&OÓöt×$3.KŐ/é<Đm1‘I•Hş#™Čoć\\$ ž¤RŽ’I¸ç.ç.xˇZÜŽV’ śzZEÁbüšÇ"ŽbĽ$ËtĹš*Řęeq{×%lݙm1ë֋ŰKÁžťöĆ1­áđxZü•/ƒP¨(çßG‚7垯q|Ő×ŰO冥Œůö`1 -}„)ţžĘuÝaü9´Ä>ëýRŃI‰łř/D*bžŹÖmła?lęžnümő§ĹŤ…`5[äy” †ˆHHÍ´ŇQŽ5ƒŚ™d‡jń´xˇzĂ* -s˛Ÿl™[ďÚ}ćPâ?ż5´Š#EŠÓÇm@ż˝Uęö˝ó¸Ž°V÷$j˝ŕż VŸĹşvŮ:TP÷DČL’—y’€/Š(… Y󒼘răîršYĘَuä°š1ODBzœÇ,dߓQ’–ň<‹ůżu(öŠ|¤ KÄčfçáDFI,˙ggqÉ85 łÖĘŃZi­ýKĂúmĺŹÖÚ|äÓ˛/›1Y#aŐA”˜,¸k_ۉp/í渍Řęg-ŢŮpŹV"ś.—ĐÚEČŠĂĚż~˝ N~œWę ĽoŒÂyhŐŮ× {$ ý˝ BeL:„2‰`}z&“P5 UV(ŢTëž=°­ăW‰@$ź3HOínמˆyo(RgŔmýw''ŻK÷=ŁD K3pC O3Â֑Vij Ҁi†,c9#wPv+‚Ľ9( DDQQ’Ú¨űÖńëÖĚdZGĽÉDzś#AœĄNšË¨p:1 ţňr݃ŠHĹŮA%g ^”ŚĘ‹0­_G1Ň?Vo!$H—Ô0,{ä' %’Ĺ/_Ĺ`zâ˜ÖŻ#¨X€~é[:‹âDúĆu‚Î#]ȡ ´ űĆuB‘D2Ďß@Đ:ŽRźřŚőëZK´Ái]ŁĐç9źđZĹ!<ËS. š"Ł<×ŃüWš@;Źós.{vL\źžaN&ώ<;fÁźžc ώÁ[>o Ł`H\=sBŚQ– /ŚIŠ ąu-ÎfMű~…*™đTb1”`čŁňÔÖ`*zŽ-ÓYW~oŮý÷ÔĎ7ÇQ]ÝŤ•DZŠ –$YŽĆ*nF"äBťśMgĄ#˙$üž=ŘFz H‹Wҙâő3ľ“Šó0QPŁË 9×=œlśC:?Ń•ňş_›.šAJ2S_ڍÄ"raEüTŃźo=ő¤€žź–ßţ/dme\ˆH­„ÔÔ3jęŚáľÔŢřąŮ˜˙ö|"ÉÎ"7?Ÿ!ŠűžmXwB˙߲şŮűŽ}áŔěpĽ,› KžřžŢ7ŰMŻ—|ˇ {Üm[ô×Ď č–KVíŞsĘvŰ3§Ž™Œ*$V…nŰwöXągO6Kc¨"Đáxľa§me& ™†Źu{8Đ´ƒÝžm6ucKh!O Ž­wm)°i8(L>~ ˘™˘4OÝ;ˇŘ0­ÚăzűŠÜ8ËؤíŠ>@&Ě'5yÉî߅{Ş^ʝö .ŹF{ÄŐ)đGcAW[UĺŽ{ĺ4čňŐůáţ†=)fîWřşZŢ0ŒpüÎ,ŻŖ6>ŢĎt6ŞZĹŤţäÔ˛ŠÚö§–­ígқ4îXéôZýţr쉅 b ÷ŻËr놽0K'(NüH ~¨Ŕ(ŁCˆ \°’ €˝1ÂŕnÖ÷űöĐłýîř’ˇ‡!á~WšŃ\ńo ™ĆxK4’xż|˜zŚî8ŇŠ;ÄÍK^7 Ż÷lâ‚OäRnë2Ú<~Yęr7ąľÝť‰ź2„Sźě뜁 _řÇśG˜ˇeoâMS5QpI5†˝ťţľű˛Q›lîž§CűbNĺŹ}2œsŔBÍá!óşv42úd&ťáŘL'łá¤ËŽ1W ăŐwˆUżT˘öč>Ťn)ĄY´/tĂՎt…t\ĆrK—&á„@\Á)ó•ba˘ĐąűĺhţŹŰS¨Ag˙2ĎMŰłc7|üW+מXJ”'aľtˇ;t™"2˘ˆD“>p$–܇S˝ŰÁůöĺHť›9œ)‚Fzů|l÷Ő!ˇD. IUGřۅ ՟Ő=9 ŠŞ­h”‚;—ŔßěŃ}{B˘@Ŕ§ĺ­4Ç#4…Yĺ”o”xJœ§vˇkOcŢÔŽJ–śŘ¸Ú_ž°Î¸ŃmOá2¤:œUQPšłʞUkۂˇÎ4c•ÉŞ †–SM˝vu|śÄI=T—ŚÜ÷őş›wçËOA¨ůŘžłŇsÓr•éÂĂóІŽ:Ëě¨0^2šš%žnŢ q†â??f7˙Öl"ó¨Ča˘Â"Íň˛˜Î#2Î&)ŃS™ŮDƒđa@e ŃŃT5ě÷}cÝ7s˘ë‘á)Ż^ŘĆŽťŸ)~˙őx"s… QęiĎvĂŽPđË#ŠT}­KťĄ§Vc3Ag1'3ĚBšAwd˝(xPÎí݌źĆćQ{jBaĄŤ}Ő̖śl/[ľi.ÍKT:Xq„  $řuíĚdž°ýÎ8›Ţč+ţĄIVŹBF÷\B…ߏa:6F0 ˛9ÚŻů%ţŘQĎ*Y1R pęűTžCAeÖ$(ôąu"3Ň ž/MŁ+'z5-nސäؐHŁsöžŤe7ŽŢç+ć8 `ař&s´8’ ‘ ř ä`­eÎJëdeŘůűTusHndĺ´Ëžfł_Ź.j{™ĺW]‘“˜eđßŔÎjü! Ş­’lŮßiĽŠ —Á˜Á(SŔnɁúă“řžĚR!\jÝ+Ë)&îÜíÖJgôcŽ•~ĐňďŢ•rĄ‡=Ń4éř¨ŘŠ–šo÷‡ÝŸ5ŃtX^ IłĄYŇŻ’'u<íŁVS6J"Nł§5?jďo2c"Šđ=8§ ŇEČÍcýôA׾UçŽ.`ů&ƅ ëĎAőżż…˘!ńî<Ř.Žaž¸€Yçë‹ÉĚ?áĎG“ĺ‘ƒ×â%Š;ĽT˙LŰ‘+żâ‚ÚAĄńľ:BüË?o i~ů$Xš¨Yç}–' >1“^X2ßCUű\ż|ř­ŞfމűP}CĂ-k„Ź=z\}ôüxĐ×!¸ÝMg˜¸?3„ŠOuůă‹ĎŞ˙1$”‹=I˛É¨†Gœ.Qâĺ0ÖôźŸď$żźßPŞ z¤Œ”ž  QAUđœČú œŞn—ĹźnQuuĎW¸ŒJâIo¤Œ/H˛ÎY¸žRBĹk˛ĄU°ĹlÂ,rTBşĺ.ŮDĽ,Z1QŤë°})y˙Ýó˝Ř˝TÍɗ˙ô&‚6¤alÂߍłuéҞÄ1„\püBƉr‡ †ťqcuŰBF{˙!xj‚tş °Řł…`­Ü—Ëן.pîŻIt=4={d6ź€ĐBđ3?’ĄĆ˙öFn?î$ňUllŢmÝryÍÖ˛ËŐĐ.žh[ÝĐyžšŽ† ×T9wL2\ĎăGń¸‘Ó'÷ ˘ŕpłźI˛|}]JŠ=˙žBŠGą#_Ů\qcšŘڋ]%~“Ćď~â˛ŕĽ]r=K2’/ƒ! ŠăśM% DVËĎą?śKŇCMŃCŤŻWœűJ8G{YÇ5`qXď&Âz<Ń@#žX¨ëzwl’$Ó,`˝:ßϨëÝÔźh›ß›…Ó8ú`fëG“dˆšÂąćVŚ'4 ňƒŠÄŕä™eˆŐvŢłÂˈO:1ŽqÝuÂŰë=$<ĘÄD˘ŠćŮ*0VB=¨’ÁƒîS-u—ôRoć[ŠťMĽz)ü;âö"Z endstream endobj 366 0 obj << /Type /Page /Parent 758 0 R /Resources 370 0 R /Contents 371 0 R /Annots [ 367 0 R 368 0 R 369 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 367 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 443 227 496 241 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 368 0 obj << /Dest [ 366 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 360 200 412 214 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 369 0 obj << /Dest [ 362 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 416 186 469 200 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 370 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R /TT14 659 0 R /TT15 662 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 371 0 obj << /Length 5725 /Filter /FlateDecode >> stream H‰ÄW͎ă¸FŽ~ &')ŠER”ÄÝÓN÷îd“`Đ{™ÉAmŤŰ ܖcËčL^#ňyÍ|ER”ě6Ýs 0VŤŠŹŞŻžúŃűĹěfąŒłĹăŒóTkÍ2üs:K3)+s•f•Ôlń<ťš=(ś<ľŒ–ł›sΞ3čf.ZΒáńeö9šÇ —i}E–ňh[ďúÇÝqšžŻW,NDýC˜Tú&N üîëeťęč)ć$bŽíĘžič¤ŔYür^đ,š7Ënťb?ŽÚžíś,ţóâł3ÎZ6ŤŞTi‰@xĘEÎr™§Už3xZ śofł÷‹+Č*Őš¨(~Šk 3łŢvť8Šŕ"ÄŠhçřż…WY*ÉqzšŽé˙Ţ:uó“C85ż‰ ü!žÄĂq1œV*ÓL0— žűŇȤć5ĚłĐ:ĺĽ*áz™ŠŞääş?éŽ~ąĚá‹üUÄYiž{lDI i¤ăD!ě ńćŸ’Ł,‡ˆm˝•ČPB‰ÚbœčX#Œhƒ_˝‚AŚY‘˝†ő™ćŠ!hš06yš+YŮ,qv?‡×:ş‰KÂ9F˝ĆʅBüŐTCPďđHB*‹Š™š"PÄŠxŕƒrKń‰œŸřčđQŇl-ů}â‚88f•žFA§q…‚Á;ŚH4&‘^ś2äňoPĺœsZ"ěpNnZ)i(Ů,j$6¨;ŇžŚ°™옠đ8ž˛_ŒîŐQő_›TĂ ň>çŇůŹžŃgŹëg>O‹¨@óřÁ"rň+Eä4‚EääWŠ(ŕƒ§NPîŠhô1TD}}ôÔ â4ŕˆ=_ň‘šJ‘Óđô5<Ą;F$‚>Ґ•1’Đo‘ÄÔ%î=ŰĘĂžtß˝ÄB›€2Úű*ůúĹ|űüoËäŐ>Wą[ťÂš…nŽuT_¨ƒť( ց“_ЧŹ'żR|öƒrWŁĄ:řčë čŁgO§Çu"ŽŐÓ¸RÁ;F$‚>Ґ•1’ĐoÔžS*…3n˜źúňQWž|nŠ;ËčO1œČŁ?šď ˙s”ěÓ7ˆÄ—Ž–áqň+â4‚âäW $ŕƒ§EPî dô1T }}ô´ â4ŕŹKy­@œĆ• Ţ1"Ô𑆬Œ‘„îxŁ@2đą„î°đ{Î<ˇœ+â¤H‹ł…ß•mţvg oţڍZB\tň+\tA.:ů.|đĘGC\ řčšôŃg0ˆÓˆcŚŐ… JăĽ,‚ŸŻašÍÄ 21jL3A>\`ťÓŮ´čVŁ8dRhLru9ÎA#hă ů4ۗ- oÝ–[žL4|™hLřrÉA#hC‘ü ’SF]ŽsĐŮxKN=…: /mSqĎ DJÁšJU`ČŃÔ'Ą™sŕÖÚsœcóԜŸłĘ4g376ŃŠ%ÂvÍłHĂš"öUjóYEV“ᑺŘOíÓqßĚĆežä)Íö2blŢěńRE-Z[TۡzNĚBĐÓc—`I0’Áhţę¨^ŐťŢ^ˇGœnÂ;|čŚyZ”™{Ž]ÜyťX7ěąŰlş—vű+hż+xČžjۏíë}ýĚĐWĺş{9°'Űmßě—ÝvŰXŐeßvŰ{hú—ŚŮ•uwčąú ž]ˇďY˝]™×&†ŒRNdˇ8Ĺ˝{Üş7§ś}9ĹżíňŔnťç‡Ž-şăr 1ÝLWěš[7ÍwööĘ  0Ăó€Œ:•ź*ž•88VÂŃéąo"tÓL`mö'!ôÍ3[Ůw-–E„ţDéyąôk‡Ąaľ6ĄžĹ%ĚQŕ|NŤóRŒ^šťč÷íĄďöí˛Ţ°m×7‡ďNWÎ3g˛pN@MŒéŽř˜néÓí0˜wĎ ë6ŤfĎLćáşÉ}ésżčLĘe„äßی7›;wD/CCYŠĄŕZřšŰw}ˇě6ăBíň…âšó–|(G—ťíćëů2M[Ń +G`¤űâýžl~Šo;œE—çW>fešňYö œîÊů4O„t5ó`BV dą_ť ;Ôě.Nđů˝ŠÍčĆAc‰tą v‹be´Ëëč§XAUŽÁTˇŠŽN߀{ü{8ö6ˆĹoá"yőŘîŸ_j´ ’Ž%5"@ëÎŮ[œ´6Ňçg“Ůčl+°Ő‰ţ˛"ň Á/OĂiúŁýť=טCśu¸~ĎÖÍvŮźóž%“Ěš§ë0"yŠ0D›c˝ ™a0i "|ŘÇvłbľ5aűěŕ=ďLăŁ~+ éţx çĐą:IćAmœ—ÁŇ"˜[ŁŔžG:MۤtY); @űôؖ-pv$şœqŸGcb][˛"řÄk—řű žŇŰi(ž‡¤wqhŠĂČńŽ5so—ÍŽ?óýU÷ëşg;Ü^š ÔČAâ=“äLهÁóî‘Ý.ćěKth‘V[źćM{@7Ű7ž:cCۜ̎â´×|Ž Z˜^Ô8DfŇězĂČ&—j5úÇ2J'7ęĘ÷ƒ×Łý#Z^œÓŒDŒćĄ§‘Œ†Ý’›púźÇ "KŰ6ĚE\Ž=ćĂą]5ďNť ŚŽž¨ ?…›‡ŒÖ€¸&ęq0jˇŢ×—Ş gXcu°c¸ƒřŽqi€áŃŇź_ߓr˝ú'ęĐöÇf°5=Öîq~Á˝’6gżłö‘\ŘTÄ7{‡ˇmŽóȲ—OoŘ97Ź{+×+QBĹyŤŹ<łţTNlZ6ěˆ@ťf_SţĂyľíؕÔĐ÷óçq÷ vÝvŐ~Ět$PHˇŕĄ5ĂÉ&ę΄i.â;řaÖrŮŽÚM‚)}ěmťě*_–“dń"&Ę{hűç€@˝Ý÷žŮ˝+˝ˇŢ}Ď4`ĽŁFľőZ‹rmWJpŘđŞ>°Ĺ56Ŕĺ§çËÄiąľ_ôűůó÷×>pjŇx„ž˜ĎKçӏŸ^ÝöV¸-OźŮś >›_ß˝żřŽűóŰçrž˝“὞ďnOáü?>ŢďŰůďgäÝŻĎߎç÷§čN‰ŐĐđDҀd÷Dtś„MŠB÷’Ď;Vˆ=žŔ^’đ‘˝E^~<Ë*°aUH€2ŐóÓŕ”rixşGp˛p™r°ß‘ƒƒÖŁ €Ć†]b’Š+vÁ2Ë`Éj/d*,wŽžŢˆłňĚŮ1ôá>ďćVźŁ"ž=ěpÝ9)ČŇVÚ齐Ž@{ƒžBA$Ęe=XPZĎčÓ.ˇ€E­–}œĄ45Ô —0żÍÂ1Žëé_ÉáńŔh3) ‰0ăé[`č¸ še\RÚŕMă3ŁÁ(l8¤š’`ňzâťľů;Đ폭dˇŢŅźĄßEťël˝“×ÓőťůŚÚGßż?öŮ´×9~pb­ˆŸœ´ňL´T dĐÖpY_ÉŤ<ňń[œtB‘ƒVL,q‹mÝT§†ůqLÂÍbŤMC!]¸Ś’ąe1{n°qv ć}ĆÚ%Š”-¸ˆëČŻRŒďj-ô5–BŻcăĄ^"ĆĎ.Ŕ>…tşä‰Ć+áW  ‹ pÁŽü#ł [†‡ă*d3OMˆ÷$6<Ŕśü’3H?ŤÍ3‡˜,@O7Ha9SČżŞ€ÎÚW2úäŞK éĺČϸŁíď[”Ń˙=Ä8-hËk¸ĂŽžE"ąĎJ㨸ɊňŠ{ăO„ý~Ř˗Ŕ|Ä܊dǚ<;BDţ°|3‘ďĂ_ƄĹg>˛˙Z [Wx÷ĂoZh…ˇÝĹéᆝŒ?G8ř°Ü~#űĎŻ !“2P9†¸‹‡Rşř/~#1ÖĺČ›8_œŒŻęћ×÷ŻoŕúžLpe–ü’]*‚FƒŇg/bĎRtk•ćÁńËÚRűLj؂;rľc@$3‹)ĺ2h5óáŤa>´Ů<8%´Łů„+m6ďRCݢ´ć#ŰÖ>+‚Ľť @PĹßIF9táżô™†¸÷ô˛Ńŕ‘˝Ç Žbešýě†URXżÓŃŻüŘŻ‰Ęjžűő5~ ÜSC˝TéŠ_ť„vcˇ ´ž1ők`Ĺ\óč×­„<ÎPzę×.a~›…cŇŻ9ĐŮŰGlĘ0ÇPœŰä7ŕB>†çďčÇłv'GTĆP—TŰrĽćĹ Š-ŕęć‚wm R‘nŢ=póSÁť*Š9 fuó.5d’`C5Żb^đnŢ Ţ]đ‚w™ŠŕÝüqťivÁĽ\ůŇ/. GVt‰éßic“Ł" †.hŔőlhc?ăţĺ[7źÜ°á‰Ú6˝Á“´­5äéU\f<ŽÉŒK3™ŃMf܏Ɍ†h2óýƒŇł `ˇRî üipˆ"—PXk81"ä}=E,9 Ó8¸ HÓwRŔÖdÜaÉ@j ď(ö\üŁqD÷ÁĚC3đ"†ëéů´ĘíÇ#Ö3"6ę7œ  //ö5˛€ť4FĐ3äip°ĹI•]żĺÁ@ŚIˆ˙C÷Nƒl6š§š2 "oˆnź2’•ńżi /X™<Á-.Š`%ŤŔŻOÝí’ďBeŇđs4Ÿ¸@"OůŇśéĹ4–ĚXJąč.ŘQĎ7÷ą^rĆ$ŕNČÓ¸vŠ@–ĎUżŔ{~]R×+]ë*đčÎ/t+ş•q"%űĆ4䦊ĘQ{!CÝtĹj—śś‰“WŒh,•ŒjÝdŠtĐޤĄî­8˛ĄSLďľÎœˆřzżZÁƒąOâ’[ěЋ1îŔl"uó†9g°;KĆ*\x”˛Ć>Bş3¸xpzĎ }tNŽl‚ĂѡfލŔjĂ2‡cź´‘™Ž3ˇxĆŕ3œsDhhhĺ958y•Đ×uúÎß\٨nœâĆIČJ˜:ř[˜ěwšć€I˜{fáK:cśŽšÎA9GüÂ,śW§ÓxМëԊłVg¤}ż4W”88꒫ŤËn߃rLÂÜ3 ÇTjVö)¨Áż^wŰÝiěP-ď#(Ô’|ŻŘ›†˛S”sşKC˝ť<ě[PĂ“0÷Ô‹$(ŹmÎ>gˆWŔzĄwEH1…TŕcßË&™ŻĘNyHÎQ‡\]vű’;`ę8z/el!%Î9GźB“*5şË˜Ě[‰SHÜ}BßaŚ$SvĘCrŽzäęę°Ű÷Ü•p÷Ô‹¤ž0ZŰj‘ äiâ4 \tąPz]'ô`.*Őy4R>¤ü$ą2Ÿę°ŕt?ƒEbœŒŤ Mľ¨ľˇé Ľy†záćĽY8Ć!†ţ^¤9ZlƒÓ=KŘÖZnîyÂz)SÄc“ľr›$0gâ:YpÚΜî™[PĎý Í˝p óR-źˆCbŤé˛§94c¨_•o=ÜĆXŒaŽ -ć˛ߘ\CŰHĘę‘j›Ăj}D¤§űwőMľžK8˜Í)…9ç¨K°Ráć1Ť(Ä9$Œ]I—@šSÂ,8íQ9G3 淝13/L½T /â bű"čJ€çĽk8¨€ŽxŠ;”ďŻJ=,1ÝĊĺrÉ7Wš—róíý۰Săŕ\u]OK jĘ­ĘŚČjŤ@xXjťčŻËŢM`8ĂälbS൞ߞ”xů((ľŻôÔ؅:#án×ÝÉżRd#žž'Y€€lÂ5­!Ëú‘ĺ>Á †UxEq@"ŮVbńFí\dşŠůŢWY4SŸÓ>d"iŕnÁđä”Úw^NJ¸GJ,NB§ŢV=čŔdŠoDýlź{í›ĆIď=k”fĄůÔÁa‚Ç0Ȇjŕ| ¸Ö§k%8¨Ó˝?ˇ<Ž5Ӈ˜Ç÷]É5]7ƒ0 ˙"§˘st˙]j‡ć‘@č@`‚U] ąŞ0Vą‚ZĹ ž:?+¸Ť•Í ˜ĆŸœhŚĺŤ*‘î’džĘrÉ SpňĆZi.Y•ţn͐*ĐQ€7%°ŻŔq|ôXÍuîS#ŢëW|qz endstream endobj 372 0 obj << /Type /Page /Parent 758 0 R /Resources 373 0 R /Contents 374 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 373 0 obj << /ProcSet [ /PDF /Text /ImageB ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /XObject << /Im1 375 0 R /Im2 376 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 374 0 obj << /Length 4769 /Filter /FlateDecode >> stream H‰¤WËrăş­lő˝$oLšÁWvsçUÉő¸lf6SYĐm1E“.’’çţFfţ!ż™ÓHIśĄ,R.‹$şŃ§_čnüZŽ.ËR’ ň~%DXEřłŻEFq,)SIĺqAĺăęňý˜ĐzÔlëŐĺç[Aă źQAëU0ż>Żžyˇ~ â0÷ţđe ŻŤžŚŰË~ˇŢ^WňyőÁ˘Ď,Sí)žĂ}ľn:?(ÂÂ{đ“čóŽŮ˜•šwJěĹSˆTDŢm˝îť }Ü4SÓwä˙łüŰęcšÔĐ*Ďäˆaˆ…T¤bćJ4Í$ őę~őkyĆqJćl?Ű& 632žďŸü ‡r°ťźÁWřm UĆŹ8/n}ţŒR—ŸŹÇUŤüŔ˘Ö+ďO~ůŻŁx@ˇÂC•ľoŒL’˝LěaHž(ÂNddĺUěĹÔÓîž`'ą›Ľ<âX‡öÔŹˆźDD¤GyD˝cŁ$“ň<‹ź˙¨Pt]=ř Rű1ďKâĹÍÖÉ “H: Űň˙™kQŽiąř:^RŠ_Ůn¨‚?h'‘W–WA[ű °7–nÍË ‰žŻZsziëgĐţÚœƒ:*ÇS B•<Ÿ,žOI­ BťW•ýd•řٛĺ?7ńçľ5ýˆ¸R`ý'ŮľŃř–˘ŻZżVGŐľ]Çę‡xľůĎÉW˜ŞŠ_ú.°ÔÎbąIfĽŢ ÁˆîŹöVk$ĎŔ‡Žk۸łrěćJ׏;ËYÓ}?œşčuŽ˘vőzjŒťÄŁM3čúšyëÉD,›Ó˜Sś2–üăÝMŠ“§GU5ÝTűş3yÖśŢ[šţŘkƒqŰ܃Éě_o›§Ů+!ëĐřŽG6žŞ-jgFm“¨ąIÔL'ęšő…Ÿ|Ý#čŽ&“*Zű‚[ÚÝĐŤ˘űfx|ŽôéÉ´rȋu˙řÔ´FÓ`jk#G€[gęg÷‡Éü™/uFś3œÜŘr[MŐţ¤§šn,ŚČĹiLČއűŔ;LÔßŰJ-ŒżsoÎ|6Ěj6Ăűˇ/AĽqBRVÆţfgy׾MW_Н]ŘąŸ'ÔLşţ썌Őőgf°`4>iŤQö5Œ8Ő?GM­†ŞÓ›“5ŕGýč üWw“y ÍúQ9Ę好 l‰âvp°9ň0ŠcSiŽVk}̑4Q|äŁVxĎ\0^$ðë͞+眕áxŹ„㼂ŃÚńa1ÚĚŁČ#Ü Ç˝]^_/ě>‡×ˇ—’6őžY×#Réď|†mţň™ÚéQţŽD9wŮ^X„đ‘™ ?•Kźďß_Ž'XtŇÖ'be¸Đ¸yđÔtôéÓ{˛Ĺ€Ť€,˛ƒ…ßźm5ę÷}ŰöĎć”#Ůąŕ/:÷ĽtÎíZęÖm_&ŞH0ČPĽ"›{wŞ“2NSŁ a–"E Ľ”QŽ•áŤ”(J)ÝWąvIjFż–ŽS•čW3‘žp$8P'Q” Ňc ů’î@HEGŮ1Bœœ ČÍ-úŰsˆâs úlę˜Éů &2ĚYnůq„3™¸ôˇâH„i‘žCPY%ҍ°Đ*U!Ď!¸k¨Ü°ĐEƜ…ůŹ`K::f§Wg9ŒÇÇšěŕ8äâŰ ÇÉäŕ8JÇQ0ßć8†ƒcö–˸– Ô%ś˘ŮWÜCĄOŁČp*ĺrɏ›äu˙ěÇB@)Ęăŕó=ל0ÎâDWX?ŮŇ.őŒîabԕ)S¨ü-œ=Wu€[TĄě.%x^űî'šoĚCŁĄ¸)A@– HtźÁ8…šbTć ‹˝‚Oć…<Öď¨k›űMcžšOcV˜ÖzrÉ …;ż‚“’&ěŇĆCßź+L’ďW÷+ źY[ű!+#ㅈÔHřlŚŰA Šő0)ŠŰčçB$ŮËčŘýŃ×$•‹âeˆ¤41Ęň\_I˝/—ď‰˙_ö3‰iCI›u:9Oű•ĽĎýęˆc>Ł–cŽ2 =…JůŽRĚ'–3ě Ł,Œóřœ{Ć]ĐPDVœ°Ô‡ŚYzNÂ\#\@Ď2yNÂ\C\ NŚüŒ„ĽĆ8$(…Ń Ug‚9× g6Ěْ‡Šœé2C)Ę_pŔa) œ5ßIˇůfégć#Ťƒ1ňD‡™Ă…1OH ׄäÄX8ˌäƘsÖ a\ó”äD8$ľ báp`,s’cI{'ĆĚá˜'%7Ćr0œ3‡ cž•œ‡ŁăÂX8Ë´4c8§%çá™\çÉŽŻj"ŒâBčQa~)tŠĐ†UŽ+Š,f…7ďgßźO€Ű{Ř ľű•BŤňuż#*ËŤsDýSŕą÷—WKŔmVoąŤƒŸsŁôSݚF˝4™/žzš ƒšâšSZFßńœ 7Ĺ'Ťlg6ŕ"Čߙ팇K)kŕě~-`ss1EڧYrđHźx$6šm›śZ}ĹLź?|ÉĚťđîÝÔwÔăZĘ=ńŁ˝iëmMÓ˛Gđž§z4ˇŢëŰKIޕďˆy=ÜaéŽ^÷ľšâŢÜş•ß­¤|Ë˝ ¸Éz.H“ÉŤ(. ďŻ|‰œö~#ÂzĆ ´f1œƒz{c`… ‰ŕ\Żdú Ćmżk7ISăŁÉyő†Śž*jűS*n0ÖFëňŤ­\´•z4ů!~RsOÍDÍH]?ŃnŹ7ĄžT´Ľ<Ż}€Q_ú XŰjŇÚBěľxë÷5múÚhş}oâĽ<Źß”ˇ„lůPŢ'N۝ą¸ÄŕZ€çŠó§đ_rÚŐűş}ĺčeî'`5FVd­Ż´ą˜°+˝Đš*űÝZ/lŻ a㠏ž›śŐjöw5˛ +ÓzxFýЏß}”hď§Yzb2ŁôSoö-{BżNĚBˇýóhßiœĚ ŸŻYQ­ÂČv§Ţkő[d0ÜośŸ†-_–ë7CłŻŽ9JE!ŤědĚá—8”˙ĺžZśÜś‘č:ú ,ĽŘVHÉYƝ÷kâîă,ěY¨%*b"QŠHĽ|F’ž{ŤŔ‡ş“É™3ť9}l…ę]uń‚‹úWîU/RécŽGÝ9›íž¨—ýŞŤYH[dO[ŠLWâ<‰"žkąH-YÔş9\ÚÎŹÎg‚÷ěEFD@eś;Ý[‚§ B‚hlTíľč†“°Ä<óńřks:>Ŕ˛cń6ëEš‡]d¨š^D; rÁš†ďNÇs÷[+ůÖÖW^ŔfÝł%bévŠö{ň‹íĘçOšŃ7 2˙Řśő=ÚK{Ü_Äq¨6Ôr.ŰŤÎŐ?ô˘BÚ\&Ż˙î[ŸÍ1CŠĚÉĂqxÍĽîž6Lź5;Q ÓcĘüˇÓ­ą€ľRšcčŻ{-§G‡‘éS0‚Ť­aţfšř~ĂĎĎÂqK'P詜@Lr/Ąˆ,í/r°í„\Ě&J_}Ż‡ĎŤŠUv;ÝŮĹŽ˙ęn!ÍqžœNÇČNŚ˙bö+ćś67ö×Ϟf ůvđf~܎Óá˜7+!ŸşZŮ[śžĹ ÎŘ5G˘v î üůŇÝ čńŤ´ €3šďL×x­Ń}łUŠć ŹÖ˝Ă 3-˛mó)Ď՝RöěÄzVĺuą0uetKyŰ}X?Ö ˙YMŞ&Œ2ĘŤW-:O ş=^ÎkŽ@)zÇÉ&őwŽÚşíĐ0ŢÎ1N0ZŇ/Ţ.8ß;-{~ŇwůťH˝1űU‰DK91=šîZ+Ô E‰k&řˆ ´č/mÝ0çœĆ›Ł|7hľQínőcEWÔÔi˝•ě ˝%ŠNŁ ƒ´2ż+‚‰×üA…Z‡cWšöa9ř°T>óŻ5Pm}8hâI§˘1ŇîEB)U(O&dnŞŻŚNṔÉň°â.­MYa<ˆ‡ŽęôŒú—sŻäqÚ &e.•­Rt˙ŻŃ—­7/oeä%ćöĺ,5Ÿăăž` ŔÂWćÍżł™ĽyX:Œuȼ› •Ö”ŮŇĺ–ĎŰ,`4ĽĂ~š¸%1ĹČp‹Ű0˜˛@Œރ֚Ä–)()Uęş \sëőŒ'Ÿr$xĹx;Ţ0ŹUN ź˘DFƒ]ćW2tM˝=GŻeĂľëŮ=š ü7şŞ bĄdˇ…PgÍ~ŕÉüN8¸śxFíG 2VîŔc6dÂ`K'¤#ËDĘx&U‘,(űbs8źűé-QűžeźÁuLőyĐâ5ÁÉ5IžĚRđdJÓ@`*”Ä9nĄ O%ʃ>^Ž”=ŇćĂťYA8fë§ő¨ś˛,$>EaýcŹŞeˆŮĎoô‘¸LBČůRôżx+ʁBŚfě 12ó$ŠŠŸ)"^ďLfaRYäƒ(?ŒË"ŽK˘=ĎÓđQÉ'ܞxŠ=żÖŸľnüĄDůœ;FśKÜŮý3^ŻŮˆ` Yáš ŃyŃů§G6LĚÎźäŐÄԇ~dŕĘňh–C­ßčúyâćŢővf9$ ś§i9qó—•Řáć[žqœzÜÔg|Ë@×`!. Ü)Z0 x˝BŽ×# ʲxćTF,‡Ť˙4Žo$/Â0çĐçlüžç0‚/"B†ęöšJ&…p .tÉ,SSK.›ł§ĂšýŔcKžHŮž˙× Z¤LP´Ę˘@%ôYăTÍřˆÍçŻűĚ18ŻÍrŔŔ (0—ŃO+؍čÇlIóČ37íüŐÄ5ŽTb÷NŮŤ‰;Ô,ë`ËŽoŢ xűŸŞÎ_ń űŹ“A áÍü“Ż‘l7j??Y$ó)™HnPĺ§Y–ĄżÁ ÆqÁ`fŠÁăÖŃżýž-í2$vBá‰ýěť÷MƒÉÂżvóˆK鸇b7Ěôź0‚‘°˜B×O3BY8}ęd(_9™A$!ŘšYf|vHÍÍqö-ţ8˙gm[ZŒ4Oâ)Íł‘0 uq´‚C4p|HÇ5íD/N§}>÷7ŒůMë!ăm 9ô†˜žƒŒ~­ž¤GÔr¸á‘ë'ą@˛fÚ:ŔcˆJƒĘôĺ ‰R#I%t0!wAä‡ÂŃ@Ř>˙żţk@°sfŒcąĂ<ô†~ˆ„ýH°}F *7)Ó ĺ4Čő¤y˛XćlpśěG– mĐÚÎzb?ďq.ƒŕrŠ,X_E oäII&‘<ń˘„T1ţE X4í',ř-lÔ5S_Lú5Î%éUť–•dPK”| jÉB‰‚°€Š2—5Ożŕˆ˙ŕc 6sˇĄj×N˛˙ˇŃ–˘¸Ţ–‰ë >a\ƒW” b\f•â"łGüĆvăŻx Θ‘§`źó+HćSY˜LÖO):ŃB<Ä˙C”†Œ<# ŔżkĄ#ż endstream endobj 375 0 obj << /Type /XObject /Subtype /Image /Width 19 /Height 18 /BitsPerComponent 1 /ImageMask true /Length 75 /Filter /CCITTFaxDecode /DecodeParms << /K -1 /Columns 19 >> >> stream &¨Â0Œ AE$’J’I$Š$’IRI$’ŠI$•$’IRI$’¤’I%’I*I$’¤’I%I$’J)$’T’I%I$’J’I$”RI$  endstream endobj 376 0 obj << /Type /XObject /Subtype /Image /Width 8 /Height 7 /BitsPerComponent 1 /ImageMask true /Length 16 /Filter /CCITTFaxDecode /DecodeParms << /K -1 /Columns 8 >> >> stream 0•$Š%I(¤Š%I(€ endstream endobj 377 0 obj << /Type /Page /Parent 758 0 R /Resources 378 0 R /Contents 379 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 378 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 379 0 obj << /Length 4536 /Filter /FlateDecode >> stream H‰„W͎ŰČFšč)ę°šÁˆfóO$‚Ök{“ ‡ÁZ@ž(˛gĘ"˛5łťąö;ä5S¤¤Qœ`0"Ů?ŐŐŐ_}őőŰíęÍvƒ…íăĘÚ°,KˆđO_Ë(Œ’$†Mš…Q‘”°=ŹŢü0ePO<,‚Š^˝ůńŁ…§i…cŁ ŐŤőüú˛úd>k›„…ů%ˆŁĐšž:ú§o‡S˝żŻÖqdţŕě hˆwÁ:ÇçřXŐmŹË°4OĽ.řńÔ6ŇâhfŒsńimn#óŃŐCßŔűŚőíĐCđĎíßVďˇ+ -ʊ"ĚĘ7bC§&iX¤) §›Fˇz\˝Ýţ$EXŚqAű§˝Ů’śÉŽÁş@çp‡8ˌAŠż-z… 9Nű€~˝8őćƒF< \kűŽLŐ+óť`űŻ‹ó@ßJé–€Śź¨žŃĘS”"Œ–p}[†9‘VNMEQĚ ‡űŽ‚DaŽă‹u¨/Řť)#“ŮhÖŁ"‚5|O›ŠŠŤ(6‘ůwĆp_=´ˆ š—ĽK˜5ÂYfQüăŢŇ˙‹ľcçĺëXb&­óśŃ“ŕ°1đ–öl| p3čn‚†1ˆńTŞ~:´Ó´ â"ž°śažœœ/ÎeĽw•ŻŔ&^†ńó$Áô{SupĐöŕZüĄiGŒ$…§ö€q?ô!Ŕ–ĆśşTٟ›Şƒ—vtđ`ś?kÓ;DIn`á§Ľé!żŮ[›1Z‚ů’iV˝í‚^nn?5]§&—hvtÜ>ů d„ÖÔŻ_Đ täŠ@6'So-źĺ/ünŮËŻ:IŒ>ËŁĂݰ˝˜rjK×ku<Ż´ύf<<1” ?Ŕ$ƒűFW/wřAŚ éu“2öđdÜÜ!1‘É=ÇĂô^FI§xűG…ÁfÁF;šžÁ˜Á—č+LžĎľ4Őča×ú;tó™ Ť4=4l(ˆ„ůťĐžähnŢ9f*<śăäMËJ ą1 ˝Łă? ŁÓ[Zs8˛UD҃ůŘöľŁ}žr;[ÜÎÄmF×čřźýbCÄ&yŃ̈żuŐÎĚ'‚iföńˆ‰„ăމ˜–ÜÇąmďݸŢ{cSO†Ě Î!‚HL‡$dsܙ€ƒ[ʜF×PîŕňËNÎéŮJtž=ĐyĹf &xźŰ˝´c\.ŘE¤íax”ŽâţzĎ Őü!SşÚ ůđňyŇĄíĺł ,cŽShÎ?/=󉍄P\Ł+ƶˑp14ťęÔŔXywwÍôihíĺźd™§”§qšŕ¨e…›™ÁG5/WÖqŽ$4QÄdë“ů€~nĚ@‰ŒXçƒG ƗĹâ˛k5¸§„LLŐ(TÜŘ"W<ĆkrŠ%?€ĹDp-s|Ňćî`#K"Ü!XšűbűŽŐŘJŠ- aţœa…çőH™•aJÂNŚ!—şŃŕڏà 5ŽOGňŰĆjB]UVnÜs[Ët,ó˝%ژĽNךvSŠýËpNSŢ2%Ôčj)ÂR.‘ţÄŘ9Ëi+é\MĎ^äLއĂŠČ5AxŇžCZ.Ž•â*Ť˜•ö—FhƒčqčşáĽí)Ů­ŰIŃAn;;'§żÓ&> Ňf|g3o5đ]š(בČáEÎfWˇ‡ŞĂV2„ŕÔű…@œçíÄɢˆXaŮU<đěŢWsF;Écű†IBŔŸĄHN˛YkarŚŞśĚC„hxĽľ˛\ĽŘržČ6@ŁRtźĚYŤčëŹUŇašf,UxżŐ66BfH⍠2ö‚=pl””vžÇď1ĘâޛC ńŁYƒkˇÓBRŐŕbWítˆ+Hż‡RœQ1‡<%™Ő5Ńq…E‘ŇE‘Ýő´Z—đ˝¨<t8áE"WĚËĹ~Y–|AiNÉžHĄäŐĄZčď¸Ců#ýŕŠëţY.WżY\điH ŢMqč1§ŕĚX—HtœU¨Ą-f@R|*<ţĺBDľ-=)fŹ‘Ľ)Q™˘¸Ľf˛ (DěWĹß.ĹyéQˆ4zţťäż*5wx“?ƒ“F>ýĘcŇ@ŻžtaŒ#ë6bŽ’ćiŘö*dÎžŽŽF(˛žqއ›ŰťřÚp‚Rđ§~ěŚK›pwŹŘIű°Ň>lĘôXÝ,t‰Îol,˛—Őűúť‹sV„śţńÇP‚Ő_Ż˙Ś;tÔjŮpšĹH´˝ĆŐfľM#ž MĽ‹áé8Äć´d’by¸ÝĆß{#ixă}ľź ŕEt‰%˜ĺŠŃ)×°l˝ßmčqž>jw'R -ĺ(!$ąČq›]ë"“[¤?, ë@’š¸uCžĽÂFú|%i)n—!)ÇŘÚ/Ť¤zÜ2Đě~Uí&NTăn}xˆ ÷2đŒŤCIČ*1rř+[˜zÚ9}îœ>¤ńšŤĐă| Ňuœ+čJ1Ĺíľçč)SÚ` sčć#ţŁ.ÇoP4łžxj™ÔéűSń˝çfO m0N;Š*Ž/#—Śł'…šůME~ËŽ]í7Ň|™"šśOÎzÖĹáŠÎćoŞV•§'•č–!Dvcu͖[ ÍŇYWp”9˜n5R˙<Ä㌠R™<$pUŽÂź24­ńóA[ĹO; [đ€ÓşiľFćoháőYý™—ü°8{~>şęü‚—ľŐĹů™Ş~‚†úŁj›^W îęuőZž)ŠĽ‡ĘŐ8t‰Í™PƒŘ6Yî˛EőÂœ‹‡7Đú3YĽ)5ľ™łČ*­‘íZĎYň*‹ć§Őœ%ŻęńˆĄ3–źj°Uýœ%ŻÂ-ŐÍYd•ŃhĘĚYd•ąˆŇs–ź jĆ kŹFżhݜEšşŰűÂr˛@ ŞŰ‚ ł),˜qaAÜ:hL F,‚IńĎą&Ĺ?cĒ0Ád‹`Rü3F,‚IńĎąĆ9Äėą&ĺHƈE0)G2F,‚I9’1bI)ŚUů†Ů"˜”G#Á¤<ĘąƁ>Uů>Ů"˜˜l’ ‚\ŁŰňłE0ňŻ-_'[ƢĄgLś&ĺuƈE0¸çЖ–-‚qPmů‚Ů"˜Sd[^=[3LüJ_/Ξ_Ěőee6=éËÜŰ]OÝů]}q`ěęÝ=+s9ŕ™q¸ŞŠŹŹ%Ăâ bL[ëą}Žh<¸{â°Ń=Ѳ‹Ű¸Ć{ďŘĽři´oZg ť4t¨E˘ ělź°Mtkh x­gnV4xĎÇ×4×túhOŚfŸÇ^(dMŰ9}‹/u@y¤rgO:€;[×§'<ëB:Źw QŒ*ë˝Âžřąn˙GÓĚöфŢYýE+OéӛhSHśŽ…OM•4€˘@i_ťE3Ń%%Š%Ě&ŻĘ‚ô4aÄҚF R¨ç5‡*~R+0Ź DiÄŔŰ.Kś¨ŃŰęEő­Ňoƒ0ŒÂÚ٘>EĐOd¸ď žíóW÷^ŹńŽLx—6 ŞŻ´XDTŰ8—BÁŰu!•ŚIŁ~KźNŕ!GY’CGĘŹed-,™ľ L˛dL‹.ƒ×°^ĄŻLö‰ÂôüČvwǘ~˜`ĽĐ9 ˝-žĄł_ô a´ĚGĎrüżß‚´ć {ę-Â>cęIÂ),9ĽńŐB ‰'Ť$ńźiúž+SşŔÄÄKIé$|ňéb‘ӍDPş8=ŻJ§ÚîM‘ö%&œ.˜"í˙zďĎo endstream endobj 380 0 obj << /Type /Page /Parent 758 0 R /Resources 383 0 R /Contents 384 0 R /Annots [ 381 0 R 382 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 381 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 154 650 172 664 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 382 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 432 244 458 258 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 383 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 384 0 obj << /Length 3698 /Filter /FlateDecode >> stream H‰”WŰrăĆ­źň+ća)ÂŕB‚•§ľ´ëŘUZŤ,&Š”•ŠX‘ƒ‹´ÎoěţC~Ó§ť Dz×I­-bn=}=}ćťőěr˝•QëÍĚľZŠ˙Üç*đƒ( Ő2Nü Vj˝Ÿ]^ľ‰Ę[ި6Ÿ]~gÔc;ĂŢ € |6>_fżč;on"?Őżzaŕ]e‡ŽÄńuÝçŰŰŹPŢ< ôö`ŃŁ-őć ü6›,/+ožňWúŃ3´¤žďËBf, qżĆ,L ďl^W…zW”]YWĘű×úÇŮťǫ̋RÍŇÔOV 1ž cGąŸĆą‚ŚËP5vś™}ˇţ†˘Ô_ĹaJö“mfEfbŕU}đć)”ƒ…8Ľ/ĆßZ~DŠÓäÖŁż(uůŢy<ö#Üľž&QůL˙É[œÄş­dYóĽî‹nV!yY‘‡! ÷›•ż€éćXgäŅfw_“ČÍa8ّűîŤËU Ě!=H5Woɨ–Ňtč˙’ŽJÝf]b˝ˆÎ%Éčfçá$ô“ üżź V~,8Ă~Ńë­UŰşíTžUށr°ŽnLtk;ŐaľŕIôs™[•u*Ť(',ľęĘ˝U'“‡~זY€ÁĎë;U912•ń]ůlŐŚvńkHúÎmË ’ ‚}ë+ąŽBB%Ç%cŒ‰Ńz[śęĐÔš-zś$Aćbꊪ_*‰JÖ˛IŸIĄmVí6{˛šDĄ›Ą­ú‡|l˝9Mۊő'˝]ť9\Tˇ%ëŸÉnYĎĘj˜Řx!™hŃýg§÷bÔ{!z“FŁ2âsVIb’çIdę†ęĽÜíTkQ€´7ŤŞşŻĆüłG4hTuىĄxâóÍœ,œ[ ďˆN[Žž#Č2‡Œ‹ŽJĎhůŢ[ţŠ<ŮzMŃRfÜz/Ł  |éjš6ŒeLPÄ{ŕŢ;^ę9ĎöT(+} œ¤ľÜßď:Ővň݉YM(ƒ¤$ÍäúWv p$B¸Ń0YäđX­~ŕ*Ă_ü[ˆČ}íô:‰x8F<JLB‰IJ1š‡Ž¸Yۜ™sď9Zˇ‚Ř/kpۛ đ'E‘†Ç˘8KގĘ@ʓiΏéĹŮ"9wUďęc÷eeĽd:jÜ[8VŐupr¤zŹk7ę$ůęźŢfß˙ZĘťş~ôH4Ąë˙ÉŐé5ÓX_‚:AۄЖ6LǸÍJ!6eśăŘ\ź–ąóěv¤-ŞţEhw…ĂŠąžáőHpJ.Sp éė3|Ţë›g}k˙(öݸ@ŚŞ†iMVľű˛ëĐ)ů/…™váp sďM’™œĚnš1͖}{ŕOîřľ¤L`ÔU…lłŻ ^h>Í JńX*řě†ÓĘ?ľŹqR&WEoy씗ďB~ےył‰ÇBŤš¨EŹEÜqˇ$a΃R.ix‹Lőeʎ=Ú,.‘C"ąíe#—ˆH§œH9^ń:>Ë1>K1ˇ°ÜčrÉfdOĂ ąŇyGV‡řâ •śÜ”nÚí“zA긐˝„eܐz>ˆ­.TÉ9PîśÉ\'lԝě\’ő$ŠKŮŇ2\žŇ<5OEóĆnřlĘ]hÓÔűirQ^…Ž\\r9S{ąc˙̗b۰ŻáŠÜ’rcşK砞æ¤X§]{řâ‚[ ™ńJU3˘’q9uKAJ([éçқm UV€˛ĘŔRBݴʍkƝ[Îží°´eĚFä‘íČţ§;M\ŤC)[ŞcÂťóĹ+5ßŔ"Ž´™ĘŒB‚ |lűĂĄná™ëľ „K"xfB5u˝Ýősň<4żÝeżÇMütĘ@Íč19Î] yšaóRý…˜Ć^`)”Q›zˇCĆÜ6 ‡HŞZw–Ü›˘—#a.<膰Ń#bq ŃŃč–H4jťfŕwNšS ˜)=rsBľyVšqA¸iň„đ˝áĐܖúZş­š\ĹđŽ;*C`ç wm**$Âý@ 0śĂ'6đß1ŃӜ=F`Á¨‰\jKŞJ4AЉ˜.nf&DFE€‚7q@ízřęßÔÔ$Š5…ěîŤLśžˆ>Ňçጔ‘ˇŘ\–2^’ü)‹Á×g„ăěůÂĐ]Vč臆i=Ň\8!ŕkc˝ßŮśU˙‘‡Œ<9šzžŻ™Ž˛üÉĘ7÷…ţ şAˇ­{iÍěÎ >tŸý+_Ę#ŸtšŐ=š.ŠtN‰qéƒÇ,PËLç=ń3˙ÜPç@ö˜đWţ>,ÓĎőE IÔKÍAî ´EQ4˝XOY)$IŒpĐń&čŔă[á:TĎĄŃcnĆČ]Śę˛_ŽŸęŞœg˙ŇŮńzŮ:¨uŔŔM`‚@Ą a1bţHš­ťů: ޟŕܑ)šń.“Ď'Ť——ÔŢŃk˝”­F2FpćM6P2!LGă~O]{üÔm;Úֈ€’ž+‘ŠxŔŤ­ä“e‰YpsWößý€X@8b <؈L•#3‚°ęą<u4MnËÔŢŢ '¸b’”’–PÂé*ŠEĐďóU3’:ăH]˛…rbSát$҆Ż×–`Ą˛Ď:ˇýC×dRu97fž~:ÜkńžßJ¤ýä5Űvo‡ë˛œđ†Ä5ž‘:q˝%•Ţ.üř´#iÜ´ţ8i@ĆxҀÂ˙BWП98~$áć "5ű؀4„'lŘŇ ™k'¸~Ÿö“ł‡Ęů;őMún!ĹůI]4Ť 7=´ôřžŰG,íƒŘhöä1ź z˛żP§.˘ö;2ßsÓĐŢá§hâ§ą/r[Ôę˙Ü 'Ué|…`ߊŞŘA˙Œşż§˙nW%…RSwęMßRÎbţƒŹ Ă@†ďÇá•:˛VtţJýu<üV]ŸD(LĎ2DY&SË1#ˆÎU~fz´:O<ďk‰'7ÎŁČ7ćŽBžLżlmcOőB‘ŻÎôŇĎϧפéd×9Ö*Gž SŃ%ہUVDžŃ7ŘĹÔСŤ~˙`×÷Ӂ5wś% ěŔş8ن]<1áĂŤŔzŻ~şQ× ě.zĄŠťƒ¤Ěń`ÍE…S@vœ÷‰ą&ăł7ÁY eĎYšËvxĘJ-5üŠĂCôŚĚ›ş­7sŸhűRŸ1vč„"şÎó´ ý„)âŠř? dTeE8żŇĚҌţđjى†˘ű~…—ƒh2Ă0̲HÝľşccىš‰ŁŘŞßQő{{îĂN2CË*OŰ÷yî9Ę1ŸęśŽľĺűŞé7ߝŸÍŞäJ|ŠŽé­—=ĺ‘čŰZ¸Ü.Üp‚‹ŮĆÜđRř$SřqUÔeČVŠśÔĎâ‚<2 Œr˙ƒŘ€xą^.˙źK>–Űő­„§ŔíJô TJřĚHڈŘţAĽp ě¸ ÖDČhŒˇ Käě†ĺ|(÷uŤkĺGs˙SŸoM}8¸Şś‘řZAËÁ{wš™ě ęO5ćFON{U’s‘PX@ akR1Lf÷Q]ńŽ˙—5™ ;Ł2F”K9•1!Ź8DŁŻ=Ĺs@ ó÷Ćkv3Ő *D‹¨Aň8o|ˆĺ}Ľ‹'&̍=Aƃ‚UBŢ,Qˆś#G‘Ó¨KžZ˘WÁ{ž2ýódż~ĺŘnÄ@Ńz09ě‰ř'V@ܗł˝]aoЍ^śxG”œD˝ë} ą¨UrľĐhąĆl=Ż“7ľĐřô´nŹ1>ť×(QřZ,~p44Jţ‚Ĺ—şvc€ŸĐLý‡Q¤•­í3 Ô]Ą‰ťŔËÉŮ3iTŒŁ6cťlůľ5=smŇ4&}Y ż˛üL„ H%<˛˝@źĄÜł•Ąœ[!˙ĘĽ‘v‹Îő5čłě┬Aît¨>?ŒöŕâšQźä褖ťşXĐpÁ¸ĂlłâŢű:ĺ4:ačşF3žęđš÷o-*Š Ű—~B*€Űá*MUŒŇ4qšxľŒXśĐócŢĂíÓŮ崟7ÜĎę(¤{oťÎIÄ´éôÎr7TRL…œđ ‡:NYń¸H`­Č]Ď^ŚiŇO_RĹľqĘŹ¸`ä7Ĺtš 5Ő%dbAc‘yž—ô{/Do-‹q’Rîň‰1fôWł):eťyIƒlŒą]]1ÂňóĆ8! Ś.‡Ćb>´BŇTEŤqéi hf5sJ.J;„ÉĹŠN˘ CçŰh[‡5RŽ™ ëÝkZÇ,P÷҃ĚMÎRJ´ćţsđÍšĐď]ƒ"|uS&?źĂîzš4ÂáÖ\<›ĹŔ&+ú`‡jVˆ[.Ä­@;Ďţ†xŔXÉĽš]'4çČÝu˘˙ŮYęh8)ƒď…ő0Ä>˛iGN=-†0XJůjܒ;nŤDʖ˛Đă˝u•úže2 č  &ÜËGˆţŇŰĂ1œ'Ěě}Đ@9bœ_|˙ţůţŃźŃTr̲'™Hr¨žÎŰ1ŢaBeé`%GŽĽ f6ťqÖSnjŮ,ŘÂfŰV[l”>žĄŽę/†N!ţîńÓ_8Ő6 endstream endobj 385 0 obj << /Type /Page /Parent 758 0 R /Resources 386 0 R /Contents 387 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 386 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 387 0 obj << /Length 4387 /Filter /FlateDecode >> stream H‰ŒW˒ŰĘ ­lő˝đ­"S#šO‰ŒW~ÜW*IšlÝ՝,ZdkÄX"˛5r~#vĺň›9ş)iäGjŞF$ť@ŔŤŐěůj•ŞD­6ł$‰ŞŞR1ţÜcGq–Ľj™Q\f•ZígĎ_…ŞGŢŤąž=˙ů}˘ĆöĆ1Őłš<Í~އó$‹Ęŕ_aGIĐéƒmq|Őëí[ݨpžĆÁŻ!ö`1¤-քó~‡ŽŰ.œWQ<„ -Пm#_ LqżI˛HâཊűŽQ?6­műN…_ýyöăj–¨VÍĘ2*Ş I˘$ÍUžĺQ™ç –.S5˜Ůföjő deTĺiI÷§ť%]3– žîἄq¸!NC˜ă Ťâ(#Ăéă6¤˙VŒzţ“óxeĐľzC˘ęYđ‡pő‹xŔśJ–ĹĄ9+uO¤YĽäeE†$čOŞh'’ć<ĐäĹEŔîž#'‘›ÓôbGšŹ.Ť8(’xéqŤšzI—JiŠ,—qđß<ʕRoőCHJL˜Ńšb1šŮy¸HŁ"Nżâ`Ü-‰ż ś¸ŠŇxQygCÚ„Š”.üҎśÚZďT×[3ţéÚo‹hY\¸•Ă„{`Ϝ—ćITŚgˇ.&ˇ.bű˝QýŽ1ƒzo†ZŹěŤEđ6œçQčfTvĐݸo­5ŇʞúůÚmâPäĹk 쓷ؕˆîşţŘŐfď×:Ť€Űwj;r.ÜÚo “ľIqśśœŹ-ĹÚgůu|úëgÄ0¸•îȘgY&갔ąQeđ9̰ᅲŰvTmĹ팅évkÔA7n—˛˝ŞÍ`uŰÁťÝčJóh)WJ ;´Ëe1Ťh†öŃ ŁŇَzőÇŻůÖncć룾ČĐ}Mˇđ›Q‡üżť÷š=čƒtöf¤ŕŤńx8ôƒUý Ěţ¸ÓÖP(śíĐLŚüˆž;§b’}SĺŁŮŃě6t) eS)×_ BCÓvzŔŇňnŔŐÝ$ßWŤÜĽ´š#?špJšŠ{˛Tœƒ‹Ŕsz ɃńÚď)žaž ¤ů$3d&Ń"óBăâœ.…Č]mMHĄśý°ńłć˙D¸E FYďWŢ-{ŢBhM€úŏöű륓Gů aâßF¤Ë‹u”× /¤*`m÷"pxIütš¸ď™ĐrD΋ŚŹÁL Dl–"řJU$+ńÎ`Ćň!ˇ[mŐ ŐgIŐÇ(Éf”š0%FçěD şLű5•/,2h ó¨­`$dÔęÁˆskÝůUłŰsŔ;.’ œ=§•Ń ?ęzű$n’żî Ž@FaŽOD?@w|VőVÓëŔŻüˆ\BŔtÓ2x‰Ú”ď_ťBZL[ݏ3ş÷ô* Ôł´¸ď Éëgűy ^î<•0vżMýbŤw;G‡>•Fóh$ĺ0e%šđăQ’pĹŽDŁ[żO×֟ƽó`„?‘Ş1­;ƑG/ľëJűîQďچoćvâă ,\_%MüUR×éô`‰H2*ţ‚Qäq'oz¸cDĽˆłáˇűÄ]1÷őŢô˝;ýʉtGüëC¸\Äríô¸ĹěFĘČ)N8E–ˆŹY•ůčśÔćŕ%oŔ¤Ÿ~ŸĎV^Xv‘N“|żG$–ŕÜ<+¨%ăúY÷ŒˆtF¨ŞčJHyVN×äoxĽˇîá‹—ßh„^ GfřvppÉéU.y°7ŇuűŘÉUnC˙=*wF:›ĂŽ%—ú¤ŐťR'YxŽ_#ąMJd Ç.:Ť4f_ĄŸĺdűRl_ëcƒTÜ;Č*؄ä ŐhŤĹŹ%›•Tęü&Ś#‚ˆdąÄÄŐjIŢ}źłázf€wŚ$–aŔŇjœqGß÷ ŇŠľ[*…ĹôËšˆ’:Şýőem`ĎaĘDNÎ3Už‹e׃ŘŞűşSEěJń~„3lB} Ľł+ťľ“"KHäÇ×]0Ü\óÍ TsŘš´w‘9§vˇť2=gÓso:÷ÉW'ç=ŐÓ´›3 Ż¸ö<ŃMí $e†şĆ^=N-:iđtĂy~mţ Zô†˜ŽŰ™q׹~aDě‰[Ĺś”ízɇŹ|éĐĐŁ×ŰÎ}sšá> É߲y6™—‰yŁéŠ“KŠ…W §'Šâě\s’ŃIsĹ&œÁŤ;ŁáV‡ˆŒą6şRk1IŒÇ=2sän"á´(Ü@C ǜ~& 8źŃ<şeS{”džˇŃWů˙03U2zśŽSĽtäKďů}č[•Ő–ě_şýŇĹđÓÚؓ<Ę˙ŽĹRƒ¨D;(ŞiÉdŚ‹oŁ´P­#l'^NÉÚQ6ĘB#j6ň­ßłĂA<‰rm˘Kt˘_ě"‡ń"˛KzšéŤ•îäĽaö nŞľƒZˇÖ5ŠlFuAöÄŞrАܴk<ŽGóĎ#ľéŁEU…W+ŹŤH%‹Ϗţِژ|YÉůdź; '^‚˘/Éćëq5ÎŞÄäç45ĽIŠŇeĹ%,đkynÁ]ŁöSűpŒÜ4Gm ĽŚ3¤Ś–ę9ÂĘ_Š€Žä 5Ň%Ă+D Ę)^O‹äíĹź;Ňź)Y'¸÷Ar1z.¸Ĺ%šńQ—H/˜_8Ôů%nçěQ’—C廏źĺL€‡ţ–ĄšLşÚ”isBŇź¤.řVŚĂíń.ú,Cc„“v÷eí{ÍC——JŒó=ÎÇĄĹ<&ő´EĽ%Ń[ǽôŕßŮŁĘtę]HĺţŁŰô†˛=äÇ­ě7XÉ­—‰b2OYăś?îÜ<ŐJBmšo'vOlž™JÚîp´HdÉá‰.ˇnvhwFÉ6 . +đ3FŁ0ӏ4!ˇƒkÄ%ĽnÂ-ÔňŽę˙“RɀĘÁh9ĹEƒĽ˘,¤ŔMÍŔ=ęȉz˝ImWŸQ#ł a뛈ézbńĂ­ îŔ@%€ŐIňv6 "śk˘űđ˘Ó*“s§UL.-ÄĽ+Œ`Ň2mýŒWpʂcă^Ő ­aǸÂĐ9\mŽŠ”-Q1ć<„Z.íÜúá˜ďĹ܉Ʒż†i*‹Őđś/wŠ7ŕ;Ĺ}ß\Œ;Ž]Z-mÚo/ß­ śţ0٧¸€’Ë2W1ôćÚšÂÝŘRŐCăŁúŰoT Á_Đ|<‹c  ŇÓ)Je8V@Ę]8§sËz÷â’6ÎnëöI‡čvť ˇycÎŔ8×Ó ˜jÁT(ńŹ`´í.¤řČĽ×YńQC2ţy–EŰ‰ź‚‡C˙0P;Ë~—čR†•h˙GzľěĆUŃ‹q7‘&šéŽ~/Á`K,"ČNd'‡d%˙ĚŠŽ~ÝyŘN,GÎLťŞŤęt=N ƒ-üoäqBKÎţJLŠl.0îfy'ËěFĺ—?˝gvßDËšiŻüő2˙~ËG8á„Ć’öůDrw™r-j[ńü)_ů៛…ŽPĂŹŠŹÎ›ż]OŐÉUüńž  5ՓŽíe x’™ý‹Ÿ|šĚ›$ú)oœdŽě›ÜbŰU—"œgc]Đĺ_ßÜŢlŻ_]}'#bŞkÓ=ř݌ůGÁčÝ?ĐšÂHž•šXŇóúćňş7śŢŁËˆ}ľěm}ĆHůb~ß|äU‘Ů[ŕ güń> ’4üŢ^Ž´ół˘8ëf“Âäě›2Ë -hőzőül댳óĚŻÔt~śŇÓĎ ^ořš>Mŕ‰żL/˙TÓŐJ(›Öů: aÚŹl@ËĽ~ňnuŽz3­,›°~2foŔEA]œ´|ƒáóŐ# t‰˛ĺŁ%xŤœ™Ŕ€ĄIX/˙l/Gúűš0ځ›…)ĹóFŘ.ŕ11΄FőLrsđrôçaĆ]Äü֏2îÁŽxí—WČ^a\×ëžÜ8đó(Ř)ÚŮôś-Ú-Ýcúˆ=‰Ă[/ӎ!Ě k}ŃîǍŠžÂš9E,WŁY_2W^ŸW :˘lÁńŒŘ{ƒ-č„Ćl-0C,)y[-hŠ×úűf "Řřĺ<ŘvË J JOš…ÜIȢ“ŔšAä°ÔlœC˙č'&wŚw+Rx5oŽžˆNŕŸVf¸§ŸT-Ch˙ářI˝żĽ.Ű=ý¤jY“Đ…ěѓzĎ đ´s˘]œƒCýH&•w~šţ•g–Ňˡ`źP”^ţa%Ş š>[%ϙ2ńŹOů]ţ˜nľ(÷¨|ZÍo˛+OňŰ)M<ž÷îˆf~ĚgŘřŕ¤Ěňc[#üţŠg*­ˇ=rœƒ-g. @ÜétôGÜřűî(€˛:.ů=ź˝xůţöŠfy2 ÖqV&™|Gůˆ1'k%ŔёęwxÁ ąČI0 ´g@X(8ą„Íî)Ś—†ą˜i{ţSéVÄý, ŒءűíĚ!ÝœœĐœČ´cÚ(/i{—뙢ńĂĺ2#ďłęNŠ5 yĽqëÍÓgx÷ň´ž‘ś°ň‘< @4”ĚŹ"Cąíf´aćZŒ0łŠ˘Ć0KűŘŮŹ8DĽ(- űć G4;‹&7FÄyşá nËT*s4˛‰ ĄĹŹYť"ľ‡ŹŸľˇôdďw„ÜQGŘWáqŠ‰ۙ#¸ÄťSéŃîŘü wô}Ďô5îœxŚŇZôÄ?LnCšsŸ°x<Œt/ŘFG5ŠP[t‰ĂÔcľ LWő’V§›OÚJď|Žú0+‡)‰y>YcĐhĚ}uźřĚ­ĐŹ_ ˇW •ŔBł×ÜúGJďüŒŽ„`_đ&çŠJnšqÂMĽ˛„ž˘~l*kđ…°l€9ĹŘśÂČĺľ c­oݞčŐh{(N5'8şé'¨‹ˆAÇß˝çď1/›NQp‚*†HÔh r‰ő’QId"ń‰CÍjÖVŔ%–×bԊyš–'Óřáîm;)Ţ”ĽQ'ŢS—P(6˛C<]˘ÄCxM3ź9PdÄ}>ł#S\^ŤŚB"ŽtJ`…2I‡)'R?$-ЎsţIĘ94ăäZ%~j-•7PëFäřżáŇ$.źÂ8ć{cŕ¸qŮWd*.tĎÝqŻU ‰†KéŢ6Ľ’•5YzŢśô‰ؒĺĘTamíąĚđÁZˆFÓí¤&žť¨ÇÂÖAcţXđĆąöUD$ƒ_ށĐД׽†;%y ŔűCŻ…"ĐýŹwÇďy Gs2~†W •{ëIßŃlĆřƒ/€€žçâˆŔž’Č8^ŕÖŃĹ‚áZÁ),@¨"ÝŰŚt7 [;CÂ0Jc_l'|÷n싆›Dú˘Qč‹Ć0ě)‰ S¨ƒQč‹fč‹ăľR/ 7öĹ&ŇëĽ)•ęćéŔËE—ŔI´iH`eiŒ'b łĂłšŞÓĎž’Č^EZkWo-8ťâ*níd0> ń€çĹ Ĺcš!/ć+نxXƍsËj<Ř8ˇřZMžÇĂi1ˇšĺîmóĽŚ)diú4­4é9đ:ęy˙ăŐvĄŸ°ô˙G‘ÚĂ endstream endobj 388 0 obj << /Type /Page /Parent 758 0 R /Resources 396 0 R /Contents 397 0 R /Annots [ 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 389 0 obj << /Dest [ 275 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 212 474 271 488 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 390 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 277 438 294 452 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 391 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 238 296 297 310 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 392 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 347 296 364 310 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 393 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 485 296 523 310 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 394 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 282 115 296 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 395 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 164 282 190 296 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 396 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 397 0 obj << /Length 3735 /Filter /FlateDecode >> stream H‰¤Wێ۶ĹyőWđ᐀XáMůؤMŃä čř­=Ž­É(Řۓ ßŃüCó,Rźx&ÜňL‹ɋܗľ÷^¤^­/W+É[]/„hŹľŒă_x´źáJIÖëśáFYśú´xůúزÍŃ/ăě¸YźüéJ°ÇÖrC›Ĺ2>~YüZ]ŐKĄSýQKވjˇž;ŘžÚßonŢ­ˇŹ^J^ý\c ŔÚ-9 ő˛ĂßĂőz3îęĽmlőĄb?ݏŰé—Áí”Ř‹żBt‚WWĂfżŰ˛ˇăiÜďXýżŐ?Ž‚laLÓZ…DD#¤fZéĆhÍi/ŮaX\/^­fPŚąZ—żËMX—&Ÿ|˝żŤ—Á!C쪾Ć˙#˘ârťoj÷˙i ęĺ›Ŕ¸n|­~pŚ6‹ę_őęăY=›ŕ‰P흆'ç™IÇ2s Ăü Űt ŃyÖŐÚąŘUžîŽ$Gł”g+6MxÚ[^ľ‚/aΖě{—”t1=ŻţҍfŒ˝[¨“ĄVn_Ű'šĂ­lZ. ‚‘›šŘkÜ`gg#ןË-ŐMy#”F6ˆLľČi;ěNăľKVƒŽŕĐ\Ž]şĘľ˜ădlŮfďGUŸ>šfëŞ5ze*Gfœ-ą¸Í”ˇ‰ňvr˝Úł1:ě›vâź­&zץ:ţ<ݢ ŽCăť(ú*´˙ vÇéf@|ˆl)$@ڟßů ¨ęŤßÜ0śÂ˘ĂävđżďöťŁ–žb_ĆŰ[ö~`×űűԗĎFœe#S6rĘ潏ONá Ţ1g'ú  ™%˛Ú…ĺŽLĺƒĆ‡7ľ#Տ´ ˙0Ü´ť?‡Ó¸ Çӑ}čࡎnbw÷ŸŢ‡&UEđŠ,Ć5ˆôÍ…@o*nX×LČŘ-Ęän %Cm4—ŽŁWă‰uŽmx_ۇŻúáŤzř*ýŤáţE<Äřă^’hgk|Đáń,hLĄ˝ ie×žé Ť‘“­0lů)iôK m#…`~şÎfě2.Áçq#3Ý7Ş{°sŢ!^҂ÁŒ™s.x;ăAŞb+H RAÖş9źGb΃Q@zÚpŤćpÝtmîĄ<(íďiA)Ńp;ĄfrP}ßtšŽ¤ęĄÝnq¤ĎUZKœc’ޤ–-"˜Ă;D0WiÝËFrş’—đÜíĐ\qě1{ľŒçN#đÔ'ei!wDŮB’tÚBjŞšąÚlŤhI&đ\)Ou(ă™eO–ń́§üËřÓ%*¤”–O“důIĆÁî%Ů霗3’ 4Jň÷ľŔ5ڤÉő\ę˘&“+.ˆž1´ĐÝ?e|žHdC‰rNMFŔąÇĘpj1ŽV†Sƒp¤´ ?n/đŠB{ůÇL-7ą­?ď0ÓřPqĚţęŮdĚĽ:BżĺłĂ˝łĽÇšÄƒˆĎŕţť"ŕ3ß”…(ňż+Hšęe é ńđ]A{HCXˆ‡‰‡ďŠěúŽ ,¤Cd÷ßdš} ń!ńđ]AzČPś!ß´‡4D„… ř4eAaçô‹C’{ěĄ~=Qş8âś=j$Fm÷Łđ™QŁ,ÄQŁđ8j¤‡4j„…4j$FöG˛GÄèeÔ¨ҨÍŕ~ÔČҨQ⨑x5ŇC5ÂB5ŁF{ˆŁDY¸€Ÿwťč#^¸/řy§ńł>)áçU.âg5*áç ńłüKřĹű"¸MIÉpľC"×‡SĆߕđԋéÂôK˝DšŞa3ŒxŞ>Lŕ w7Hö´kŁ`Ú92ÁumÄ˝"^ŻjçłpkäňŹŕ¸ZńřÖHޘż5śŚ•˝řűˇĆMeűžl6 ÍFâĄŮ(<6‰‡fŁđŘl$˜ĽđKźjÇŤvź>•Gȸí C=Q˙ö323MXGm!עl!13Rľ á9ł Uńˆ ,Ä#‚Ž!Wœ°ŽÚB…(ń3R×PՌŐn/LMϕ"đT‡2žY&đÄaĎ xĘżŒ?]˘{ŐpaÔł$Z>O˘u똆ŁN9+Ń:Iô .DQ¤[PŸK^izĹ1ézi_Ÿ#ҝmúŢŇíFŕŠÝ(<ś§vŁđŘnžÚÂ#ł~‰WíxľĎiTB[K‹tŔgDš˛Eš´kQśDšśŞEXˆ"-P"MXH"MƐ+NXˆ"MZČ=QśDšśş†ŞfŹvwajĘxށ§:”ńĚ2'ËxfˆŔSţeüé"Ý*\o­}–HŤgˆ4‡är´`ŰęF ĚnieąPřĐôŽĆĄŐŽF˘şŽuŐ~z{ťßˇ~]cô+ź˛šĺëőßĐgs.äštԊL>ľâ‚hiÓô†Ťp´ ßĐ]]†SSpěé2œx!ŕŘŃe854GJËđ%>[ÇgűŒCPôŕљ ź;Ę?ą;ą_ܝ¤ŸÚ‹SŢe?îŚDż¸;I>á;•śź;Ę=ą;Už¸;I=ľ;6QąXĎ~vĘpŽHN”áĚiN¤áĚJNiá§Ëť‚FJŃ>KŢősîŕ¨XßaÁĽ”îş=Éť8—´"ínŢ׾uÚ=˝źĹŻH.ž$c­ŔÁŒ“+.†´`UŘGüDíPîŻüśŮ"ă‚KşWI<¨OŔgô‡Š ┇¨P¤‡4„‡„’ŠŃâPQ"NyˆJ—=PZGxH8á!Š!™CmĘCÄ)Q1II '<$UĽ=ĢżaňĄŔÄč"Ĺm{ĆɔkĎ÷äďł×ăpť=˛őa`ƒóßWëÍ Űďö~<ąăÍţp  œ:띣c<°wW/ĺçR€…oÜą=Ľ“Ě=9O›ýýŚîe_NGö~útˇ>¸oS ľÓ{ďĆTěMĂĂ弪ţ\şâTx ożŐÍwţ1)tŚŤ=ˇĂî4^;‡-:MX_TXriÝď~ßíżěŚ÷〶˝eŰáó¸™XA|ˆ­AťÂw >.˘‰Ýúîä* ąlă—ŃűŢ@hăí đ|8ž&ăwĂázřäˆ< ţŒźĐIáÉ˙ç/Ť+vłŢm7ë߇Żl CŽ­ţßvľ4ľ á{…0#wH&~`â#ĚpčKˑKb‹‰?RË)íďˆpżÝ•¸[^íóŰo“QWdŸ,oMŁlݜŠ';ôŞŔZ†[ŞŢ… ő›‚ńőńi–çŃpc™ĽTęygúh x|ţGČçăőýŹ~‚FŁ;ĽlđPöŞÉ¨ĄTçH ˙y#”B3Ů'Óżž/lËęCę‘nŰá1m˝ľ`dzԟł$ŒŽž›|Z|ž@JlâńJ, =ą+_F‚QŒęéęlë€X%Ţ7ôHŠÎ*uŁĐDÖŠ~˜€›n88ł`ÔOvŰúx÷ƒ*{‚yĽ/üřÔEââxѸLƒX2b ‡Ąză`”"ÝťÁqچ}˜|ˇýK2j*_+TTŽšŽ\PJYČٞ*žĺęÓăuB6ďgzF7#w5ŔŻŃâî"ˆť„§ÚŽ™Žh*!—;NkJ;nhGŽŽ4œyĚě„döCϟK˝řAhsF´Ÿ:˜AMŠ^’2Čž&ôËa5^ĈŇö• 5ćzŸ—Çŕr îÔö0Iň ž}ŘKl֜ěLrq§švňĽ§QďAđ̓'ifžÚŠ˝d „ň€˛¨„‘°–‘°˘E"/â0ÉN“0“@mË÷ůíJ˙4›ĆÓšFăĺihŒ“4Ö°[)]— Í2îú‹ ÄÜV”qHFki¤ĺ1)4MŘľŢđo“¤ačŽ=Dk~>ŕ ôݐ|Ćţ §¸-ÄŰ|ä7$Nä@GLěáˇÜBŢśv˛ţQ^¸ťDť.*D×ú!Yë™O–D™¤78ţľŻŠˆ—BÉďÝś­Úb Ë,)yđ•zG0(¤ŕ˘ÔšÖwKB¨mG@ˇ"n1YM_í˝œœƒuţ`LH;Qeśâ)–‘Ŕä­VëÔđŞšM8[˜,u´4â—Ŕ­üŠDËjV€ŢM›~RÇüa–˘BI‰ˇž›ڈ×0ĹaW×´ ÜjÉƚĂ)ôa”oFečrÖ1óI2ů˛ĺíKrĂÏěp;Ż9ŽLď7[޸ˇäÍ[^Iž´ĺ=Łźú2Ę*Fé×a8”łCŃ4-*ꑼźa52ąSśú&'.ĽČ€Îz22mČ.M˙ačÔq5›Ť._ĺ+zšĘY{Ľ+°&ěëH‚˘á;hŽçsĎOK†'.(¤đSÍZ)ű-Š.ʸh=>űţś% endstream endobj 398 0 obj << /Type /Page /Parent 758 0 R /Resources 400 0 R /Contents 401 0 R /Annots [ 399 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 399 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 428 116 442 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 400 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 401 0 obj << /Length 3902 /Filter /FlateDecode >> stream H‰Ź—Ëndž‘ín”bŒBŇż|ĺ ŃÂŰqÁDąűçć՛ŰQ\ŢNˇIq{šyőý;%Žo7tŻ”dtšŮ–Ëo~ęŢő[e†ĐýÚk9¨îóĹ/wz|wóőňÓۋ+ŃoľěţÚÓ=$ö閻}żuô÷ËNjËĂç~‡Ř]÷*Iâű݇Ťů›}zRÓłôW)§d÷nyóůJ|{u¸;Ü|ýßwŰ|ťŰ(q›†1ڈ”śÂ;k­Ôkńeżů¸y˝[H€ C´:¤ý§˝Š˜ś)ç žšůĽßZ퐞ęžô–ţ?ĐŞä`ŇÂӗŸúô˙Ýź¨WßĺŒŰÁPŹÝ_’ŐĺŚűCżűÇQ=hmq–ç„Ú)hžJ‘…NY)ĂäDńU%1EśÝEʢëŚt“’”ŇŹőŃ—Cž ŐGٍJnÉ])śâĎiS:I!xŮýf+„x{qݧ űޤçĆŔiÎő0J L{SrŢ\HůŐSŽóĽRĎČ 9}P5™ËĹŃÔ 1L‹Î—uŃŇшĐ^iєä¨ÝxÔ#˘i—%°^qROšÉ! Nz1eě(oëş”\փŽ:Ír0îÁT;Gë…!Ň t%Džڌ4@ :hC­ę–tO+PK‚´ň؁ôh–t;¸ŃGđęAchž˝ƨAĆe=(ł°ăýŕ,ޤńa0nIÔƒK•śšŘ¤q%­iKşŁ,UÚz=h‰+šŚ×n÷'ëôLxÜŤm˝vĐšOÚz­2ĐšFm˝fčź˙śžNIšvEmäb D3‘)™x9SRĽËéčݧSsěčPLdŁ#Öt‘FGé˜#äKMśŃ9Š0ăQk™Ă*Ÿ@¤Š˙ötüŒÝŸúth˙ŻÁľń¨Ň´OëŁ\ ;( Ěuéx–Śg3×EšIr*U°› ȼǐœ[ ȼМ ČĽżœS ä•|G=Ś×œóG'ƒĽłIEˇnÇć™ň™ƒ¸ ŔĄœ) ĽPČ!ŸGÖ4ĎäPÎź.7rČĚÇÜŔĄ0}ÁĄ4 ŹfŠ6Ő,DČd¤×JëĐÖk–Î9lë5C@çýˇőәěé­AG“ő9LŽ”ĄÄdOđQ„“­f&żŚ÷Y đĘiÔkŠ[PĆwŹ@ÄKz͑ęPŚĐÜ"&7UnąśZŹŠr{ľŐŇ\M•[Ť­–\6ŐÇmEy4š­ŚËšRG6QN\ŚYŚ_()Ł?MYbúő—ů4’v§ÉÝXNż&˛ŒL ç ׁœJ@űZčćó }$Ďż#°=wJűůr" yţQíÁođ<XĘŕŐ×^m?_Î$Ď? }möćó|Đ yţí€íyZÚĎ/Ëó4e‚.ńitƒ÷”Ň|:M#q8.ĚÔóP-čÓTe}aʐC™+¤—Á‚x˛€Ôóláe¸C™.¨çńŞĐ|°}š0¸1äPf ęyČ`ž2ŕŔcőtÂß[!ŢwŸzZ‰íö˙™˙ŠŤůĆëůcZ0ą`~ě}?mă)­,ŽKč‡wŹ JXü^€~IÁźĂM tnb¤—&:71ŇK›é%ł@_Îë#ĺ•hy:úŠé]týY_@?r(臾mF?vŕj‡‚ţę€Đýp ľâŔĄ :Ԟh;0úąw ŞfŠś\™šś^+tŽC[ŻY:ç°­× ÷ßÖOF˙H‰´‘sŢÎí3 Ÿâ8E]ń;AßÜËß úc G-Ԃ>žcNHď˝}>ôÇ`ď=l_¤—ö…zn_¤—ö…zn_¤—ö…zÉ,ĐWňęcĘŤ?úŠ6ú&fčC:dčc‡Z‹śCţ‚W 8dč9č#‡}ź†ZqŕĄjO´ ô¸kP5Kľ n>,LM[Ż•:ץ­×,sŘÖk†€Îűoë§Cßzî,ęçP_&ę; ›%wÍq¤žăźé=Aů‚Đť_.>~>ÜőŰ@ačHßúďn{—ŘŽĆ{ĽgčÓňóÓBţőtq¸{ß?|B…a îđŽ9CEˆępwă@Ńq›ŰéĽMÎmŠôŇŚ@ç6EzÉ,Đ×ň*S^Íp§Jč1ÜłžwäPŕj-Ú wěŔŐîŐÁ80ÜájŁC;t¨=Ńv`¸cîTÍRm˝25m˝V č\‡ś^ł tÎa[Ż:ďż­Ÿw|őYpwρű(Mp÷ wĂpŸĐŽŃîf´Fť!´Ťűf|fťŸŮî Ű=`;‘˘vJ“íđŽY;ŒAş°Ü,ꁴeîQ —mËÜĄ@. ږš?\Rږ×ňŠR>ăL§ PGcŚg}éČĄ0:Ô*´˜é؁  ÓŤb:p`ŚĂ5Ôr‡ÂtčP;˘íŔLÇÜ4¨šĽÚ†ţŞ…qiëľR@ç:´őše sŰzÍĐy˙mýtŚÓB­Vá,Śűç0=őU41Ý1ÓmaşŁ‘MT÷ÇT÷3Ő=S]wÂß[!*Ö݌uW°îÖéom–&Öá+˘†5Aë`]ÓŻ• qŁéĽQÎŠôҨ@çFEzÉ,Đ×ňŞS^íxOë‘ă=ë xGďĐĄÖ˘íŔxÇ\-ŕPđ^ށ㎥V8źC‡ÚmĆ;vŕŽAŐŹŐ^žšś~\ŠĺŠiëÇY^žšś~œĄĺŠië§ă])z“6ö,ź‡çŕ…čĹx7÷ň9x׊šĹ,áŢą‚!é¨ &źďŇ1اĘú8xiqŁC=c-ë XC+`D(؃x˜@„Şˇ#0q„2Ž(ë BÁf€° "T˝ą ÷ŔH@X va† ˆPővĆ2ŽPćE`DXŃbˆBc¨Ś‰,×sˇRš,ľĽÔŁ)ź‘>Mäś\ŚšüîpýőËžCč„Ýޞ<\§!ŢÍ_~9\ĚßýÜo łřqŸż¸š %v=!Âv7_/?˝˝¸=A1v?Ü\͏ߊ/ô×ţżějŮqÜ‚żÂĂ ۰$ˏäd7HÁâŰî…#Ńk lŃéőţÇřƒSŐ¤äÇĚ[j’ŐŐŐŐmá–XíOŽ‹Ť˝í/0ă>?nŻ,9đVłjANŕ‹ř‚ŕőß­ŽoksP Ö˙–mßîŒx9[UŘvű‰”Œ>„˜ŠźšŇŒůZöĚWƒ牚/:ővşt =|~ žÎřa˙Ÿ0!Š3lţŃđŐ֝e’,t‘H˛č'*ě­Úľ˝*\œXúF,„Ú“K+ú`9—X‹)żŤ÷#ˆWŻŮ´ŕWĚ .ÂÉ Îěń_—kăUc}ÝgÓb1ÖójŐvĘŰ:´Ž‹%BÝ%ŮĘ+&ňUă’:Ë'ĘtŔ< Üšs˜é¨G´ý=‚…ŽŤ>7)‰_Š…ěBť˜€8š>í×)Óź}8Ú.Ä$vچ<0ű`)?ŢţšŘŽFśŤČśŰÉŮľ9Ľé=ŒXŔăŒÍ7œčœąč€-"q6ůŠeő„`gČţJG›B™J‰ZTřšŚbTăćM:9F [œáwĺƒéCŰĹŁ” Oٌ—~b6?lďI|]ă‡ŇŻăi…FSDžÎ˘IÔýÇóגPÁž\é>+xĄˆ™™Wtz^Ÿ–_b ĺř3­ĺť†™czV]găMhÄOŰămçS„]޸Œ@YřIJšë˙l`7ŔGhšF9é#^ŐŮĂšŔxŃÇ#A=Ýšć”çbyëł\mŞ÷ć9y¤H=EŰŃÂřmh¤üÍ‰ň"PŃŤNúŻÝQĂßRÜű/^чƒť žJˇˇm„°§Î×:•z~벘Ćí~¸ŒiěmŹÁwD”]7śnđżh i9ŰŐŽIQŇÖkÝš÷Î"–ú̎žŕ÷.­˝dL´S݉ >‹V׺Ţß§Ú¤0C~Ľ€­ŽĆ´iáÜ!çŁŃÜv˝;Ş÷ůU§Ţ7äW_qŠ})ç|ň"Ę î˛ŽW1–§úŒN—Ĺ'eՌ‹Đ7›ł~ÁŠť,–ß2äđĽu#–™ku>dŰO]ôĐÁÂç†hkćĹ?őâ‡Â˜şŽŰS° N ˙d9óß%řHÄҨńľž“ÉX đő2˛mŠ‹œ‹dŕęęŠĆŁ&$ŞÝ)ŞýaKqż´ČŢj˜vĚŐÂI˜CŰLƄżjŞ~×ö˘u鿖ƒ­ÄÇrý†$âH#đć^jÉ]ËQjŘC[šň; ţřx&$Ö endstream endobj 402 0 obj << /Type /Page /Parent 758 0 R /Resources 409 0 R /Contents 410 0 R /Annots [ 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 403 0 obj << /Dest [ 179 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 110 473 169 487 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 404 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 219 473 236 487 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 405 0 obj << /Dest [ 402 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 188 410 247 424 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 406 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 339 143 353 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 407 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 270 293 323 307 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 408 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 374 293 400 307 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 409 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 410 0 obj << /Length 3962 /Filter /FlateDecode >> stream H‰Ź—ÝŽˇ…‘Űy ^8@7ŕińˇ›źŒŰH4wq.ÖťŁŐ–ÖŘ]!ńsŘď×Lq†,ΌęôôhŤŢ=Í*˛ęđ#űőfőjłąĘ¨Íű•1CJIiúW“´sVM> :ş¤6WŻŢ<uű´MŤ§ŰŐŤŢu˙´˘wľŚ@ˇŤu}ü÷ęÝť~mÜťßzŤÓ}şůőyGĂ7Ÿo?ź˝šSýÚęîo=˝CbŸ_yŢöë‘ţ|sťűԯӐşűŢdIýđywwřË6´4–ţ7f4ş{ˇ˝}řt§žťŰ=ď>ŠţŸ›żŻžŰŹŒÚŠUŒCHŽbc˝ňÎŃ{E3ŹzÜŽŢŻ^of ŕ␟yýym&ĺeęĂß<üÚŻ#MŽVHŁşÇŢÓĎÍJ.O<˙ńCŸ>&őęűRq?8ĘľůkuťęţÔoţuÔš[:ȇ‚ú}Ňň”3+›ŤŹr…)ĺ7iЈ9łďnrÇn_îos‘r™­=zăv(¤NIwÁč5E×QŤľúK^”ÍRŒ“îţ믔z{sßç$ŰŢĺq!q™K…ƒ‚ś Ŕ´6Ł‹‹šžv_ëňh ĺs:މ*ý8ŐjťŘLĘĘűľ×vŚîőîYôŤÓcý5œţęOu§żÚýŻQď1§š.íâŽXrCŠűI—Ç6i=ŇĄľŇ¤ŠČɎáČ#Ş´ĘŽ ؞؟äIEˆĂ¨'ľŻŘQÝ.ëv0z^śé´—ŁOޠލ4_!&šÁŒNŰÄč0“Áş@ČŔ֑UÇ9}˘˜š Ń ÖL8éÉÍé~Ătœa2'œŁý<9Á93č4ŻGăfÖŕŚi=âŕĆ9=‘ç:í-ąÉâNzhsúH3˜ë´Ÿě`5îä%˝š}Ę 1Ů;fň›>Ň]öK&çŢ:-1żq!“Ś[Ž6/`2̀ś-B˛¨˛ĂdľúKTŮ]˛Z˝%Şě,Y­ľŐSWéÜčágyl%iéAť}Ď÷Š*(ú4Pćý÷á˙őnšĺ¤Uš ‹yär8`9ŻŽ ńőärůXá›—Äń|Ź ůđĽ‚ĂłĺńőĚAňá3Ľ…_)`<HXŽĆáŮˇí Ż§’(0|ŰOâx>ʐ|ř:ÁáyCB߆l̑ÎAF͸ůnĘƒĺl djŹË•ĺܡ1WČTX§– cńÔňşžÚDĺđ™cűHMúüž˝ëD1?Ă $V`yϊƒ<Ă 0ž˛ȕ(<łBĎŹ@ra _YĆWV š°‚Ă#VČă™XŢł͞YĆWV š°…gVČă™H.Ź€á++.ů–ŮŽŒçˇQmŽUnş¤śž‰*—\R[ĹD•,ŠËďŔ\gLXvvW܁i3ꐋv&_wńŘľ;°Ł Ă(]‚ g6Ő֊—`řƅK0]šĆdŇ .ÁÁŠ-ţÔ:[ éŐ\@g{!˝ čl1¤×ĘýR]‰§Éî?.Ö1__ŽýšRt ‚|r ő耸 Ÿ8BíŠP€Á;ń 3΁;Ž"TŒĂě I#T×ŔnÖnÇWÓX–[Ÿd™› ʭ²ĚĺĺVY態ňr(Ó˝qf”ýPŽš#ăHčökÜ“˝e&żî×9žŔdjžć…ŠL†o\`őÉ'w~y˝†ÉŽf@{2čě/¤Wƒ†ôj1 łÇ^+ ô uľSŽët“]öÇL.ú “Q„ĘdĄőBŽŔLƸ[ Ber‹€˜ "0“áZÇA„ĘdĄyBŽŔLĆŘ5¨›ĽŰ–‘uő Sĺ­Ĺ >Č3ă+ŃřV{q<óŽçîČă+}y<‚Ż<žŮ‹ňˇËă+yŃřćqQnľ‘e^¸(_乌äSžťŐtnىyěÝ1MćąŃ˝É0žʔ&Z;ž˜ĘTÓÄËš ߸@¨Îź€Ěf"r¸/<Ʋ§;ĄĂ…zRŃg€&Ŕ2HPyđ>4YNŔ8Ă ęN X *íZD;9A“ĺ C¸ŢÍ Ë Ae%LŔ<4YNŔ(Ĺ ę X .č§D2&o?łß‰őŮ$ÚÚOʧH0÷ĄÂB†E~ĚűńűÝýçÇmŸĘŻMO1|gĽŢţř¸ť9üí—~í3ŞĘߟŐćá |žýđöćNe´ĽîLJťƒţ¤n>~ź!ԝąĆ8ë|ócF›sôM0Q)}†ĺÇ2ÇqŽňt čV}ßÓgdˇ#°Ů!v÷”ćĐӚlż&wt۞\Ţ)ť6ŁzxŻžśýz¤WoŸwŸTžsżxT7ę—˙Ő]Eťjă@ôWüĐJÎ "’Ŕö­Ő­´}X­´Ë[y ‰ŽBŒb§tż>xĎĚ8 í}áڏgΜ9“XřyoCyh˘•úQ6˝ńlNF‘‘:$óœ.ř7Éčş/ŽŔm `€U#é. ˜)˝œžOhG Ô;'ˆĽ*Ů}ËM6YnÜ7’óAm‡XĂŐÍAڔX˘Ŕ0Đ}‡]N]ŕČŽ>›6¨š*âŃ7çÖýŠá:[ĄÍ[Œ˙:x’śˇt˝‚ŹŃńŠÝšËçühô.5_E_ dľęҙů’ů´ÖéŻń@ً˙ŸĎ1,ŇU.6˙SĄ=cT1Ú¤E`{x”™¨'Œ˝”`ŇF”ÄÄÔeČ쥌Á¨,îÜůUzUÇ)łŻ:{0\JÎóeYL ňM{3JśčĹ(Ú'ŃšžCá´ó!NřbťOHY“§O ˝zÉ1ZË4ĎËđ)A^–oű$ż˛ţça+Š endstream endobj 411 0 obj << /Type /Page /Parent 758 0 R /Resources 413 0 R /Contents 414 0 R /Annots [ 412 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 412 0 obj << /Dest [ 159 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 327 366 353 380 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 413 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 414 0 obj << /Length 5481 /Filter /FlateDecode >> stream H‰Ź—ÝŽŰƆŃS]Ĺ4YXôüq†ÓŐq’ş@#֙ÓEâî*đJ IŽăëH[čmör~´ëy)íŽdMé%ßoćűy†zľ˜˝\,$lq5˘qÎ1N˙…KÇŽ”dVˇ ď”c‹ŰŮËo-[†Ű8;Źf/x'ŘőaF÷rNFŤŮ<^~š˝ŻŢŐsĄšŽú\Kވjťź;nčńĹîăęćírÍęšä՛šî!ąöˇűznčßýŐrľŮÖs׸ęş^b?|ÜŹÇoz˙¤¤gé_!ŒŕŐť~ľŰŽŮwëÍqłŰ˛úż‹Ďž[Ě۰Y×5­S´ŃŠ™Vşé´f´R+ŮžŸ]Í^-& şĆiŮůýű˝ çˇÉÇ ~ťťŤç-ŽvHOUűZÓß ­Š7Ę/ÜySűżÇqQ/ż׍˘X‹×Ţj5ŤţR/~9Š­Íň˜P= W>2“>ËĚg˜œ(žpĄ$úČşZú,šjH÷ Ÿ$Ÿf)OîX5á‚TëxŐ >'wŢq6g˙ô›’^ę:ËŤ˙éF3ĆŢ.Żk¤Ż•Îđ”ćáV6-— Á´7ÁÇÍu>żrČu¸‚â)Ţ1Kë´ą1ŰŞËMՆ×sÍĽilőjsd†>*nâÇöţG}˙Łş˙Q;>|÷ľ°š\IÝŕşaŃá2/šÚ+-š’ě¤iOz„Ő-í˛˘ćŤÔŸÔ“ŞsäĐ5†[6dě$oçuŮ>­w2ë4˝2÷î ÚZ/tč­`B§1źˆ UK$ ƒTÔŞfJˇ´1ĄS;îԔŽÓÚÓV܋ ÍłUĐA)Ńp7­wBMěAYۍ+Šl×(3Ľ;ęÁŠJkIl’¸’Zś´‚)ÝĐ Ś*­­l$Ǖ<§çnˇ 'čôL÷°WËzî4 §>)ëšĘ@O5*ë9Ă@Oű/ëç)IÓ.¨Œóh&%=/GJ 9˝˝?5ۊEO6:bUőit”ś!B¸””a팡mӞDĐ:qX„说Sö{MÇO[}SűCű×ړJÓ",Źrî lL0×řă™˜žĚ\ăh&É)VAßo2 ÇCrh1 ÇCrh0 ÇţBrH)Ďäł3ԓÝđšsaţčdĐtö 3)ęÚ4m[ŽÉÎz&[:€O"”˜LßE&żŚ×t[`˛Ÿô\é“ńgb9˝ĺpń &Ó hl’‹ję°˛űŤ¨Śî*ŤąˇŠjꏲsYTvĺQ…Ž.sJ Ů8>`™F™~ řŒž˛ČŘđăĎ'ňË˙S]óŞŔJsŇ=ôéÄĂWLxǙWLÚvkĽyĆ+&ńVQPŘš@O‹ôŘš@O‹ôŘš@O‹ô˜Y ŸÉ+œňę|^/Í#x Ďť ů“3g8Äó :äZ”Ňy…Rľ€C<˛ƒVĺó8¤óŽ!W8Äó:äž(;¤ó;¤ŽAŐ ŐVnŘ-œ §J!=Öč)ËH9zĘŇăţ~9ďéčŐBuâ˝| ďĽmxôdŢ x/ĚWá=Ń#wO‘÷đŽ3\’Áꇯěá˝T°w.ĐSç"=v.ĐSç"=v.ĐSç"=fčgňJ”×öź—źéœĆźúď‘Cä=tČľ(;$Ţc‡T-ŕyŸďCâ=\CŽ8pˆź‡š'ʉ÷Ř!u ŞfŽöôԔőÓJMOMY?ÍňôԔőÓ MOMYżœ÷ÜŇFÚöQźWOá=ęDŤŸÇű6ň^~Ţ Z“k§xď8Ă%N4ąm÷ Ţs f î\ §ÎEzě\ §ÎEzě\ §ÎEzĚ,ЧóÚ:Gy%D^Î{ętă ć}Đ'x"ďĄCŽEŮ!ń;¤j‡Čűě€xďárŁCä=tČ=QvHźÇŠkP5cľů™Š)ëšR@Ou(ë9Ë@O9,ë9C@Oű/ëóžĽDpÚČcpݟ€{ÇęŠgá^ÜwZČgŇžuÝIď”hď8CĽŽo­~:íŰN7ÖZءH} őСH} őСH} ő˜Y ŸÉŤu>ŻörÚűJhg |iuL{čhr-Ę‘öŠZŔ!ĐţÄĐ9DÚă5䊇@{ě{˘ěi?ᐺU3V›¨fť‰Š)ëšR@Ou(ë9Ë@O9,ë9C@Oű/ë—ÓŢtôŇݙGážp݇{ă ¸÷â÷şéđő|˙ĹqřëĄo+f˙ô0•ý”ú"P_ Ô÷\O]ˆýVđO0ŃŽ›Â?źă ڌ˘29ń ü›śĄč¸‘ž鱑ž鱑žé1ł@?—Wî󪁪„tă?čřG˙Đ!עěđRľ€CÄv@ř ˙p šâŔ!â:äž(;$üc‡Ô5¨šąÚňĚԔő\) §:”őœe §–őœ! §ý—őËńŻÇł|ţÍSŢö[BnôLüŤ€ţľńO0ÉÍTÄ?źă Ś´nڎ›gŕŸf@^c’ʉ^ĎÔő‚>A=°€$ƒŠ0@ľr€,—$fâqVA€$ƒŠ9Bj9@–Ëqá-@€$ƒČ0@ÂM9@–ËŻq€8@ @’A€3ú}Ü áÇO “Ż A 7ŠÖ(mŁĽ‘CBfÉqżß\Ü÷Şbz.1„Ő0ö.|ťß,Ç/?Ôs՘Šý؇/ÖľĐBˇšhăˆháË}¸ďÝmý8č´Jçą2.Ř_:ZRÄgîŰßCy\.ĎËĺĂrŤmÇÝ~łZ~`ŰÝą?ü˝^ür‚dÓؖlŻ=mrh}tĎ|ć˘é¤—çŮ>ťżŻŢřľvŐ60ó]=§fŐçZ8˙őňî¸YŘb÷q8dľŞ}BnŢ.×濪îö›Ýžwě×~Ř춌Ćí;ŢôŁ|ëĄ?^žŠĽőşžÓ đ3ň~ŸkétĎişęűűÔűSIS6ýŽÇç7ˇwúŰ~{ě×˙óĘýöD›ś'âî‰ăWńű7Ż˙Ÿ_íno—Ű5ťYŽÇ/ś;Ö_]Q$ë7vd^źŰďÖ~Ż˘ZőkśŽvôˇbž°CIŻüöľŹvˇĂ>)9ŤŃç…Úhą—ˇř[ČşKYwăÂÖýąßßnś=űtÓo†Ü:Úźô Ė)ß˙gžZv䶕čŻhq ¨ R”H-o Yeq‘g3ŽÝ¸ópŚŰvţÁż7ĹGŐ3Ż>(it‘]EŮU^ÖżóűŰ'ş°t*ŞÚˇžĐ4‚öۇ”…+J‘gš[N”ĎĹxhž\íň)ůK.–ŸB•ßoiđÚ6ţmvżQ )1„žÂ-ƒI5Wńv‰}¤fÓ~ń$‰°Äđŕ—ÝáĂîúä~ß܄ç¨Ôť‡÷ąßšÇożűcsá?ąůŮďvTkjP Üƀ‘nwŸžŚ-E˘Üö]sôÝęĺnć˛ÝřFů7§ţ?xJŞ]říjcÍía÷9Bńë|g…oĂ3´č{˙Ýj$ą†—H.%hN?ý7žłKŸMm‚î7ވ|>|şż^.'čúńžJ)/ő„U‰xLĎŔâÉa˝€Ć  ¸źßécXF đ1>żŘÑúeÇéŻČďnˇäŽ‚Wt—›&Yš‹–ÖűŃ1˜Ši™ÎtSGKĆž%ož%ç&Ďžk~ůtýŒěĹŻŒ]$¸Jsó˜L,úŔłÍm03ĺ°VÂÚ–úúÉóýˇEƒaŠ6y§€Ą‡÷Íív“nw×d&$ăýöćŕKäŐ8ˇdxÝř6ś˘çLiÉżžůiёEÇ{žÜwí×7?˙é=(šŠkˇl\aÁÝSÇzëhŻn>pČćËîŢĆ& ďQëđĺŐf žšĄN‰M2S ŠGšíCʨko}?úßéCžűö™ Œ,Ôą^‡WM4ŚŠĽŃF­ÜÜŚ_ŻÂápŐI™*§އ~Ŕří@šŚń°㏼ż0˝ŚŃŘţ@ 1y őߎǷćřv8žŐáÖőáFcýsqUŮsoçWJŕ(ǖ—§ŒÇÓA w:ăf¤ěO! Nű Տ•|>@ |>Ŕ¸Ľ¨Z„t@€ 退q2ŁŃ.#XU<@ >!Ôp§†Ę7đ2¤#ĆçŽwľJó1đăt2˜j•ćCdXÁłÚ]çě ˛ĎJ¸č¤Œç*\jTĆs†.ß_ƏI%—¤nW^FţĚĄ˝!F—œ,ť¤šŇ¤‹ĄąĽÉŕM…mÁ3KŁ 6ŚéRS†Íݧć‘}Ż œĆR ‰i,ÄŔc2äZ”dŹ`Š`౑ĚP €AĆ\CŽ8``ۇ YeąuĚ ŞAՌŐÖó\í„sĽ žę€pÎ2ÄS΂xú~„ŸlËÚŃîQkuš-ëólyśdËÚŃ^hĄdËôŰňO´ˇ[öž+]2füĊ‡8:Ą8=~ż7{5§ąĘ.*C8Ť ŕ˘2„łĘ.*C8gŕĎUFy’ĘÂeNąĽqC°ijmšÔ>ĂďBVŻ)ű2݊⸝!˝ź†ű#ăřˆ’×C<1p„\ű2ĎŒÇ#F%‚¨0¤YńxÄXDG ÄŔł¤†;5Tž!+0¤YƒńxÄŔr”xa<1*¤‹Ă ť,mÍÇ&Űى zěc'Z˜íŠC n5ˆ§VŤŕĄŐ^i5ÄŔ­†pn5AZ 0HŤA<ľŽŔ­†¸Ő žZ-G@­¤Ő*xh5ř Ňjˆ[ âŠŐ`i5Ŕ ­ńÔj8ˇbXÁEíÓ܍ㅁpQÂY'—*#œkpÉ0ÂůűžşměUggMťť‘ZŚ7“÷š°•\Ř3ѕUqăôŸÍ•ŤÝŢlwtŐ~Ţ6Š˝ßH6'ě)łßęŃҊc °{̛Ǵ;ÝPĘŰí†l¨}Úm mŻî¿旍ߪ~Ú\čöŢoam{íŻˇOo›ëřä!üÝo(Ťm3¨oÚŃs´žËöƒżŘţnoăĂďýÍň˝Ë͆V›ᥙ’gy÷Şđ‰•˝ę¨¨pŻŮގCč!¨l€‹˛Îʸ(áŹl€‹˛ΉřJZói|^OÍ#ů­ ’ćaÂ_]sŚĎ;ȐkQfy†¤Z€çUf0Cy™Gp šâ€ç dȚ(3Č<Á ˘TMŽvżŇ5ekčď™-S ˙ń<Đö›6Ď< {Éň*ÎřĊq š 7=ßóŸ3Ó)"€Ň¸Há,m€‹´ÎҸHáœY€ŻäUĎ>ŻóÁo°Ĺ!ᕁ€x @†\‹2ƒ Ě Ő <2€A\CŽ8`ŕ˛&Ę 20ƒ¨U3WťŢ5e|YŠzהńe–ë]SƗŞwM?} řNęí|Ö@žg P ×[÷˙8 Œßý÷ íň*řĊqŃŁjrĂ+‚"‰LKŕ"m„ł´.ŇF8Kŕ"m„sfž–×ŢçuÇ˙éööŮĐşÉrŕć×Ă2ľĺ÷C˛Ó09= ˙&ÁűÝáróŇ zZýŻ>|˘nLjŚG§Ů}żáŤyě,Ţʘ…‹ŕ¤[łlœT `-‚SJź–OÚXXży8Őč}Ě }>ÁŘćŃűÉĺáűšĹ÷ŮăńűR˘ňűÉáóűŔŕÁűěď0~.růýäîđýŹ‚âűěíř}‘ ¨—W×ŰŁçâ”aÉ}Ί-Òš"œS†ĺť‹đéŽnçÎ)u–Ą§şë;łd˙Gůšw SłsřŔŠűX:7Xe^á斄N€z¸áŹX€‹dΚ¸ˆáœX€ŻĺUůźÚ3\*Ąg…m=á_G lě!×˘Ě ÖŽ¤Z€Í=3 w bďp šâ€ 2dM”Äâ1ƒ¨U“Ť=ŞtĽkĘxŽŔĽe> endobj 416 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 368 328 394 342 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 417 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 418 0 obj << /Length 5815 /Filter /FlateDecode >> stream H‰źWێÜ6ÄžöWđaH ˇ,’âíqsĎ>AÜoÉ>tz4v/ě™`z&{ůó ű›{H‰‡ň˜Ľžą˝ş‹*’uŤŘŸď6Ďw;%¤Ř]n¤ěB˘§ócčť^k%Ü`şŢë vo6Ďż8q8Ľa˝86Ďży!ĹËӆĆö=6ŰüřĎÍO͋v+u盡Şďdsľ˙őöHŻďŽďŻ~Ř_ˆvŤú滖ĆŘĆ!ˇcťľô÷ćr8^ľŰЅće+#$žš;^LߌńMEďŇ_)­ě›ăáúęB|uqź=^_‰öďťżmžÚm¤8Š÷ š6";Š1čĄóĂ hĽN‰›qsšů|ˇ"€ö]”ű{“!nłŸ6řĹőŻíÖÓâh‡ôVsÓô˙‘VŐw:.<~ůލ˙ßN‹zţőŹřĐišk÷e¤:lš?ľť,ęAk < :¤Iç§8łPQe&&š_†Î’ˆqćĄŮGm“ä~EŠ2+ľqčćB]č#ű-ą÷ž[ń׸)!ď]ßüwč!Äű—mœdlu|ĎJ–yVبÎô ŹHÍŕ“ŔóŁ”4‰î˝pŇuƒˇ*JL‹ ƚ…Ƣ5T†Pž¸žTSíƒp*jcEšq1ďy\u˛/ř`;cě;#ho–Ö| Ě ƒŇ†HBĽŠTVŽ1xÝ)é0áAť%Ă ßaКúŃiČ ľěú WÖ ë쀕ÔÎwÚŽ)9(: +9(C3Ź)98ŐŠ+yçn ł˘|Ćé˙ ÖçJ"<× ŕ\„gÎ "<ďŕŸ'Ǘýd1>şœJr~”’Nƒ”´ŔŢvZ9™=Ďşlí2>&kŁ+›†LWŠd󺙎MŒŹÚĚ3̏Š‚ľi†°˜a8<äěpŚŠß[˛7Ó|ÖĆPxűţš'ç(•ŚE˛çZ g<Š—¤›łáI˝Śŕt¸ËÎ]†đÜeç.Cxî2€s—!<+ đu]mđQ×§Őąď<˝ ˝{ĆWź1dď† ĽuönĚŔŐ Ůť ňnŔŔŢ ×P*˛wC†ŇuönĚŔ]ƒŞYŞÝ{żrjęř˛RU|Q‡žTšŠ/4ŹáK…Şřb˙5üŃŢl˝ŁkŹ÷ófő4oŽź9Îŕ茮y3}—˝ů[şşŠ7Űŕ•Žy3qĆC<}ăĂGÜ-uƒ§ż¨Ëžť âs—!:ښ”ţ)Š*DúŃ…}_WŮŮ>ŔӍńÉË×pŻ NżI˝Žz=d˜˝âôsOöfe†Rű:CÎŒ;Z\›ť0ĚYńĄłĆ-gp˛š%ˆ!gÉîĽ^ŮCé`Ŕ0g ĆC<Ű+3”3PgČY„qşÜÚľJ—SÎŕÓ)›vÍÇŹď$]ŁřŘ#-Ěő]9iž†Ó9›ŕ•cŢϧ Ŕů!z>cő÷ůˆ!x>a>0đ~>_žÓŁÓUŸ†ÓŮBŤçŁŢĎ' ÁóÁBô|ŽęďóąBđ|Ş }>4ŕýu˜ŰÚŇmĽüćteĺŚŞŁš'Ş(—´ŽćŠTQ´Žć WŃł×Aúyę‚RÂŰů “‡¤+šöé.DONN˘Ű-ŐŚ㑞šßF!)ŔăQ<âVH„xďŁÎď† ß ËĽpžuś$s3śd0ÍÍąčR¸ţˆďŰx˝kˇŞyŻŚŽů%>7ĎÄ/ÓČŰô˙Š%=šó^ő4ŽÖ÷só*>Œ˙J/ŚÁ/ă‡ĺ{?ˇ-­$_r—&i]g˛¸tÁtáá 8s5’Š&ÝGÜ@ MF‚7P€s3#<ˇ3ŔšĄž[ŕÜÔĎÂüŒŽCü "Óľóą:JjK…ƒnĆß˙EZ” 9Ë CŠEă 3pľCN¤Â0čz渆RqŔs2”ž¨3pt`îTÍ\múÎ)č˙u¸ÔŠsŞpQ¸ł|U¸hS‡yăUřń1@WTxR ¨‰MG5Điţ˙ǀ ÷Ň~š [ŃŹn5ŕˆ3†ĽŐM?źÂ?%ô@ ¤qœ›ᚍÎmđÜ×çĆFxVŕgtU!ęjŸT 4‚_ Ѓ2”ZÔ80W 0ä ( (\CŠ8`ČAJOÔ80w ŞfŽś|§ŤA.uŞĂ\„*\ŽĂ,_.ÚÔaŢx~|Đ iü” Đ’~O†ař#‚ŔÜKői‚€lEşa-ŕˆ3†ECÂG4Ô^ŔšŠžťŕÜÖĎ} pnl„ge~NWjLgä‚€*Ńƒƒ`ĆW‚1ä € ĽuĚŔŐ 9  ŔŔA×P*r@†ŇuĚŔ]ƒŞ™Ť­Ţ骇AP‡Kę0Ą …ë0ËW…‹6u˜7^…&JP+ŸĂAœČűG䀼÷´2Š>Aô´ VˇpÄşa™0PÝŹůđ 0ÁRYĎM ńšŤžŰâs_#<76Äge~NWuu45ڃAqaĚPjQgČA°ÂŔŐ s,@ †x Ľâ€aĚPz˘Îƒ`…ťUłT[:‡‚ŔË:ŐŕE*đR័Ż/ľŠÁ‹Wŕǁ'3Î=)̇Mdƒă$˜ćISŇůĺ,p”’NlĘ3e™˛@Ś,čć40) şE˜dë&ĺÁĐw?$ŕ@  Љ˙L‘`(â§ĺËS&˜÷3Á’˜…ŽeqĆťœĄzů™ŕ,Ľ‘Ç™pîo„ç8w8Âs‹œ{áYY€ŸÓUE]ő2Á ÔŁgŒŻdbșJ-ę œ ˜Ťr&” €3ŽĄT0äL€ Ľ'ę œ ˜ťU3W[żÓU3Ą—:Őa.B. ×a–Ż mę0oź ?>lOaô“2Á~H&XŮ qę?*ô}˙I3ÁÉΰĐŐL€#Îx—Ą.sÁ}D&×Ő"aÓ|4:Ű`BWLLÍp•<;$ çsW'/pœÍ‘çS ČŽ’g_ÍäČUë䎑łĺ‚•łcr†Ťäٍ9űMźŔ5r6jDž g¸JžŠžëtRĆĂ%Ó9ËĎ2¨ÎŰÁ Ł}畔قzW,ČM§íëăËť›qňˆa+[â°ÍĐ ńbúň㏟ž{Ýnr$ńă8qŃҚńbú4’CüŢđďďŢü23ĹdSól§_ŻŻNô44ă饍™vŢS|¤ŰgŻ5šˇtT`÷Ś;ťw|Š;úŽ fžlˇ.šÇíŤQüţŮôᛷâpýćÍţęBDCoh)ô˝lnďnŽNâwâx+.ŻoČ]oOB›{•l?4ƒ¸žLD§‘6řZ\ĽMĽWɋŻo橎—4͑vӋ(ۗ´Ś›qšâꚶ?í|K;#ďyŻćyŇăoÇĂ(Ž'qwçkŁłĘfߒS6Ż˙™ć/DÜF|ď^ß>‹Óď‰IEڎ2ШgŃۉ÷zžŕ˛Ň̚|Űn=-ám"ž˝űKéŽĂfŮ'Yˇ´Ź‹ńňx5^P—$wD÷ŰţőrÖ)}McHŤŰWinGĐRăâcâĹ%ƘL[—łI7Qú‰%Ś0-ŹHšW'šć2đęŚ~›˙ěS¤Ňr÷7c\oR;4´ě ‚ÇĎ´zZ|“LcIAľJ[9ěOcÇ]šĎ^*ąWąÄI*UN—úńŐ˛7r;ˆşŃŔاÝpŘëŰĆŽť!]ČP„ƒäŒç!ę?ŹĐ÷şúQŐó膢if˜@UwUVfˇ]WţӸۯˇăŇRf˝v*Ţ˙ăˆćŚěhźÝë┐žšqD÷1•ôD1˝łK'‘ľ“xCšŐřŢӟo7űqšËŢŻŽ*_RŮŰüáçŰŐÎokł‰íűuöyŘîĆősŚËó=Ňź‘7œ/ňËéFčüĐřgŔJßůéqĽ­]űŰm‡§áy?Źţě9eWvCë!M—Ńň||uČç9cˇh9kǟź ˙ékććßMTkĄ]öpť˛S9ÜűGî‡ĺ>ž¸ŮúżŽW‡ĺ°:^;HCvż]s¸¸HâéQ­¨ţK[sš–m‰}í¸ÂT`ă‹7WÖVĘÚňQ‰WúčVÔš Ş|O%ĺ´ťlwŘlÖáťÝ‡á˙›ßŮW÷|öĎĂ`嚣'{Z׹@j$âđAŃ%ľÓŮĺś6€›Ř19͸éĺďe;îÇg%ĐTs"ŚŠoDH¸Ďî˙řá9ĐŚq´QŽ6Vmv‰é6Ţýَ¸ÎíÎmevë䎷C؀Ą—Űݙ)śńĹž}|ĄM׆źË-]ű͓ŁyăŸĽoť <Ú?Xá "םRj+rQNzQ“†źítŇ>벣‡oT[ĺdž+rŕÝúń°§yݝ]ât­ΜÔI„CÂţޒúvמ\ݎ+’îýMŇ qLJľZ ťĺvźłJ ˘ĄąęA—ąR˝ŁŸÁ˜üâ¨ČŢ:ź w^ś|#ęźĚ.ěŇ/TËBuX¨ˇ:ß/ˇ˛—‘ćéŽteüâQ+袔? üÓNƒÎWĂr|"­YśřĆ9Ěđź\ŻÂSŁ˝V™üŮŁnĺżĹÉúݛ–vôÓGU 3c>ä?Ü9Ŕš żĄ|˘Ő…Чaoďl›ÇՎţžZ=ٝsjE\jŹZď?ÚÜ›ý2î˘ÓfŤŰýíĽ%Žš|Çjz]öUŁRˇĎ¨şjěü8î3c)VţٞţÔ§?ŐéĎĆýě+÷Ł>ĹŞsJN\ ›nQVšÉß}1lzş’ď~÷ˇż)źo"ŽŰ˛WÉű!ŒŽ€§#n]ľřˆ"đ=ătvîëŠ á*#„Ë ĆuiÚî8CW'Ż‹(ß§đžV{ŕK!ŒŽ…'öSć›!ŠŔwCŒZÁT§ů#Ěŕ‘íUŮkuqýŒ\Mă‘iž¤ńŘe€KŇxŹ0Ŕe˙iüÇ÷s*IÓ^[™Žě{btPIÓąJÖ&řăŻCáŽdVŮjwz8“´EšhC†đľĄ ë…1”žŘö† Z‹×ÁŘţ@;ÍţUĐ5¤Í˙X2ĹŻ—şFŹŚE,čęsZ řUcJs )›ŚfżćšzÚdŔ…eg–\X†pfŔ…eçĘ|ŚŽíÂÖUŰş^[G:˜ćŕM×t@hÓރ"°÷Ŕąéâ-8‚t D`ďˆ´J{ˆ Ţ×;"°öĂ‘é˘í8‚°u“ť]ĎLM¸ô!Ç*\j˜Ćc….űOă×kłŚBô­şN››Wh3´úľŚŃ ZVŰLi3ýľůďE•ÖfšôŘé¤6Ă'f4D+Ëśî ÚL‡ M÷?Č2€ ËÎ,¸° áĚ2€ ËΕř9˨Ž*°Ě}%Ś6Ú8™ŚŃŚ‹‹­đWŐĚrJťÂ^֕.ŻĆŕé†xĐň ÜÝ3>qĎ@XëÎ÷ ˜!ö>Aźâខ3{@ö ˆ‡{F̀î ‚xÉîîp‘Á { ÄĂ=fˆ3Ž ^ńpĎŔdŠ@„ÜOYÚ)kôăTÇŽ”0E‹Đ5ˆ‡Q›Ŕݨ|bÔP5„ó¨Á 2j ‚ŒÄèá +Vúč$6>7Dü~í?;řύ˙xzzwv(ŐtĽ)˘×˙‚NžŮÝX´tŢÜť˙wEŸgÝ7{ÜŐ9I?ćţűđĹf+˙ř'˙óřݏ…;¸^ +Šr-§Siˇ8?ˇÂ'fέôhŰôÍέu[*:ĚÁs+Ŕ…čgŚ\¨Žpć:Ŕ…ěçĘ|ŽŽ•­kkëzmŃśOČI0ǀ_ŢccĽA6?!ö"AĚ Gnl^1‚VisĜŕbÇA6!r"AĚGÖ nrˇ›V›CŽ}JĂ҄$+œ†Ľ|I8Ö& ËƓđŐćP/䪋öUćĐ\m6|Żú˙i*˜Cő2‡Š6I§ă s€OL‹X˝ĐÔËE˙ýćP/LIFä fš#8ĐŔLsš˜iŽŕPRĎŐ“Ş˘číŤMĄ^¨’”yB€ą% ÷ƒ#Ŕ÷c’ďłŕ÷ĽEé÷ƒÄ÷€÷Ů `ţŘäôűÁ ŕű‘É÷ŮđűBĐżŘŢ#éËć]˘Ç­I G…żDËš@Šv‰—$mř˝^ý{ŇÎś~•řŤYń7t‚S˝qŃÍqts$g¸+›|°Zßćťđšýě?ĂĎՙ¨Ňtö Č@'đ°ŢJ•tߗ•xűA ˙iÜ,łNUS2˜QŽÜCŐú *Ţ×Ë8Ŕ…Şg˛\čŠp&,Ŕ…˛çÂ|ŽŽ­k÷ 5ď´ă”ó€Oč9ŠŔ‚#Ä^¤#ˆ¤ăŇ-E=F@Ş"ˆŹĂ5σ,ě0BäD:‚H;Ž ŹAÝänŰz4PÝÓpěS–&$áXá4,ĺKÂą6iX6ž„ŻyS‘)6ćU*ŻçU^—UÝSiL]ęśi˙›2/ Ž–ů ó˝×ůŢéźűB;č)fRňťşlĽ’I͇ÖSK4Rę šßvd6Gw€ θ0áLa€ ‡΅ř\Yő ͧFčVaÍř„棏ů0BěE:‚h>Ž ÝXóc¤ů ‚h>\Cě8ˆŔš#DN¤#ˆćăÂÔMîś>aŐšć§áا4,MHÂąÂiXʗ„cmҰl< _ŻůT Ójő*Íog5Ÿ†HU­žž4­n$ź=~‹ŢĎ>ôýÚţ~đŸ˙ńôôîLďuŮ+{‹a˝×.š \óšţn,HÔéߎčěčwßtAŤUáÄメř?­ěßřEQĺ Ľ Í¨É |bFľhÎ;ĽÍÜ@‘…)ÝŕÂl„3ľ.ÜF8“ŕÂn„se>WWeëşx…P'šśĹnđ 7@Ř `„Ř‹tqAş"°ÄČ @q¸†ŘqÝFˆœHG7Ŕ„5¨›Üm:LŞşAŽ}JĂ҄$+œ†Ľ|I8Ö& ËƓđőn@*¤Űś•˜ëÝ Qeuţďę[őF7 mŠĽÄI7€ǪVÝQóLó7¨Ikh°/Ü@đŽęođ\@<¨`Ŕ'T­@pUfé"žÎ *Š3𣠂ƒ ʞ1RY!âé ˘Âp"#(ƒŕ Ť4Ě J2D<ATgŕ9BfđS5Źk;†ľ›HţNo—ŚQT†Ę6¤ëěH:Yi˘Â4~.˙:~:l‡ úŚ.jš•ź-łě×đ×íxë˙řXܨŇäŮ/CřĂŞ¨Ë†~ľŚĎĄ Ŕ&ß­ޓdŠ|ôo­Ÿw™ˇČˇĂnă ż "˙}Q endstream endobj 419 0 obj << /Type /Page /Parent 759 0 R /Resources 421 0 R /Contents 422 0 R /Annots [ 420 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 420 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 126 185 152 199 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 421 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 422 0 obj << /Length 3731 /Filter /FlateDecode >> stream H‰¤W]ŰşE_ý+řrЈ‘Ôç-úÜď"‚Ä-š>hez­Ćś\IŢmú7n˙C˙fϐ%oDor›^J‡œáĚžĄ^oV/7Á8ŰěVœGeY˛˙í°ŒŁXJÁň$âB–ls\˝üŽOYÝëi1ëëŐ˟Ţsv߯07Ža¨^­ÇáăęoÁűpÍeTŸBG<8UçĄÁňM{Š÷oŤ- ×"~ 1`HSŽ3üívUݜÂu•Á}Č b?]š­yŁhĽŔZüĺ<ăqđ^ŐíiË~Ř6CӞXř÷͟V?lVœ5lUQZJÂ#.–Č$*’„a§š`ZíVŻ77 ‹¨LDAńSlź¤0cŕwí9\Ř"ÄŞ  ü6ŘUIÚ8˝Ü‡ô;˜M˝üŃf<‰$|mž'Ső*ř]¸ůÇŹŘ[i`“ĐD;ľ#ňĚe™Q†a ţyeH"yN‚О˜:Ý/(I”f!f3ęČ€će¤<^Ăz\ÄlÍ^QP‚ ˘ČăŕżI”2ĆŢV÷!9QĄ¤u™piśNE”Ć“`ÄĆăgÉ—‘ˆłrL6Ź9N <řšé‡śkęęŔNí úoŻó–Ey:KŤ.âŔœľ†Ö<*ĔVîŇj 2  YҔCzEb’[ÎéŤsǃ™Č˘ro’|cCËTבšlŘ+Ö!ÍXĄôŠž=\4OďŹ!Ї< x¨ŚĹőiA§(Xă˘9žę¨NƒÚţÁ ڍxę˘â.*nŁ˘ üúaę/†”˙ĄýȀŐíńXáäěq‰°´! ˜Ú픙VŒ&ťv{ą“j…­ŮS§ús{ę۝f|{ԑëÓn˝ ×iPm#†ˇfó›ßŰR䎚ŮôV Ş;6'Ĺ÷jŘëLĺ:5pŔ*W†\—ë2°ţr>ˇÝЛœ+$Z§´ .TŃ<ĐY˙çEér䌲2xÁz˝ÁԚG¨ű•r_ߘ™ši#ÜDM›{ʚÁEŁC('ږś-ëԁ" _Öě`Ş Č‚~ŃéÇ´|ŞĚă;#"h4˘ZÚ˝<6Ăž9ą4>öŹÖóP•ć¤ŐÓÚ]ˆCŰ7˙" EĆöĄAíUČil!l;cŹ9ÚŮlŰXƒÍĐŁŒó¨ůÔFâ}°ŒݰĽĺąÓďN!ˇžŔűćÁ@&6+§˜˛[8îÁżĺĄ‘ŕšßđRŢ“(K󹇜_y ?—^ Rň(.oă—7bye‰ż’2/"™ÝÂË(.nU:h[Â_ÉD¤ŘÁ-}$ťUé$‡ŹÇţJ>‡OlÇN‹Qň”Ş‹đÄłeؑdž*ź ťň,ÂSn—ař"üzóœ:Ę(Ëš` hddFkc>icb´ćő§î|¸˘čŤgOU w‚ÔˇCžA"`ĆqËuƓtşřYáŐ ™Ä%şÖ›PÚ)ş]ĽčľşŸaŠ_Liš`ô.¤vŘčˇ÷űPß6Ý)Kd4ř+Ž%čă[uЀŃ”Š3ćQDꞤ’î3yvćgšŠx\˛‘Âź,ŸÉ7câ’w†Ł“oĆDߌ‰ž`Ć­žƒY–TűßÜwDgŽ˘x’ eŘeǏŠY†ÝIóŔcږawŇ<đ˜Ňeřš|JĘgNůüŇüetfźmŮŔ ~ÓĺŽëY?6]ßúŠ‹ë]KőŽw%Z^?6Lˇ>‘Ëýpy˝k‡>˙S‘—׏ÍΡ~bÁâz×ĘźëM<őˋFUro#Z†§â,Ă.÷‹đ”ÚeŘenžł ť¸á/oDüœóěË[‘řŞV?rf~ĄĹô%$ó$żŮŇ(Š-ŹťŕƒwƔ@ߌg$&Î1Uü?Ÿ hŔ:o>ÍöŕŽ•>|¤Ľwźôá#1=¸cŚ3ëÁŸËkBy•_!ݨ„äÂŻÝż!Ţ> Łz{-LľXśŕôŰoÁUËcaTđɂOÂ=œ†{÷0UÜcaTqŻ…‰ËœŽű-8ÖřŞ9V;{ćÔ,ăSĽ<¸ŤĂ2>eكť.ăS†<¸‹˙bE—%RŠ/Wtů5Š.K|ĚĚßTô[ˊŽÓ?U!•üŠ˘{gLô͸­<ŇRfż]Ńe Žŕ¤}Ć͇Î/ˇý¸Q˛÷+™w#îó`•Îďa÷x•đ†{˝FÜçÁ*ĺ̃G)}îń0*Š?†QźFÜçÁ*­ßè#>÷x•ř†{ŽźFÜçáüZÉ8§cČő‰Çƒ6{gúł7ŻľkŞ@lu“Ţ×ëőrl@h™ŰVřß§ô‡mÝâໃąę´ęĹÝALśuoB­'ƚÚ:€€†„]EW%viđ}ą//bWvKôĎEäct‹čpDxčó ś”^ŢwňčâŒ|‘ţ”Ž“CJÉF—LÝ-ú*ŢüvĽcˆ[mţ%Ě/BÉ ˙%¨°n•MkzĐ-üü'ýŤŮűŽţCxómoÎ2č ÔméÄÝä‘t>P?”ɘä:ep6 "ń‘Äô ˝Šä­—r–Ÿ%˙ý'kN|ś€SH{ ČrߟŰづŠç4ś¨[çчşŻOČ{2zĺFzĺ-zÜ[Ç`ëvęB/łxĄ‘I4ňŸÍŤ˙†—˙O Ż&JW#Ľ QË; Ř՛>šŽŻË/Ön~Ńn~­ÝLľ›MÚÍDť™j7cíf˘Ý,’=,śœ´űäĺ÷s{kR^ÎĘËß0Ů<ČępźÝs%Ô,šŒg"bAśše4 Póy]OźŽióĹŇ Zćq ˇ1OGp0{{ÉD‹ žŘGPjˇ~čMšÍu“yzG͡˙cGžřvÜz\`ťĘźGŁ$Öý2jíQw#:€mŤďLpîŞ}]ű^Lžâ{p%{ƒPfKJó:đyEÔ!`*X. DŞnÂlšƑćŞMňáé%ř)Kőç:ô¨$ŸÖ÷.|{+Ý|VŹ>‘ˇ!›„—îŠE>ĄPi˝÷g|SÁߍĘý;‹Áĝ]§ä—öhˇŇh FÄ Ô‡ĄąHR>4hĹúŻC]UűŠ‚Łž­;Š}a2›ćORĎV'ۖTuŔdĽ3 §š¤!O' Ölöšˆęőł#ç Ěb]oÎ~hĆýšČţ,umč¨&Śsž#R:[|.Ć;ČŹsGŻ7t˝ăT2‚!›0dŠJ9Őrf.ňŁŞkđ .ýç2|q'ôaůƒ8áŚăNw<‹„{‰[ëMă۝ÓŃ- ÇŁ‡Ż ó Çű˜BYŚŃ‰Â‹.1ńw.MGpi*ŕqBšď+‡ú.ďˆDJÍÓ<Ç(ÔEŠ5˛hůC-kyœĆ +†Ć3÷ŁÔ/Žpj Qâ[DÎýކĽ<„ťÓ. Ĺ´ŕş$őŕÖÉnlô<ü&¤ƒT¨.¤Ug\J> endobj 424 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 471 660 488 674 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 425 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 184 611 201 625 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 426 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 427 0 obj << /Length 5483 /Filter /FlateDecode >> stream H‰„WÍră6Ž˝ę)pÚ"ˇ,ńG‡f’Ij÷šŠľ5I<{ %ÚćŽ,şDĘÎĚ íkî×R– ŰU"‰nôď׍ƇŐâÝj%gŤťç™1†ĺř÷Ż&Ďr)+•ÎňJśz\źűą×lÝ[śœőëĹť_Ž9ťďŕÍsZ/–ăëËâ&šN—\fUň-yƓ]ý4´Řžęë‡Oő†ĽK‘'˙LÁbJ,C“. <÷wőşÝĽK“™ä>ĺDbżڍ[ih§Ŕ^<9/xž\7ënˇa7íĐv;–ţgőŻĹÇՂł–-Ş*ÓFžqĄ˜’*Ť”b°´lß,îV ŤĚ(Q‘˙ä7äfîüą{J—Œƒ‡Ř•ěS…ßVĺ™$Ăiń!ĽßÁőîgq•IčZýD˘Ö‹äoéężł|Ŕ6ăČ. Ę*őo¤™ Š2ŁCôs“"iVIMQ,î+ …YˆÇ:ó/ –&O4ϗžW9[˛÷ä” RU•yň?•iĆاú>%%M*i_!C˜}„ľČt."†o՛XË+ě,,ÖnhÍD#¤Î“÷ˇ}ˇ= {Ş×_›ÝÁlřÝĽKŠôţ1ĺ"+“z e˛ÜĆz '[ňLiŠçMň™‚Ł‘ťľŮą űąŰ4ŹíYłŤoˇÍćŠ5Žľ^?€f‘ľož|vGŐôúśzÖÝąžýËÓŻőÍsłťbݞ5-°5ě– `Ě^ đ÷sŚ[ƒšž`ŒŔęĄé/Á8 T>dź5Ŕ$kňfxh\ţkŠ OnIˇIźĂż_ą?Řś[×Ö7˜?؊ĺÎD*´ťvwßě¨$ЧzƒĽM*@ÝőpęÉkŤíbV÷ěĽŮnéi]YýĂťP çIü“ŠŰB 6~IžöMßödŤšHž¤ěŮę( ƒś‡†Ő;ż´aĎőží>ÄíŮcS÷OŰĂ$•ŘVÉ#"…GłCžj´Š~¨ěşm :ú‡ Čd°ÚVűÔÔ¸oj›ś_Ű2?ô}c_zŠ}cŽŇí÷˝Cé#+„ |sďfŕçž}î튜O'ě+#R1°vÇlKáśĎđ¤qlóű÷Ýnłˆ*1č$;Ş,9(ëŰď.p. TŔů°ďś¨ e´¸C3°0ó5Çs_çč!Ečq¤îSmˇ• )*`ęuű˝yUŞ2+ÄźóUÁ抄$6yžYM™Ńłfęľ}ĆÁ‚´ XO‘=V°Vs5:¨ŃžÁ2ƒcŐj”Ät|‘ČĽ@řTŽ7‰í".@ÚHŁ0G„÷iúKš Ǜ6Â6G˙ʋ"SEQ1m Cá$Öf˜ŚJ=Ćwý!MémŘgkÍ+Šů'×8Sţ¤ˇ<­M­çO)ŸÓɉfNJ‹\f˛DŠ—Ď:úŰtŹW˝@`ćŒCp 2*Ađä% e•şŒK( Ö':7Wqt0ŠRfšâQoѧ0ŕŠG:,W˜˜^šĺnÄ8&+bćĂÜ U(Ľ5Ó%Z"GT=†ÜĐfŃäϕ<]jęAxh OΤČq˛Łh˙˛ˆą§áŽđ'ϗd\ĄŇO íŁge€BâÉßSj+ŹňŤ{>ÚŐvšň%M—*ĺ3DęŞČ/}Šęq#ý/‡ĘĘňǘ,âČuŇÍOčNÜ)bűIĂ)˝DCžöˆÔç9ź§.Q=băl˙YŃ-*>íçaę<‹q†e„l<[c6efd9AZkó:–QŽŕIŒc˛"ƁšT.ZŁĺšĐríŞ3]Hi#jÚŻĎ"Œ3•™a˛˜Jżšľ!ĐkîšvO˙š9=Ń´ç׍u^Śaş2DÚđHżůˆ„ą _0Ś!&Áˇá‘~Ą ÇÝÝÄľF› möG03Ć1Yăx-˛ÄT:ôhŃÓđ(üđČg}uÖQÓҏYĎnžkÜ̡s_śŃŇ-AHŰVu˜Ęú´ÂÉGŘyÓq°Šu´ÇŢH‹°u.`ƒéú¤Áj@XÄĄäȐt~Rt˙˜ ČţFŽ| E1ź ŮĽ†ŁöEčA}„ţxp+s ĚuĚYpô…mJGĽ˝7ştŇáęaukOYăĐ"=•’--Z̙U‚_]H¸§_ČxDBHy\ÂӘ„1éž~)ëQ7&7E€Ĺ<1Ăť•Ľű@ŁŢĹ@ˇ!pDt„PĆuĚBŃ1rÄtŒÁöô7‚}^Iŕˆ(y‹î&Ůpšň,—†ŰŠßWT)SxŽ”ű-/Bżĺţ‚űs{Ř7Š˝t2ľä)jC'eĆŘľ_ݡľ[ܢÓźYßşďžŰÜې–5hHý ÷(ˇŐŻŕN…O“ô¸yáEŽë={uŒĂcĚč ˝Ř*Ľ`Ş,3áäpˇŢĺtí˝IVMŞč†v‡ZŽ’ƒގ[ćVŃŕ!RQk őK––•:‚=ßRéú…cőâŢßÂQżä„žňTŰçÚţ~uĂź}' ŕfmĎę˝Uá~˙.]’śűن}gŽŢ§š˝ ä‰ó¤óžt/=Ňňk7Şę#m/íđ":âC ŞŮ`ä§ŹĎ)NĂGľ ÓźĘú„™Íg\Žw îŚ:ö˯섵¤ž"đŒëŔŸ—#?˝‘şáĄaŸéˆEw}ގ‡†Błëö´oúfGÎ.ĂŤw›ó~҅šŰTÎźůÄ]ˇO“|O—Š'˘™e&ôř[űą„uä…~°hBMlÝłśżH Źoď¤w)ýś”(<֎Ë-ěśzÖ9űyâ†ýqĺÜ[Ň-P˝^v.§ŕm›şwjU°¤2jďÚ5U'őn`ĂKçL÷jٟd˘NŽł -‰˛7„T+24d'Ѝ@ÝQí_9ů#Q uTňœŐ*gŐŞ}źqyĹag>´+hÔˋńSŞăOyü)ěg•Ű~LË_wA˛˛Fű×ÉhĄłźĚí|!€jQčÄ0>ŘŮá-Ě Šăč1€&uf6‹Œ f~‘\‰@VMĺŃu”W8´`kl…3ŤŠ“ŃayŽăâ…Ä|„ă(˛ƒ´_ Aż ObŽí÷÷Ň(YŮ{_ň#ńH”ĽŒí—GŚšHޏŒ[am)š;‰yBČ&ËŤ ŠU=IDsGˆ-Ô2&˘âBjU‰%ćî ňë"ŤJO™zĘsÔ TgŠç¨SJĎRCFÎQ§€žĽ‡ĎQçŽsÝgL‰Ë­ÂKixş_9u?ĺşÉ‡o˜˜4 ô€Ä×}ęĚ=můŻ2Lyz_„.…ŤÉ3+ÇƊń§‹”ś§Ý$ż5v˘Ą+Oá2ű…Ž”$ĎÍćäřT”‘p‚*ƒ;&bßą7¨&E3ƒĐ˙ł^mKnŰHôWřHVyTź_jŸârů)ŽlĹNmźë͈k)žU"ĺŮÝßH>xťtƒ#áč’É“(žĆĐ}plĚ˝„ű]Sć5÷>v玱÷ćŤkc;"÷ҸßsgĘrnY?ňľ˛4ŤâK-­qlÓ5<ôƒťZ=š_fnLGţ™žá ÇüuÍĚ2ňÄ­ËEIůt7tŽYwŹ]áő #TĂ(ÂëF¨–Q„×3ŒPMŁŇőšŽ˜śt˛î]‘ĘR7š'ú.y™e€kŽ.¸ćá’]€kn.™řĽźŇAkróAseŠE—|ŘÝ^ňˇfř†€äŠ´€Ao˜AŞ…¤Ń{†˛ˇrŔ ˝ŽA+ޤ]CŐ`ЎŒD5°šRí慪ŽŰjöu ĂZ„ ě3†5}AŘç& ëƃđŐÝľčJşŮőÝ5żĽť]ľČfôi+Ÿc|V™=ĺ™s'ĘňśŞ¨OýíěťÁţŒÔpĘx3mÜ˙-őؖşźý—ŰŸĹ˘˘“ƒNŻ5CÁĆ#|–QÄy[˘ů)ÍĹ+>‚čjBŚ€vp‘.ĝv.ⅸS/ÂEžw™EřĽźÖœ×özťçJd] í^pl÷ÁŮ=fĐZąű3 R-Äŕě~Ćě1ˆÝă5hĹƒł{Ě š b÷gD5°šRí–TU"ť°ŻSÖ"aŸá0Źé Â>7aX7„ݎ{şí“ĺ7×Ű}q“ÝóÇȞftvŸľj÷%ť÷‘ÝóťÁţ°ÝˇÎîůiKë [ŻíżĹ"s Ą3^/RMNČéq„O0ЏŕHMJ…ŠňW8=ݠаÓ\U‹p‘-ŔUˇá\•‹pÉ,Ŕ/äľn8Żĺ N_“*ť ;˝ĂĎ8=b§‡ Z Ŕ N¤ZˆAœŢ3 § ęôp ZqÄ NT€A3ˆj`5}ľçŞ:vú0<ŻSž!Ď3‚gé Ŕó܄ŕŮĆđőN_ŐÔ"ëňz§/orz˘oşş¸ĺb˙ůŻ˝Ř5…k†‚v#|–QÄ[Ş2ŞNÝžÂMƒíŕ*]„‹vŽâE¸¨ŕ*_„Kf~!Ż%=4Í n_Ń]ƒÝŢágÜ1ˆŰC_Š0ƒş=fĐbq{πÜ0¨ŰĂ5ř‚q{Čŕ%fPˇÇ *TM_효ŽÝ> Ďë‚gEŔó ‡ŕYúđ<7!xśń|˝Ű“ÔşŽéŽwűę&ˇ/ȟţš{ýçżî^_RŠ59Aهš`qÁ zÓ´Ĺ+Œž(¨Ĺ´Ř莪E¸ČŕŞ[„‹pŽĘE¸dŕňšwœ×ú§''Ťş;˝ĂĎ8=b§‡ žauzĚ Ő âôž9=`P§‡kđ âôÁk"Ě NT5¨šRíô…ŞŽ> ű:…a-BöÚž ěs†uăAřz§ĎöŽúz§Żorz: p9úŇÓSâŹŐłÉYڒÉ˙3Ąueq´Ű÷cB#ăńd´ľxßGÍb‘Ÿžâœ†Q#9ăĺ0BS#.xNF›äŘ?ďĺYš¨ĎXyVUXT†U•U†aU%€%ĽařB>ÓnŃśi~ƒ‡g,xčŕ=ăßáŃâŢ`´Ď~h´:7­Ĺ ŽזŃČłƒŁŐąÁÜž´ÁŃâÖ`´Ż|h´:5­ÂWLę™ÍeslŇAÔ×#ˆjžC¨ĎgŐ|…PŸ Şű ĄWťsŢŃÖÓ,ťŢ›[Ü9ď:^ĽŇWʞ{o.čzNžüŽîŰ_žC?'YMˇI–ń%=݉˛‰11tOˇ/ -âĎće´ŘŃë8˛~_vd÷ż ˛‚Œ.ňŚ”Ú jÓ 2îŮb‘ž:yGޞk(@őDB(@UDH(@ՂÎgޑ\ÚŹúó(ďčŤÍ`'B¸$â.w—ÔAÜeár!î‹đKyM9Żíő ‰+‘ÓáA-Ipܔ ƒkK˜Á×"Ě ­é ƒV 0¸ö4c 1H‹Âkđ ŽMa݉0ƒ´Ş3 ŞTMŠ69z›Ł~`_§0ŹEÂ>ĂaXÓ„}n°n<_ßśr÷4oŻo[íMmŤ5-ŞúZݎÖ§ß捏5"ůôÎ. 0Ń˙ŠNîę3}rG!ńč~÷ßíŻűťJî:nLGkŁ}V4Ť!őœvľÝß?˘ď ]&5ĆǃůÓGE¨yąĎ¤šîP÷Â^.(ÂE\pÁŚ$1ů+şKS“ă'çDá‚îý>fwŚęđ3Ś  0˜@<N g9<‡Ă¨%ă ¤ź`…ÁâŘ~äŘá <ž@ î@ L 0˜@üN žžŔĂá ´ŕ ä \Ŕ_ş*}/ĐńËĚI”眎…]J'0ŻČ˛Ň˛ă#ŤßÉ܍ýýćëaß'YĘëň.KĚĺ˝]DŃG÷vżYڗtˇgs[ŢŰ˙ă@6ež&2ĺ‚=0eüi˜6ćۍvËËňÍąM'ޘq3őó#űNÁŤ§ÓĐäuÉŤˇk6mAžxőŸÖ}ôű‡ /Ź‹WŤGűĐ˙Ýťw“ýĄĚířS„˝uďލ‘{X@ďűht/–†Ÿíč)çÇ˙&äxE<Ň_r~7ßĂŇ­?ZŇřÉţ9Y`ä€á0öŃýaząŘaű7Ç1š }6ńL}$ě2ÉĂaŸÜľź)jT­ě×$9%Ű^đ5ßvҔvĚćďŁůaQ[ZÚŻůG{”‰ĆÉŇM\‰3ŰČc’‡ ÷ŃfFűüťŚÉ2Z’yę":vm,ŰáqÚ||ŢLćĺÚ-ő¸z)˛Á^bS0ťćĽŽ4íěBceŕÚńĂr÷~8ěßxĺ|’yiG'” .ów—@U"ťdťÇ]’ę~ďÍóćq3š|Ô\€)mž&˛šŸŘ(Ě?چÍé`†ÚäEĎk)˜KŽšˆÚ`ľČĺ‚uź=SRoLŰźź?H̉#Ň7'ôŽ ƒR"/¤üdf¤ŁYň…pšĂŢÁĎě|:GsÚHöF€Œ¸€‘OmFĘÝ÷VBűž/˜-_0YFEüÝQŹ^•\틒š˘ź%ϠܓŸ– }ÍSI/ž%VĆüfežOrY-ć÷_ˇEKş÷{ ą|ýíWGŮ,e9W›zvę<›˝ …l–M cĺڍßkŘ{\ ŰDŻ˘ĺHÄÞ湧t¤ĆƒÍPý§áđ°ţűrő&ZŇŃ×ĂáŃ _EÄşůjBˇF l˜ýĘnœł\ŸŻ\íÚä˝–ŰĹśvĆő0N§ĺPŰŠx€]ŮĘ{cm9kAĆŚ2Šçf׼ľ"6äh˘ŽNÓč~ypÖö4ŹúčKlŽüQ s2ÖeČý7Ď["pájFö>?ánĎć”r$~3•Í:'!ç$Řň”fĄ"Łťź^¤Őq:+ÍFeŠ]¨.ٗ„Žwż†]Ďz Ę,-qĂm“ś\ş*ÖDlśŃ÷|ů˜zŸr‘/ńS”ĺ.EܚLŃŞŘ{6SÎü´<#ŇiżÜŽOź˙­ČHtš§|ŤůćtÔÓŰő{rł‡AZ ťçOĆĆÉ7 çŐrZFO÷Ö tm;äm‡‰óó˝'–ŹńZ_>˜ŚĎo–†gę”Ců†ú˙‰qÂ^ endstream endobj 428 0 obj << /Type /Page /Parent 759 0 R /Resources 429 0 R /Contents 430 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 429 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 430 0 obj << /Length 4146 /Filter /FlateDecode >> stream H‰ŒWŰrŰČ­<†_1@,˜\÷ÍśěMRľ‰ŤÄňË: ŠHH€E€–óť˙ßĚéî@J­KU€î™î9};ó~ľxťZĽŐjťĐ:*ËRĹřseĹÖ•'iśTŤĂâí‡>UëžŐbŐŻožÓęĄ_@7ŽąŃzążwáRۨţš8ŇA[‡ËWÝy˝ű\mT¸4qđˇ:†¤2Ôá2Ă˙ÓśZ7m¸,Ł2x5‰ÔĎçf#_jZi°˙ľÎtÜŐëŽÝ¨›fhşV…˙Zý}ńqľĐŞQ‹˘ˆŇŇâ :Ň&Q‰M˘"I<͍:Ջíâýęl•‰)čüt6]Ň1c9ŕ‡î. 8‡bUp ü6đ*Ž,9Nw!ýâÔŰOń$˛°ľşĽ­Ö‹ŕOáęßń€oĽˆЄş'˛Ź ĄŹaěűşŒ2€H–“ "ł€áž!fc.4֑{€4/ă ŐńťÇEŹ–ęʐ¨(ň8ř_Á”ú\=„d¤-­Ë’ f‡pj˘46€qśÄĺZ`‹B°vĎ#ŘY‰lK MhóÉM*'76Oĺäi˙ß[:eźWĄą1>ŸčCtCˇîöôœőHô,Ç1MYLŚăl=ÓŤ]­ŢűZÝÖý†î(Đž3rą* zův<‰ŞéŐšŻ7ęžńÎ$R ;´dł_(ׇŽßŠc‡‡Ś%œĄ˛ŠżšEČ(ƒŽë^UHónŘŐ'9…´NçLI'§^ÇúÔĄ8› ÁłÁž”âÓÜR¨-! œ“Šœ%ĹYŞýž{ěŐś;ŠűfӜę5ŐW%ŘîŐş;ÎmłŽ¸ęîëṎEÖŞJíşŢeýę/>HąĂń<ŕ4tŽóQ Ň™:ÖZńźÚTU#mß7­ƒçA ”ýŽ:Řç^=6|dÉWDxćź)ŤD‚•ぼ}=Á ÝĚĄśflšł5›Ü6đľúzżU•KŒJ:$Ÿh]ÓI†[_Ăo÷ˆŞ%@š––?‹4ť›Ďí6Ď75ÚOláFŽ@Óóy?ŔžP.ŠđŒf‹říŠ}BŔý9w9šfݎ:­ GŮghî÷n“ÇfŘIČűĄ‘ňńΜ\"&´rtČ÷aNF‹v–E‹˙od™ł*NĘŻlsâçžâŒI0Œ›÷ —v‡=¸Ż×)WN.ŚžTˇUu?œOő ]mžU’R%˛lŁśľ¸^]ęőŽú"&áنŃÁ¸Ž ~Żç\M]Čľ@Ä˝r % rŃę2{œŽBNmőqš S.ů´F=„ÖĆz ŕŚć™ÉoŐ:,dF^w>ΟĚNůcćü1Sć‡ÉąŒ#†!@ľÔ´W€t1Á™’ CUđŘ6ŻëžÔĆ}ŤĆ•ŁU‘×$Ţȸ–¨ôß €&HyýtĂGҖu~źˇyvÖDܝÝ6›Č%ߕC,şđčĹÖů,SŕsMES]5ż˝˜˙­s!?Ö흞â4~:! tđ;<`¤ęčœ$œ#űŐvܝĘŕPqZ&œJjWĂŘ/vŹŢÉjůü5x“:c_Ŕ/lđ5Tűú[˝§nčó¸[uqZc'ĆÁ &HňX1ói‰Ž0g™x~FIŠKJňŹqŞăy”ÁtY˘‘Łbš~ŔÜŕWó0@h>6\=ă—~š!7Eéľ57Ó…\şÖčz2•áŘ7YŐ D*,űŁ­ňŰUďrŽĘ3ĽýZúJË'“VšŸ5$ŁÇĽ0(•k–TřâVă­dŠ&Mvh5€ř+'7ůPË67ŇQďnĽYŢL9O†aůtŃŮ[Vďĺeíšt×öS÷c˛:srí8yĹ•ˆŞfĎK2‰2”ďƒ|şRp=ˇ\(K/fŠžS"ŸRÂÁüŽUőwŽRŽ­OT;t¸ p şŕ4C˘*;Ŕ“%OהŽj˙X&n,umËŹ˝™ŇŠÇ%Ďś#Ž"¤‰śuŹ GKÔWŞŻÚSďĹän1’ŘŕÝż5ÔűƒG”V‚ŇúIvŔÝ#- “G÷h­2°F&˝6öˆ56Ëç"S\b°i$3‹87cnŚĚěáW^XqB˝Ľ ¸ŕ9ą[­ :Ď:JJ—˘–.`ú{ 9v4Pq‹p%#‰ĽÂKB&ÓLˆ¸GŒ_'Ćô˛ŻˆqČ|#Ÿ zÂĽB’DYŠ+€AkCĄ lóTüňöIĹĺ$Îm”ŚW ]r’Ěw8xö~<{l'u‡î3ďĄ Ţ_*Ě<;ŕžóRŽhËjeK4äÔäăURr„bďĘŨĎÝchcWšů4¸ň`2ŤDMä/Š`aIšŻ]S8ęš.Ž4Ć#;1błÍŚ˘s]Ń2ňŚäY’Ó,qE÷&ý"}ď)ćśDŐ֋ů(÷c>jř0ĺ~Ěý>Œ>b0–öĚG ?ćţ=ţó #Š$¤‚´#™‰úŮĽśfÚňXmĺßFîúńÖ}~ŽŰĄMýŕ;ů+ŕ; /řNţ ř^fľN_ßiźžwřnQ'Mň\ű§Ń%˜)řĺë—~šŰ+—i1ĘýăÂťƒŁÜ?|;&0X;r‹Ü´ĽfČĆgc‹('`‰V–t“&'3ktײOÍn‚!ÓĎtIW4bފ8 ¸â˝ź‚)RłŽŐQŢyoĺHɓ‹ž—e9:E%ŒZ‹~]â"h4ťä!ݸę¨ßř˘ÄŹů´ěÚ߉ŃľĽíAf‚%œî’A;Ü …8ámsĹŚÁŒÝ–ýŞpĺęwÝגű׌-6l×ăî̙ęÍ“Brůk{qĹm%Ěî84ëž/ DQÜ6§ԑlÁc… ™ĐÁŞU§s+”ÝžZőŐÁqDŐđş:mž™rĘUHW.1H÷YơCˇ9{Iăł0´[pĆĎwoÜ`ę˙Ÿt+wž” ôěÓę—DżÓ`ĘN°ƒňâ†e‹šhżz+.Uc3yĹm6ШK9†Ü°Š%ĺħOÔĚq™”˘(ăâéő´›ťŞĆľKćÚČçŸ88#-(ƒĽ+šGřĽIIݸŒâ$ÂęO™x­Pë*QŠB­ŤblTšXŚR‰;?ă}>ůŘ4âŻÓYŽŸëěJíŁ€;†˜#ţ?%Ž“Üg!CmÇůĽ›^Y0qe™őZ˜ä &."Ű×,¤6B'ôpbßţ)-ZÓĆo`’{,ŘXGY™˝f!ÉŁăŔka”ű,$–yÍČL‘~ ŁÜg ŮĹ+’/> “Üc!I r–cB–ĺľ…"§’őƒG<ׂŤřg’IŽ–ŻËçľ@Ž\h\ć˛GcÎŗ.“ÉŁq‘ ‹`žŹq †CˋƋ—üsp>šh(Bâ…㎠0H(ݧ’ŠČ†Tńĺ(Vďŕ#[ďăzx݌‚XFkbpj'0ƒŁÜ#&4îíőÝľxpö0˙ŘÔˇ%L¤ž$<IIřÇçmâáëF†Ł kÂt§+6ëăćI<–KEŁoĽ´tľČí0ŤŚ EGíPîśó`v‡7Ü´Ýa˝?=!îńvÚ7qsXÚˆ”ťĂ.öq;œöđhóÝV/§w“>›gÜ÷wOá{pź­&Zý$ޡ˛&ćŽb˝FČ}.ŢžnƑď‚vÇg Ř!­ĎĽßĐ´Ť›ą7+~(ľXÝ,¤ř/čE 5â] ü)î˙­ĹÓBĄ0˝ښŠřökœi$2ŠFőF…jÁ§­+ŽĹ=ęY†kÔČž2č9ÂzŤ°ŢGő0P33ÉĘĐ ~– ‰Căő"¸f˘ÓŢÂ<ˆőbÄyź K+ w!{dEŃÇ@Ÿ˜‘hi/?ţÂ!Ô !(P$Ă×d†4¤ŘcFWęlć ň“Ú+ŽĘ6ŘXŐU-ŠM¸Ä- )´pmÎô§ôVÔtźHđİ”uÝjv7Ě@ŰGîk+l7’k×Áţ4Ś3og ó¤ÉB; Ňp3Úö^ÂY #3ą0clqŚöނ÷> endobj 432 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 433 0 obj << /Length 3695 /Filter /FlateDecode >> stream H‰¤WێŰČEäE_Ń/Č`DłIQ$7Oăű.bŔČŘĎ>pČֈťаЙ8Ÿ‘™ČoćTU“˘$ۛM`cD˛oU§NŞ~šš˝X­"ĽŐj=Ó:Čó\…řçó0ă8Ré" Â,ÎŐj7{ńĘ&Ş´<-Tśœ˝xwŁŐ˝anbŁr6gŸźŽă ó>űQhŻ)ö}ĺŤöPn>•ňçQč}ďc}šŇžÄoˇ.Ęşńçy{÷žŚ!őîPWňĹĐĘkńŤőR‡Ţ)ŰŚRoŞşŻŰFů?­~˜˝YÍ´ŞŐ,˂$áˆt´P‹xd‹…‚Ľi¤:3[Ď^Žž@œů"ĘČňMçäf(žj÷ţ<ƒqđŤźÎ_ŕo ŤÂ &ĂéăƧż˝őâ­C|Ä8kőšś*gŢďüŐϓxŔś\†ĐęžčdƊĆN8_çÁ ŇÉ Ż —Ă}E ĚQ4™QîŁiz‰çŘ=ĚB5W×äTDCY–†Ţż“ RJ},î}:Äř1­[&#Ěá$ ’0úͧaDá’&Ţ&َ‰xťÚľnˇŰöąnȈÄSĄŠřšzňš+vĘ)€ÉŚ}´ŞÇĘşéM~4FŚ–ÄŤîL˙hLĂS6­íUőĆ%Çۅ`›Œěe§ؔŒ҃Ŏůׯ_ÍÉŻô#äŔćŁ?'rŐw˛EĆînjČđ<@˛$iœDLş‘oHr ¤†Áa kŚËd2ĽĂ1ĹĂ8×ĂB~Žb•é…J–Y°H˛ĺ1ŃƒH\z[ß:ă#<•Ě〲2ő”"Wíg‹Äëý9ŰŠJk?!ď)*ÂţŐjńk‚“ áŇPë!á"I¸ Ö [:§ż¤ŕŕX:хJř1tA>t^{EcwľľŁ,L’Œ‚¸ŒYś}^ywýš˛aá˝ô—Dű}×ömŮnUmUącfŢ~ë˜+˜U[Ů2ŻŤďL އ˘ŤŰřĂv˝ßoÚîśuY0Ż”…,J˛BÜÁŢ!„q ŻD5FU˜Oe4Ň@„ź}+ëç˛ę”Ża<şę@Ľó>čö­Ý¨ˇĹŽŢ~VďEݐb¤g]őXtćę E¨w|˘UĚQVÔŮ8užőŽŤŞśxú‘0Z°˘,=ť5ňĘ fޕŇyŢú˘TZvG΃;™€ĐÇŇŁ]žo ‹ńƒ!QÖŢT{uţ\đ_ë“_ňE5mĎĘĄ‡ɚˇźxĐžŁÜžÝd‚<ËŚ.ź|—‡;ŕŽvťx`‘#-Ǟ>SŒĎRŠŁĄ˜ŸĆ‘4`.ŤG|ąX{CÄ ‰ňi9J= ńáHżőžÎĹ&ŔŘHÔt1Š™ď>źőŠşź?ăQLˆyÉ'ďůÖ˙˘zœŐOR“WůąŠţţ§vƒů“tɏ>çc~wčˆíŰ˝şŤ{ÎjůôÄ?!‚™{Ďň‰&ŹŰl;îÚ~ŁJhyŇn'+›jŘqçŽE{ňŢËĎ_(ĘkޅŠ˜t ´ĂA&ËβlÎo:V­ŒĘBf O¸ŕJN™1 –>`˙ţę"ô^'ˆPš!”‰˘žô_:jl b\đo/?'hĘ r)uŰĆ@ˇœ ‰ô†”ëFÉ–ôFOR(‘p$žöiň3?ž ‰T‚6‹^AČTŐ×;÷3Ňđ”>tâˇŕsęčźK–ßHźOž+A uçZ‡–ĚçbHýÉFފź˛( PňOŇRGG!sâ m Ô›ÚĎ= .&ţä2řË žšŤÓÓ؟gG–M}ť¨ ŞCsČÃľéě 0c„QŠ Ő¸†ˇuubWlyđąFŠŒ}ŰąöS%îŁé;ĽřČ0gAAŐ˘nj[ßmÍ­Ż65çJĚá†Ęî9+@-ÚýJ çvÔÍŹYśb0ŽźčŐŽ/ěGm˛ľíYŮEšÇ/š4鈎cżmˇFę~.% KÝöçl[ŽúůkdK'zuyĄ˛Ké!Řçŕ\ĄK.ůŮy_ÇŻ0łˆú^Ç_IFucş‡ş”FÚ¨ż™żŒíݤ]ĄÓ`;4Ę҈¸ůáęŢ5đÄŽŘű—=ĹüĂÍě ‰)BxgŚQ‰Î<‹Ă]0€Ž8üfFłłŤžU'„Ár1Ĺ?^l‘|:‡B¨ç†ÜMĹžűV—#zVľeypß;Ő6[şŢ”Ű6'``]Qߢ†ć}yÄŃGO?š—ćeÇ^Ż*úbÜŚ]Łg} Ł#&f˜SX‹žŒ2ŒR}?… Ȁb´íżş"UŐě]IŠ=ŕSyĽ‘Ž/ż(űÄړ˘˙+äţJ(•?—Z5çž­oç“ţ­—ŽMZ:˘*$WR°ě¤/t]ÝVfM›Ä~8Śä™/ˇ…ľ+ťËŽô GË@%ÝëÚu›ťăĆňĽ–Ł-„nN7´{™ďßťšu3 ̈́!cl†ŕL5RśîäÔ3=F‚N4Őuę{WżąiM’Mrľq_ÇR€Œß¸TűO­KžĄźkŢ1Ś~)äśUJtDSĂD˝™Ä{“JWÉ4ˆŇßR%ó •’#•\˛#y8†ßűтő’Ú)Đă= äç‚˙ZRo*މT éQdŒň‹ßx—Z֑RđrMśŕ%ƒYQÉáVŢl/{vÔ?cPŘËKˆvr™ ]ľřF˘îLaňt naˇČńOľwÖâŰ;P´ĎĂŚ˘¤ 僣€öÇ"aŠ#Ş"‚Č#”ŔŠĐ˙+_émV­*ę ’ľÝÂrĐą2˝)Ľ‹Ř?‡$ĹN {ZŰ_Tüěâęoô"ł.´ˇĂôvW˙“%´Z$ţęĆ%!jť;ÓŠ{Óćwö@•Út[mÜT‹˙”ž)!ŚŚjšË•#‚` ›˘ŹŔŤî"Ă>yěĐó Ýv`óőÖś‚„Ť Î * ”ÁT x"™î/œŮrUO$ňĂ:8líłZ×fëJÄęĎÇëX9ŢŃ%Ç ś+Ď~Ċgě-›š*DW°k¨!ÖwÇ3Ž1t>¤Ń^tJ˙“ô1=ôŘ'iRsW#\Ÿô$­ó_}ęNŃ^šć”2Ŕ–ku˛źĐ(łŚ ŁÇ˛§Ě°\W$č2Iů•C†­ÍŁh˝‘“PŠ;Y.ł˛íÎ4=u^˝€4Ô+h‘†đâ!Čç$ţäq/I‡MLśCS™uݘ Dy#c=(@W:ń9bŸ3ń™ÇŸ°V"iDs.ő"b¤fĹ@Áą3jč heÓň&|:gÁ7FíËä˘?#pšOzŰ'ik!qřh¨í9žBă†ĘgwËűrkk¨d.&OU0Üţ„|™˜W¤‚Řd,†MšB–ěűş´ęú57ö^úK˛xŐ cÉíóćc†˜ľČĚíÖ)ŤPˆ*n9 ômH„7ŤŮ‹W6QŻn@oúwójŚŐxřY!Ż–ęQĄ`~PŸ~úăŐŽ[U kîWœ2éČďG@)M:PnCHÁß3łöÚ>!Ş{=gźŢőÚłkł}:ٜö€Ţ2–¸'T̊KUÝVQOđóăóÉ'ăť5_ěB¸FbŢâJ}ßN> ˆěś„ăh}ÜÎqiw5l÷@pۉxtCى¨VŮÁ.Eŕ”=Ř_’u+§Ż°p𛢍ǰgoW$%Ě ń'ç1)Ŕeů)‚`"9ŠŔÁ—ÁquO~ĽL [A~–Tä~"šŠˇ ěeđn œUöň„ƒ{Œ€#ă:'ía*BËxŘvcgťńhs絜ď­ĚZŤÜ2¤$Žú÷H§pX‹ĺ8í~ßaFDvWF@nW :nkp†"Üý¸M ^žŽnřnxl7ˆKşƒNzüëűnB °ƒpZ.ް]ě‡ns{ ÄąœŸ#O˛Ś ;Ą=RŮ[‡Ţ3ţ™[pÜv<ŃŁźd˜VFšo/Žâ)#âڟ$`C °‡Nsńˇ´ľrŽ5¨ü#m-ňQ­"ĹË˙gň¤ĺQ7rWq‰CrĆK•ťjÜ†dp‚ŕ)Żľ7Čsn˜Źě‰đCđđËăf*çţôĺr‰şC­Rŕ ”jA$Šy°Lľrů4:kAĐi÷“‚í 64ë´bÂO븏ąYž幨[ŽÂ Čڌz KÔÂlZ˘& bžDí*ÄtáˆůŚ‚X˘ź¨ŕ@ş†!ç…;­§;?UÇ8F”iZĐńPÁt şĆ5† /”Ą^Ş…c˘‚uĄć´ću Í5ŽY'ÔulNۨ2†WŤŘjAÇşđDškÓBs}ŽĄÁM/”Ą^Ş…cœ7ŠďŃČÜ@úž›(‡wä…E62gpá ×ó t<27žďĂBĎËXcdnxĄ őR-ăŕÚ­‡-×˝á牠crŇš\Ľ›Čľ`5ăůg“â2ەňdžp\†˛ô›Ęű\˘vDg!y’´Ejśł'ÄuťiqœÉ Żö`9öŁĐŚ9[ rGŸś%°W]I❟M †ĽÎ~Ą —–Dż÷~CgëPŹ/ýHb–ěěGŕ}bÇ0ěˇńҏ †ú§H:ሢř endstream endobj 434 0 obj << /Type /Page /Parent 759 0 R /Resources 435 0 R /Contents 436 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 435 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 436 0 obj << /Length 3351 /Filter /FlateDecode >> stream H‰ŹW͎ă¸F’›Ÿ‚‡=HÁX#R˘~öÖ==;HŰž-rĐČňX[2,š;ű™E^!Ż™ŻX$mˇ-÷.°h %šŠdý|őUń~1{żX(!Ĺb5“2*ËRÄřłŻeĹI˘Džę(.’R,śł÷-ęÁ¨Ĺb¨gď?=Ińe˜A7ŽąQ=›ť×—ŮĎÁS8—ITż„*ŽdĐUťąĹňE¨×ŐR„s ĄaH*cÎ3<÷ŤŞnťp^Feđ%”$Ÿí’ihĽÂZ<ĽĚd<5uß-ĹÇe;ś}'Â.ţ>ű¸˜IъYQDşLŕˆŒ¤JEš¤Q‘Ś–ćJě›Ůjvż¸€¤ˆĘTä?ů&Kr3f?ôťp^Ŕ8xˆUÁ>Lńż…Uq”áôă:¤˙#őţń4JpÖ⁜ŞgÁŸÂĹżNňŰJs@Ss¨}Ł“…˘( Š0vÂů˛Œ2‘NNƒŠ˘˜&Üď(HfĽN4ęČž@š—q e<Çîq‹š¸#§‰Š"ƒ˙iŘ*Äcő%¤Cš0ĄuYćĂl#ŹU¤c5`ř–ž‰ľąÎ˛ŇÇş`ˇĺ܆%‘1B<öĄ$‡^ŹŽ"ŕ̑‚" `U°o†0'İt4B›‰c°Ĺ\FYrŒv棝ńą‹ucC­9Ô)ŔL1.‚sHc`];ˆęóŚc ;Â&^ď(°ipfÁχAŒűj… `ÍŞ­ĹK;ŽŰŽrťDżťţĽGdŽ1R꣑ÚŠŮČĂ.‚,]6Ďmm )ţ3ŘSsŞÄÎبƒ>œÓc?’ąŤĂfƒßV˙ ˇ:t5SľaUŤŃîš°r€qm7ŠUżŐ 6}GčŔ:|}c;ímĚ_üő ÉdqPív›śYF‚°oü+”Šˆœß6‡Ý;ŰđŢn‹}Éś_6â3Ń âŠZ$„ŒĆW24#eáť8śj;Đüť{ Ř mŐriá´y­ŠŁa ĺÉ;Q!×łQřllřx˛˙ë6†-D˜Ľ‚°›ő9˛b ł­łděŘvVDĄUÁNaĺžS€­ąß7KŢůeÝtÍł]⎫Ä'ĘlôŸaÉO á<#hZ:/%Ž 0crüÔtKŹ&ÂĽjEÝoM„‹`KĹUœžŽ{@ˇ;ćʃžđůÚK}í5\֕rďĘ=Ŕţř€ÂMŮ$ŘnM¨¸áJBxťžsďaţşž3Ć{bëšźVĎy šíaS ŞZ # °ĘűĽ­.mŞ ŚlűĂĐ ÇT'„De1vť~?^/> ZîƒŠŘ h•Ţú’­˙ą"csđĺIĽ´=j­Ł Íš}ňKm“€˘|i đ#žô JĽ,ő›%Ŕ"ăxnđ­bătÄóĺŽ5›R7ćýř¨áĚA˘UťáfčC$œłg`“ž‘I[ŕÍż-¤Ě&™9ĐZţě;ÉŻk‚?z›ýÄiüb=‹_^Š7bÝnÉxŚ*Şşn†×űd(ÍMľ –‰ąĹD. ŹQľąŃĄ$œkgľŐť†Éœ5Źze>Ź™beUœqt’zćŔ‰śˇ9a+âyKrđ,óě{ĄĄźUoż{đ37HöbŤŒâ<Âßg:?P8ÓdťiYž&^@ÂN×LTč^›Ć Ź>Ž Ý:Ű.f;ţF^őĂăi5‰ƒe=K‘OęfЁí`+"ŽÁô+.‰š0mÇüJ;1z3Ă­$f %’âAżPg˙jžăÜ~˘ă÷翜ĎuÂéXwQÚDLßŐ捭Á_M˝ k˝0ÄoŚ*ĆŁű ]'ꈙQłÝč ‘‰Ş3Š*9čŇüćzŐ Ěcšá1ČýIĘLŕ´Śĺ*<ɄTűžŇ] ćä#Ţü]ąŇ3ƒ<‰•˙€yĐâčî׳|Zś)™=Đäö†ŁťćE<‰4՗›ľc šďěqßljRn÷‚ÇxÚҔÁ”“żĎlj|˙lĂÚeÝ'źvœÝT¨Ĺ‹,îěNSˇ´ƒËş‘šíŞúk3žCÁƒčӃL…}Y­šzîöĕ˜zŰ]kć73á„sjĘkb …pö‡Ę>9ŔŻ”,gŃouóÇDőhŘILŸˆ•Š–?á- ą‡,QÁ?üm_yr ťŐ%Ťaó7š č›F(~ź+f8ćšřËc>ľ1ú˘hœÂ9n 8o׍3iňPvËgť šůhb§¨ƒa‰ýÝŽx ťžžËĆťó“ćXšţć2âkXý‘—˘qßT#ľˆçjÓ.=Ćm>– sŮPmCË7ޏ*D› ńĽqŢ3ĺŃQo§´vbH‘<ÍJ?Üí3ßí5w{V“śiŤ`gľ[~ÔĚý'_ŁńżťŘ“5œSLBrţ^ĐWi)Ś0“şmťžŮ Ńy1â7Ď=2ńÚÖ7îWÔĚ6źŇ>zÖxž7 óăh,c.Ř K…ꉅ}•ÎňL$”%„M,ś&~Љäü4”h œ¸Ç=âKkfď!, éćfŸ+™`ŞmӍł1Ü}aĽ5ÄyVPV?šEłâŐöÉ;˛á3™˜Y)p'ĽŔ8ŽÄÜüß7łŐocÖ(Žň"ŽTžœj(…k@Ś&wP4 GyZŕ‘iä¨?YLďy™ĺ2GmĆg[¤iĹi2šĹ[ňÓ0Héäń×奛'n\×8ľâşĆýâ„§Ż€­ť§Z Ub4ÉdN`ű9ˆ ­ ľâ˙jP kĽEČ!4üąß;ˆˆ_ŹZb‚+𕗆’m¨s_œóÍBeúoęxuFŽŇŻv ŇMŻ /FŠgŇ: (^ĄËĘ/ŃuԀCꚆOL ›céS+/ä|ĚŽŻç.ĺ(6u\ŸbÄ)'4x‡+S6zů„^>acžEI~\/3\ ˛ Ţ⊊‡çdś\6ü&đM“×E2­q‰ëG+Ś4P$ˇJ'dqây˜o:ĘËÜށ$u ˇ°Ď0Q™ŚryřQ„:/iœl—,Äe,35ŔƒaŇěťB]Iű^WśůcTä%Ąí‹PDÚŠšdX'ŸFřÔŽa|ša'w° ëä7vÚŁ›RŠ zCăÄĚë§V\×xľŠ¨538´ňMÚÍĺŠČ”AP•ęu<ýBc"ć“fŢĽťÍŽčŽ4ÔXb¸IlűĹš0xŃė1žźŠUÖüńHcg‰ůG€nAśËF|6üK÷EŠ#ń3î.~ăň ŞPĆ:K§Qeĺ7P5ąƒG••ß@ŐÔUV~ U“n87qzšŢBŐ´†7sJăhŔƨJ 4;RŽö”“3¨v…˛OG9w„…C.|VÁ= ˇ4ź‘fҖ„ C<ʐ˛ď–„´#!mH(ťMtާábĺ7ŕ2ąƒ‡‹•߀ËÔ.V~ .“n87%य$Ňk$:˘ŤŘä“r(+ż¨)źĆÄ>”V~+”“g8Š3\°­üf°§ń‡ź%çi×Ý­P qRJSaî]Ľč¨YŒXŕv™(ęŕśÄOÜ˙ďşjzۆač_áŃĐ Nâf>(ěÚć؋k+‹0Çr-;ý!íŢ{¤ě ‚XŸäă%’lňŽýôżgԇLGĽÄŰjϬȏ'-¸Źëůę–,ÖÝąž¸×yťJUU 6+hÚď1]1üU@L{E K‹8NXĽZ öŹ4W@Y@msćŮ,TŮŻPóś.6iÎżĄFő˝L'Ń5¸Ó}”7ׅÖˇÇlcAeýÝ@o™Ťí‘í<%d‡ŮÁ!7ßľ}šÍ-^1ńąs&ý0ů?2 9˙#ĺŇ8a­z¤U;|ţ‘ŔŽ4¨IkĚ0Ŕ&¤™ľüłďő;€—‡­ž€\-” ĺÇ6Bô:ĐÖS˝ü•ď(z2…rŠŁąƒIžę„5žî ž‚.J=Œap#7s7"9ÁC@=‰Ç/Šť“ĆŢűěkĆÓ8dŸĘĘŠîţČöKÚŕ˘ôa’ŃfÎĆ!,fľŻšř3ÁŽ’ű°Ř7đ6„q‚Mpƒyúx—'šÎřBü°÷Y>ĂtWđ´U(ß`‹­oęŽS“J}Ě¨Łř ¤ĺnř¤îÖÝ|ĂŁ)Ő¤:F0‡\q=Ü#ŮҢ}ž¸›|ç}NYދӗ|\\żô­°źńTJńsĄQĽuLFÁąmŽ Wp{&Ż%&Ý 6ŢćIZIĄNÂ÷&ˆöÖŇúóٍśĎr%8ÚbĄëSQ˜ pý÷Ń7/?ŕ.‘~­‡§##Q÷y0śŹsbKá侟m8*kFsŤř˝Ü‡nš>)źŤ$Eüž/q34tz‰t…2¤÷mLúÖ˙óKqZ endstream endobj 437 0 obj << /Type /Page /Parent 759 0 R /Resources 440 0 R /Contents 441 0 R /Annots [ 438 0 R 439 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 438 0 obj << /Dest [ 455 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 152 525 178 539 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 439 0 obj << /Dest [ 458 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 182 525 208 539 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 440 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 441 0 obj << /Length 5040 /Filter /FlateDecode >> stream H‰´WŰnÜČE’ˇůŠ~X`I@Cł/$›äA˛ź‹,ŕ`aMžÖy f8“ŃpŔáXđol‚üB~3U}#ĽaQֆ ÍCVW×9U§yľZźY­ălľ]pž”eÉRřç.Ë4IĽŹPY’jY˛ŐýâÍŰcĆÖGóXʎ붟n8űt\Ŕłi Ö‹Ľż|XüÝÄK.}‰Ešđh_ú^_ľ§őÝ/ՆĹK‘Fác|¤ŻăeżÝśZ7űxY&eô)ćąŸNÍĆŢŠńMďÂ/ç9OŁ›zÝî7ěÝŚé›vĎâŹ~^ź[-8kŘBë$+%l„'\(ڤJ´R 2-ëęĹvqľš)€ÔIŠ„ĆýăŢx‰ŰLíßś‡xŠ!9Ř!źuą‚ż d•&Ǜw1ţímRo~tW‰„ľV×j˝ˆţŻţ9âr+-l ŞĚ˘î WfŤĚ°Â Öçe’CqeUXĹ<2ĺžŔ"a™…=ąNÜ E™FO—=Ő)[˛Kܔ@Hë"ţ—%Š1öKő)ĆEęXâ{yĘě*œ‰$KĹŤ \¤e"Ňź :r2ú7TUG+(نáő’‡˙ĹŇ˙˜˙łž……ĚĽ}`ƒ`ú;{‹íë[„űÖČccęíOÂŘĺ6V¨=ü/p1‹Ř—-ż k^°ö¤ŮpÇARv zěľůŰB^÷ő‘Ů{÷öĽC2† TQÄNűžŮŮÚ Ú,č€^x…ľŮž:x[˘ĚęŽÝŰËă‘wsĎÚőúd–*˘î˜Œ–ĐbZX"uKŹîj§łÜęLB'ŁŔĘhÜĎń¨6FWEϧåíú#ĐĐŐ5kľ}§ŤúfJ’‘'eSƒJëj}go<4ýkŕÍöaĎśmw_őř3]’T†|ĽÍ÷CŃ Ü7)éXúÓöłŰ.Cš†Žţř'׆Ú>%@řCrŞď”ůˇvŰ.ŁĽéńˇ×ďŮě$]@ ;ŘëçÚmÓNƒÖŔAĄËĚ=•ŘÔĆĂ8Őăîa‹Âu?[Ý5GÖ`qkśŠˇŐi×3,$ƒZڇşƒśE-a†z˛úţ ú*7!—v%,¨š)hŰ5Ž˘űjÇxš.YëF\g6€Ăhš94vŁ—×WqŽwďŰÓąNž~‰5…_YúPîJ`j]ď*×:OęŹmSf¨6:?+4•ëœ‡çĄÎč8f8<‘GPpSä‡ ŠżďťvsZםî­)‰kčţËĂaWă`2hľŰľFŧ=Î ¤Ľíˆ0™<ća›ÍĺŽÚovŚs"Ön]TöĐl@Ţć?]…ÝĂ+.oí8śť“˝ęk˜J°]‰Œŕ`ŘŘűč"üŒp­qü,ÄĎÓ|6?eóÓ6?nw ‡=Ř ÔĄö˝dumÚOv$N>ß8]íŒ*‹–í~‡ÇIsNľ­ =}łEúĄçו;4ôƒžł23G‰¨knýh,ą8šŻ÷řkt<Ôëfë˘Á™ăŁa ÜÇ ×6 ‹…SÄlO˝}˝śzˇ‡8;§Ű‹PZžş.͒<÷‘Y/ŻŃĄňčęńç3•đTfţŚŕ\+Ň,g*‡#!œůđfNŹSžšáŕ×=?ă) %JŐă×§?ŕ˜aĎţěďűžÝmŘMßv_~đ˘ĎşďÜnŐJśkjĆ%tá{{ýbŚ?{ß:ł[ş8÷\ĹĎKćŽĚčůŮź Gœ@§Ę8ŹÓ œ•yY*{ŚÖŃÇxđWˆú¤łĂ`÷;7ÓŹ´ÓĚ[qz 7ťJwfç¸0Čäń7ԅkăŇś‰Œ\ăYk.ąńBłôw.P ƒýȞĂĐ­ĐWŽęčĽ6|şKŽ44­–Lń ”lÜĂĐÖŠK ż)2aZ‰Ĺ™Ć“třő8žQk4kRáERd@~>Œ>"žÇy"ő€ƒ×ĺđ5~Bá,tđBgăYö8B žm¨p‚ÔLnJŇĐľr9“ƒ€^H… #^(1—ƒÙ  $öŮĚűPÎK:@ž)Ëš=W)艌¸ćz.ŕJ•á|ŹŚTz\$BŸke)a ó<‰XœÄŽ&á“ř¨Ŕ“ř¨rä#˙*ŚÜĘLŃŚáđÓ "xÓ"PŚADŚAćhŚ"xÓ sB "xÓ spRĄ8Ó ß÷Z˘xÓ ÷ŕŐFEđŚAçŕőHŞÁŤEϡ+…ڧńG,¸ç€€C‰ <ŔCyŚń—›FžAéłüĺŽ!_ćRĄkäy"Š,óŃ3ál#Յ ţ]ţŽMŒ€HĎ㌃|â™A•Ă 2˙ž‘á™"…{!x"…{!R¸"{!R¸"…{Bü:`’âŤřPËłœö ‡ĎřÁűƁň "Bđ 2‡f"‚÷ 2‡ADďt^*DçôűAKDďô‚ÚˆŢ7č‚)58ľdĺ|ťR¸gšŔîY˘pÇűS¸/ …űňřË}Cĺđ=Pđ—ű†zÍ׆*’týěkNg_ ŽńIÓ ŸxfJ)Ĺ*žškœo\޸B_Ë Đpá6.ŒašŞjťŢuý9։ˆšX$e´ŽYłŠ÷ćN/˄;`ŰÔű‹+ůÜV>0ŘęÚFWa#Ń÷7_öŤďąŚCç5Q>ŘD&'ŠQ˘3>`\Ůaî;ŒŔC‡Q¸ď0 wFÁžĂ(Üw…{ąř3R“ĽŚKíw[ŁJAgšśF‡ĎX#Á[ひF"B°F2‡p"‚ˇF2‡ADot^4DgôűAUDoô‚îˆŢé‚2)5 jRĎ4.˜žÂǨŏ,dĺň2_§ˇ0äÔ†œŢÁÓťŠ0ú7ę!KŞGň›<¨”ÜćiÉł†Őßa ΂cĹÇŒĎŹK™ Ž5X 0kđ>8¨0,kđß{,1kđ1x´1kđ>xJđR“|/qz×KŒŢ÷§w˝Äém/qj×KœŢő§w°bôo EĹW˙ÝËic÷^‘a¤śi&y2´ú;dČYpd¸XŕȐąŕɐőa)?Ƃ#CޏP -ňfôžŇˇőK˝ŻŁw5`Ô>ŌŢ'ŃűôÜÖż› ńo[ęý\˜ŞNa:ëŮb=3Öé…Q#^ŠÇE¤‚ÇPař7!nBÁ3X#$`şu§UÓ‡4%|Îz‹YhŽ&ŠB­ ݢW~ÇýI¨ŠéWńoAŻÜ<$3@‰C8ŤˇçôáŹŢ"œŐ„łj‹pVoÎę]iý[…‰¨0ůô:ă+‹KŚXfrzž™X –™Vfâ,8fâ}XęÍX°ĚÄű° ‚ą`™éŽ3ŒĂLwž÷ b Xfşƒ‡cÁ2Ó<0948´¨7ú–ŃűJßÖ/udôžJŒŢՀQű3zŸ@FďÓs[˙~fĘ0Ӌ8}?5ßCM¨’ZYO oŐˇÔ¤nQӟA?ôTِp |3R3ŠaJEÎĐ˝s𦡠˝iRűwčéń“uŠC&Źâ{dĹîxc&f *’üOš*Ëś Ž¸Â´×#wYÂ÷ ŤˇÖęďLXÎŻgNpx9›ŔÜ ^ű?ĄŮ|g3',zć7ÁŮülŕNđzć7áůětápjĆž%Ţź›Nœ}ŻgpÁ§ČÍ7îŻgNpÂÇŕú˜;Áë™ŢĐżœ°čXŒŠ'‚ű-Ël+#BR’ゞ&n Fĺ2cK3ţŘ>G\ÄŁ@¤›tš ~|üI|nžŒŘ†LĄ`šĂœf Mź2?ńńń“•Ú]ӛÍs‹]{úSWôýxč_Ooě#8Çég Ç☌xs˙jdüđśÔđ×CŰ5˜śx |6˙k_:Žćń4›ŐÓƒLŠv'#Ĺb$M?‹ś•^ę:qvVýA´3}t4şś7ć;LI˛˙k¨H´_žN][›ŸßB˝Íú6:GÖĹÎl™ŰgŤöÇm…ÉN„ż•`­G[ĽXqűK× ű‹` (ă`Í?ľCx/O]óȦFŒöXiB€?˜†î<ˇČ>b›ŞŁˆŔ~ e‰Ç—H˘HěN­zhÔZC†ˇ  ŤČmíńvĺ+=-Żš÷57ž~…3ýůřMóŚřvžgPŁqä4Œsł3gTx™›=ňśÉ€–žË`Öá쫚~TF:ŕ&šÁ¸ŁŽđ"Ľ˛KzRÖU'h‰Ö.ĄÖĚőATýŽIp❶ČzŇoMJ^u2šITî§v_§= t`ÖçgúL”GěÚin{8Ţ Oö}ť!=ůgš˙Üẅ́‡n'D7^ÚŠů`Mëpu‡‘ă_Çuđn ŠÁT ňb$1áŚB?Č1¤éR™ułG\ZťýŕÉ.â<ýƒZCşóeX*ףJ•YŸÚţÉ´~gwš]PŘő>ܔ°cöwĆ űľ9 UzŸĚß>¤OőíŠ>F›iŮĽŔžúšĽ&•i@óÓhj“ęJŚÁX§ˆ•KńKo¨\‹iˆ:Ë ŽÇŚßĄž—p^D$™k§´oY{sť§Jż^‰/(v˘§„^éŤÓÜ֓AűĆŘcHůř)Ě苯ù>üĽÚQoŔęd=¨ĆÚü8Pť# űa„ő]óÜęŰ'|lŽ`­§¤ZŚ2‘]Úů +ŒťëŠV˜!R˝á˘KI‚‘PČÉĂ^‹sKŸM?ŘłśĺŇů:yقÉ̜&nńUă @ޙ˙ŸŰÚ`Mü+¤ŤőDĄáäaÔbŤ{7 4† ö•ţDĂ' @K”…źĺ$ĺn7šĐJł4‰Xüh‹łůô0œ m‰ł|Đóߔĸ5蕮k'‚‘őy6˙™_ÇJƒ2Óđ•ä{kNč]t‰ż:cţźž7W;TzŹ>gÔđ;m”š‚ĆRÖvjßî÷Íhđfś€Á*dŔ.MÓ/áü˝ý÷§T|ü˘96_>>Hń'pá?̝â"p‰ř$ţöw0Ŕƒ*ÁC2 .™Y,Ĺ+€^źŹ¨Đ;ˆ­Ő"GŔsŞDýŕVbÜ`$˜ş[­0y"b\’ăr^nUL2î‹H“ë‡×;ź…<ŰŚeş’ńúJÓőŠ hKćëSÜŔrܤl$1ޟEL˛‰ŐÉľ>ŽsŹŤč݊ˇĂš–ńđȋľh}\ĂÖ~€W\}l¸;(-Űč­źŠŢŽ,™ľ, xQŽOĐë3#ÜĄšÄa iŮFjĺ%v…Nš­+ďVœM’Łb-xŠĘ•ŞDF#ľňƒV"Ě ™*Aƒ‘ňą;y‰Ý­,ÔVŞľŒśRkźŠŻ‚äĹŠXQôq‘‘™–mŹV^E_ŕt<ŽVŃŰoˆ,Š—˛‚źň#G§ŕ˘Ö˝XĄŤ› ¨MUźDoĺUôveą€&%ÇęĹŠ*ŸŹťV"zŞşHđIéiębľrýđĺáßi`-ă endstream endobj 442 0 obj << /Type /Page /Parent 759 0 R /Resources 448 0 R /Contents 449 0 R /Annots [ 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 443 0 obj << /Dest [ 437 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 264 671 317 685 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 444 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 416 330 442 344 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 445 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 320 287 337 301 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 446 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 425 251 451 265 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 447 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 415 229 441 243 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 448 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 449 0 obj << /Length 5126 /Filter /FlateDecode >> stream H‰ŹWێŰČE^őýŕŃ}%›ňŕą˝N,°ˆä!ȃFâxhĎHQłÇČ'ä7SŐě ĽtQcďb€!ŠÓ<Ý]uŞNózľx˝ZI&Řęv!DŐś-ăđço[^qĽ$k´Š¸U-[=,^ż Ű ngĂfńúĂGÁ> Ë9mËpűźřWńą\ UŮâk)y%ŠÝúńŘĂëŤýÓćî—ő–•Kɋż•0Ŕ‡ťrYĂőpťŢôťrŮVmńŠąOývüĽĂ7%ź W!jÁ‹ÝfżŰ˛÷ŰţŘďwŹü÷ęď‹÷Ť…`=[X[™VÁFD%¤fZéĘjÍ`Ľd‡nqť¸^Í@ŮŞŐŇâţqo˘Ĺmňqƒo÷ĺŇÂâ`‡đVq(5üďaUźR¸püńŽÄ˙ÇqQŻňו‚šVďjł(ţTŽ>OňkkGx ¨v“ú;œ™IŒ2ĂĚ/ÚŞ† âĚşXcë…ű ƒ„a–r2bSů@›–Fđ%°sËْ˝ÁMI„Źmxń_SiĆŘ/ëO%Nҕ ߍm ł°‘•áňĹœWVIČ o+Ék'ąqťMÜn3nWV°€Ő]ÇîÖťí}wˆŇ‘°ůw`S°ě¤jÜňDń¸?ťí¸őˇŐf ’*ŘzüůˇŐúţ SßƧÍţá¸&OBž¸"ë+.ŽŕŸźbű\őŸŽr;‡P‰Ęʔ%—mÇeŤ°ěm÷kżéƙÝđbŘqşń…U¸_ŸűăëzŒşÁdtƒ[wE%đ÷c~žs[´EwčŘ1>°ŰŢŎťŠáíŰýÓa\=ě×/…!,ÚŚśž€o@×(ďci°ěF=eă˘xŔG~őń"Aä˛I2ÖąrŠ_wŤSĹË js˘ř6Ʋ×ň­6ÜíÝćÚâ’ŽŠëwě'XÄŞĂÄc´DńäGA8ĚŇTăŽAÔ­p9Óiž:ÎSóüu?ٰż=>Żám˜đé~Ë6cLQüPYśŘ€Čdń…uk˙|ÇöˇůnčXěvăGŢîe= OýÎsीţáGŒ°|‰‰:‚¸ĺĚ;Ř0PNÄ& .9ÖG\Űó&şß?ĂÇhZß?°)=Ó@ Ś+'ÍđâÍťkXΧ~űo ĚŐ¸ôM+ő%\…Ž݉źfä]Ýő=nƌ›j OۭĚşŰ߃üˇë㚡01‘(oSt›ţśß`eŕĆĄťI ëpR7É?К”˜opɏă”PIťăşßůâ€d;gńL-g9í9żvĐ͍ Eƒ„&„ć˛{z¸™BW%6œÇýČöÎŚTáŸoĆ'g‚ ŽO`cÁ+śvW(ůřţ؎Üý>ş Ćűwßß÷çkézťéCÓ%ř˜/‹VşŽëoŹš}͌ą•n[ŒMŮŸKXŠ–5&îş?˛ĹÂăc}úhNőéŁ:}”§Â=Zîřšć$řpkÝü-îAľnk;skem&Ţě΢1ƒ@`ŻĐ˘Xş‹'8Ţ´ş&č!5s–51Ž‹0 Ą‡áɘúd@ }Bň}€[m&ďkuňžÔ°SčĆÄűĎ4|ś2°{Fo!>Ś!ßcWÍ ÜVźmhz'V)ę}Ľ Ě>×0ťšĄˇ`œL­œUU§Ô}#N资˛­ÉÜiĽbgaË ˝z݀v4™;݀ËÖ3°­¸I­‘ -AćîœtMG{˘mĎe…“jópT]NŞÉĂ1ëY8e-Ǩgá–,|˝şĐ\šÂ#-3PxĆňt˘•ń8SËđ逶PpŢovŰńę{|çOîo%xa]#šŹ„ĺń‹DËI×{łÝJ<ńuC9üN›)ćÍúO ×őeęú25N-A~˘xőžý…ý†hŞXšƒ1xŇ=¸^[|q§R&żeZŠL’Ďö<ąÄ€}bÄÎ  a@äŐâđ٧@'¤ň M0DŁžÁS“{HEC0Ż&qoÖä Šěň cŮ˝ŕ@ }ŻFYŸśŔďî~Ҹâ%ˎÄ}Ůy|Śě(†Pv‰*;‚!–Ý îĘ.Ě@—ĹʎÄ}ّ3IJ#bّ¸/;z†PvC(;÷e—f ĘŽ`ˆe7ƒť˛#÷ˎbeGâžěČbŮ]ÔťŽ´ ¸Źôš˜łpRjŽ2ËÂI#y8&8 §ěäáÚ,œâ’…/ƒxż€ŞNJ‡ŁŞjŇiSÇ˛ëŻpN5Ĺąs`dg'ÖĚA˜C}ŐxĚúvJďNŮp`4܈‘ž/5ž­áÔÇŮŰ^¨‹ýřôó~ŰÝ;řmiá, lnřúsšl*ž™Ž íXŞtnmÚó“/9"EœqáěËĄQJe˙ł/‡pșŻ>z§đ xQ˘đ yš§đ z9 đKP ‡ |ÄńŞ3ýÇűŠÇgü”b~š(?%˘Ÿ’kHy%‚_’ )óy†č‡4CÔÁüŽŒCROž!úš†¤/‚!řɐHé!éeŞĐs?ĘĂÓLçŕI3đ4G9x’€ <nž„.O㒁_ěGş…έÍËíHžŔŽ|ş6 ć؛Ä.ڏOŃŔx[śh5ăĂĎđ+Nă3ŽÂ%œUőœ_#滕†dƒTôďüPĐxÔĹQVAáAŠ$îľHáAŒ$îŐHáAŽ$îőHá!ü~)řŁÓüˆUh[;‘QVpÚ*HoÂ*(†`ôR^ o4CĘ|ž!XĹ CÔÁୂŽCROž!X˝†¤/‚Á[͐Hé!é…Ëš˛ žf:OҘ§9ĘÁ“dŕitsđ$tx— ürŤh@şŽ_îę%^!ëĘśđŢřJŃu4 œČ›EńJ]łrőů´ęUUÇÝ䌀qĄŐâÔü^¨[°Ą†ö:Łđ 4JŁđ 5ZŁđ 6Ń'đKą7{őC>PƒčtCű€Çg|€b>( ˘kHy%‚ )óy†č4CÔÁ|€ŒCROž!úš†¤/‚!řɐHé!čĽ>Qčšäá”é<Ә…SŽňpL@NŃÍĂ1tY8Ĺ% żÜ ´RmĺË}@żŔ„dוŇ``9ŇŤJˇŘýM)DqS.ëJĂ~źŢcŤ€FńTšŞ‰Y)´|UüîŕŽřWâ*]źë‡ÝP.-Ć_•„…"Îá$ŞŠ"¤Š‡6ížFpŽíxéJlgEŚ˙čJǸNý&IŠ‘TEŽˆÂ˘F$m‘#˘ź¨Iaäˆ(2jDŇ5â‚h ú´ő™űĎĆďôĂá `i&đ˜ Ů đ˜ ™ đ˜ Y đ˜ż”ƒhȅ!{ ޤ {|ƅ)†ŕ‰ra‚!ş0š†˜WŠ!¸0É3O0DŚ‚6(†ŕÂd˘z†čÂ䢞(†ŕÂ$CT Ї ˆ¸lĎÝ(‰! §Lçá˜Ć,œr”‡c˛pŠnŽĄűëղۺ‘D÷ó˝Č‚Xߔ’Uîx`^ d‘%ľŻ8‘Iƒ¤ěÜďČýŕ9ŐOZî’4^X–XÝUŐuN×)Íž.Aóí*Œ3T%níÍ*\Ý ÂůŚL,hš-ÜăÖPĆ7䏟˙Ľ}ŽWŔ0jŃ’5 2ýęŽÝŹ´8žzB(­ežDŚżVú_’Źő—@Š˙撺°+Žô6 Wiţ!ęRd¸zź¸„ÍŽťŒŮr7lvÜe̖ťałă.cśÜ ›]íĂćk…ŻŠđŐ7‰ ŇÎ*^S´ů‚¤0ű­˘¸ýœ „÷;=áâ;,™ýVM¸ýěđ~§%ě~ËfżUîüŽ.áýNG¸řŽOĚ~Ť"Ü~G8KőĹ{6{pĂf‡]ĐěĄ ›]ĺƒf_ذŮŐ-höe šoאŹJĘ&+oאú& i’źŞpöŹN҅űҐƊGʉ: ^'˝4l˛sń`W\éaYŠ‚gëź–ćEÎł–ą;ÚrvË[ĆîˆËŮ-sťŁ.gˇÜeěĆ~´yöM*’Cs^FŒý‚Žpʐxœ’0œ”°98\9VLXyƃ“ރĺçÁ [Çƃ“6Ç/΃փc Ëϗ‹7”ą/ąžxCű§‹7”ą/k|ń†2öe}˜z›ž›:ɛâvyin’—"˛äĘűÚ{/˝w䎟˙sŘËc ‹ÄO÷1>ˇú5ŤĎ)ƅ‰ÓëC”du eÔ ŠĽ„]qš‘Ȑţ))P’´ŕ În‰ĘÚ Q9ť%*k7Dĺ얨ŹÝ•ł[ 8űĐ0@ó-RISŹ”X;/%Ź#% Œ”pŹ”đ9x\FJxů°+%<8n0Œ”đuđě {°RÂçŕůĹx0RÂ{đ äřŕů’â˛ó74l_b´/ ٗ8í BöeƒöECöe}BöŰĽP¤MYߎ%뛴/PUĽÝ× Ž“Ü‹Iž“’ÚĤ ú=ŤĎ aא°DÉIĽú•ć}ëdMU^~ŕ†ÖГęCĽ)’5\˝ăŤłg¸ ĎwÖnúŁą_č\ÎÎD°ýÓGŕú'ÁŰĂ\eĎŕn%Áٙś˙˛Ü˝f"x{8‚ëĎ|۸ÎÎD°ý›ĹÁő&‚ˇ‡#¸ţΞÁu'.‚ł3l˙g#¸+ËDđöp„köˇý1ËčĆgęňŰďy Ž”uUbŽKŰÂŇĘwČJ÷€żuŸOٌ7ÔŞUF•Ńl,~ź˙$~–ŸőĎ.^•˜‹§9Fq"9Š8KŃ#ňď…xhő’ăob„—<’Ôă°öyčľe’çMŃÉmĘôUI^+Š˘@ßZç”đĘgźLřSLíŻŠžÄŕZ;~ć˜Ô%Ú/˘"@ŰďEN­-Fů<Œł˜R˙~NťĂÚ˝x‘ăÔ ˝čúÇa|2.ڏ~“”řŰŃ´Ó2ɝ*¨y#ľűkYˆB´Ç×xEď-,5,_âŒNş:‚2Ł”đhœ'•ánč§šígń]ń uŽ"÷áĎW㕢Ó>ž HbŻňT­U!gy§OßNb/§ÝŘmĺ'” %ăÎjŞ!ţ5Ě[S<ƒŸ%]NčĄ š•čçbűđß%Ú¸~m–yÍÔHćLů÷Ă,hç*‡o¨ŘYEťL§gG™ş~'Už?ęšßÇjóIlOÁ@0<Ë1^Ń\ĐŞ*Îr˘Ş´şXĎĂńߪ ŻÝ|@zâąűݔH’žŃ^†í[DŢP&ť2“¨qkŐ(=kĽŽŠwTŮď‘Ó.^ŃqtÖĎíś;v֙9"•tş\9x‹şÔŰ=ÁË˙›ŕ“hTśkŸ­ţ"ŚÓÖŔÚ!†GGÍŁ^öS _•IĺJÄ4lÜŠ‹t}˘y"ŢSq“Ź7 *–žŠďŚyť]{4źRKĎxľvźZŤM`ĄD[{KadkčŽ7nSĄÉ¨NÔD} ;¨eűĚ$žt8OLönĹ<¸îS&ç§AÉÓܜĆä÷ˇŮ€€ůĹlîL (4zAŻRčU=¨Š†‹.yRŁ@ÚDúŃЍ#Ĺ3`×=űݡĚW:]̜żŕćDOtďÖ‚)ć毺/€<ę,t’@ˇşLľ*šQMŚEôŁîĄ\0ÖÖĽ -Fl}ˇŘ˜ÚÚn•ŢQ´I^+ő(ç“ĺ@/N¸Ŕ]/uő÷bßέíś*“U†ayY:×^Wö+eÎŒ -ŃWżßƒqqΧł:J°ž^‚'ÝU=T9ˇRœ&\\|ŘÎ-îŻf”ÖY%°BžČ^ŕ˙pܛ:¨6ŒS<Ӎy=Hóۖ¤NňěěÚjń"ňkôÇ/Ć üŞşąÁ>ţŞó{i'ŐYŸ&y|AĂoľyT,—ZƒhĄS—¨ ͇HďÚINwŞMeaŽčŸő7—;Ňm cúş ƒ×îxŠ Uô"Ő?’)ý °čOԚ£2(Î`%ćłŐƓOĆĺâĎ4ă54úŃęiÖkôäűÜjożĹŠÚłôʃÚ=`_Áö÷âĹz#Šť“*Š8îáX™ˆ „MT„N‡;ˆý Q2Ł‘Ş‰Ÿ)ŇěÍtpÖĐ ¸ť8ôbňËôäw­™çŽWĎŢ_%ÜLźC^÷JOaf𐅲p@RgS—äQ5Nِ,tIŠl=FuőDĺ^iĐš×‰ŹžBatr ę7ވé9¸Ęsat7̖tŤÚXŚ/üFKFG ­#ęFLěŔů]ŠF‰÷#†žÇľťÇľŽň0ˆÝĄíUâ5΃Ԑ>UWŕ4ÄŤŽŽĚČą;#M}xĐŤk’_łTXł3˙“ś‚ÔLĽÜěNf›‰Ňjmč˙˙ ÓćTQZ3ŃLSFov`61žžjťÁ„2˙Z˝léłš­Öö$¸s“f>˝yŹŐŃĘ×q‰VăĐj–h™‰†[;ŞŃą¸Ś§'šWšč ĽÓaxíĹVj‰ßĐő%Űë÷šż>üéŕů¸] endstream endobj 450 0 obj << /Type /Page /Parent 759 0 R /Resources 453 0 R /Contents 454 0 R /Annots [ 451 0 R 452 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 451 0 obj << /Dest [ 450 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 170 366 223 380 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 452 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 264 123 290 137 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 453 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 454 0 obj << /Length 4529 /Filter /FlateDecode >> stream H‰ŹWMo7Ĺ^çWô!‡n`‡n~“‡=Xqlěb, ‡ĹIś'XKGFŕߑů ű7ˇŘÓ,ś¤z=#iaŔÓ­G>ŤëąĎÎ7ŻÎĎM§ťó­UΚéßü˜G5Zkşčź“ÍÝůçÍŤď÷žťÜOĂĆnšyőî˝î>î74v‰črł­żmţŐżśÚŞǪ̂tsńëÝŽŚŸß~˝üôăĹU7lÍŘ˙} 1eČÝő° ôűĺĂĹĺîfŘf•űƒ.P÷îëîęđ—ë2ÓĐ\úŐ:čą}y{sŐýpľťŰÝŢtĂżĎ˙ąůá|Łť]ˇIIůli#Ziă:gJÎui4ݗë͇ÍŮůJlRٙTö_öŚsŮćxŘŕ÷ˇżŰDÁŃiV˙epô˙Ž˘•-—?~Ę˙w‡ ^˝3ľÎߪËM˙—áü—E=(ś|€ uÓ˘óSYš3%Ë]É01Ńú:Ť@I,+ťţ˘d1ôSş˙Z’TŇlĚbÄĽšy콡Ä>ŚąŰvŻËŚLRŠc˙_Ż\×u?^|Ę"׃-óBć4ĎöFůрÓŢôxŘ\*ů5SŽçGMú B)cɅXłmS•Ÿw>l AĹţlw×Ezľ#ż†űŻţţŤť˙jᅳűŻzzMăô2ÎŐăGNÓćDz›ËĆ@'†śN{ œgüB2“du¤iOŁ_ك‹¤&‡+éb¤ÖđDŹUÚR›Ć•<†ˇóőŹ§Ě§‡j—ńŚe€łeźéŕŹo58W@Ć[~dühɧÉěBŚ}JőŽŠëšÉîŠÓë ýçχ‡›É‹}hYäĘ~fœqԁ ŁW~f,„Î__]}(Řţz?ýě4ŘRŻ4{ŕÔţmľ@['ľ)k ćťaKǢ] —ëß dȖ&ű'ur2ÉÝž\/čśÉéܒ‰ćýA-ów_żP[™H÷‚őF#ZEĐŞÉŠ‹„r˙(Çö˙ŕ"’”ĆÄŞp÷€ë™@đ|$\3„ŕů@¸žĎÇŔ5÷>’řä•-ŇŁÄ?9Ńd8Žvő¨ýĚv\qÁŽyDT9ˆ#jľh„q™[ ~„Ö ýĂůe…Ç8í;š#Ő/ƒsŒF°d@Œ —c\Ηb4ŽŽ˜‹˝Ň`ŔáăUľ(BĆA„‹ůb„4/é¸"@1ňŃ16\Žq9_ŠŃÚH×"ťccŹçĹČ8ˆq1_Œ1ŃgMČ+jl#š‰€.Ǹœ/ĹčŹ&kó+yl#Pš“Ą1.ć‹1ŇŐ+z-Fbäv ť[í~‘ân8ą<ę<ž<ő"ž8sžÔťˆ/´&áË:‹ř"ÇŢň#ăG/_:QĘɧBt”T2ŁůŽdcąüé6şƒńŸ}ŁŰ’ďé"S~ˆńá‡é㛘5$-oÝDŸfú‰Tçŕ‚îP$€ţí[ÁŐܤ žÂdî8âľ!ShŁypÉy˛íF­č]ú̲pU łč\5'Ă,9WĹÉ0§]†ĺ<”œűgÝoBRQúúš//xĺîćœ_ĚwVžČóÓJŻĎľóSR6F<Ÿ‹-ϡ–îřŢŽĚŻjóSŃ~ĆűgšČóĽÓœ<^ŸőćÇHô+ůcÁĄú7yŹC^wíĘđ˛4kçP†—‰];‡2źL‹|OěűŢÓuKťÓűžyRß'ú0Ó?ŠďOŐÖk}Ž8҃<…áu~iß÷ô}ç ŔYqŻ’8káUtgŐ!źĘŕœ~€IžŁË˝7úYŕ˛ňŃ`˜ń @ Ő2ŔŔ.cŕş"†ę+Ř 0CŐb¨^óŔę ě0Öb¨~XPU/iý„źŐŕ\Iou8WAĆ[ŽÎ”ń–?ÝHP)[}ş5ؓŹ!V˛KňĘś˛‡ŔĆĐgĎşáü—ű§?,Ş-q¤'‘f“ˇţĽ†`Ítü ÜÎrCx•ŔYnŻr8Ë áUnçôüHňé˘@ɏĎ2*œŒŻb¨†Đ!6CŤ+`¨†Zĺe6ĚŔÚ Ő`šzd6CÓ`¨†š‘f˝PŹÁ;|BÎľFx­$ŔšNŻU8çá5ƒçüütCĐ´PvátCp'‚Ś›dv…žfö§-ô–L‚Š:ąż´îśAŮ~{řýOéÔ1žô=@ wƒśÔüm˙'=ĽéˇüĘ”ëßěöďŽ÷Ă6•ÁĺŻÔśü4vLŽfýT ŰhÓžŸ×¸:ü\%kýăFDMĚF'8O“ŃÄG°źĐˆ&08‚%†F4‘Á,34˘ 8bĽţĄĎߊOôZŐ<ëçr źŕ\ „×BœË€đZ€s ~¤tD¨öYnLĹÓŃ Ýwvă_qcÄPݸ1 7 ěĆ0†VWŔPÝ2´ĘË ěƘľŞĂ<4őČ ěĆ0†Ś/ŔPÝ24"=T˝ŒGN¨ŒˇZœ+)ă­Nç*ČxË1Ŕ9ƒ2Ţň#ă'ťąĎ‘Ź1˜ÓÝ؟ôyU¤}Ră‚~ůyFa?ü<ŁÎŃŞ-šąŢ“((ĘSˆ/ü<óŮ)CJErCx•Ägš!źĘ âłÜ^ĺńYnŻéGř‘ä§\’ŸŸc>Ó˝ŽZ&2„ŠcC€ ł!,€! †j8†VWŔ0fh•—Ş!Ź0°6Ăl8M=2C5CÓ`˜ 34"=4˝WN¨Œ/k-â‹JJř˛N"ž¨‚„/s,⋠Jř2?~ş!ÄDP1ŸnáI†@ô)Çtš!x:­Ú’!ŕGzR$=řd^jŃŤŃ',7€łÜ^ĺp–ÂŤÜÎrCx•Ŕ9ý?–üą$ß?ˢQ1&l3žbˆĄBc@†Ř` ­Ž€Ądh•—Ř0k0TC€yhę‘Ř` M_€Ądh DzhzY?Ą2žŹőú •ńeÖO¨Œ/sź~Be|™pBO4Ÿé ŸÝ醟dDrś’!Œă#C™Ş× Ž8ғźŁ<ĺüRCđ^Ľ•fą¸jM†YjŽJ“a€ŤÎd˜Ó.ĂÇrŽŐ¨a>ÇźU~ĹđŠ €ůŐx>ňy>[ZżŐRž_ ÍoĹçsű‡óY ňüÚüŃţ›\ÄůÜúŃúMOňüÚřŃü&8P˙*ł~E¸W†šv"ÜJ#Üyn‰•aΛˇ´ˆđéÝŢRƒľ>˝Ű§'u{J°ő‰Íޏ­ÄbŻGŽ´ŞS Úż´ŐŰŇjôc1î&1A‰B|na3žŇĂPŒƒj“k+ .Vh¸źˇA¸>KhĆÁ ľQÂř8‚.ŻŔ­ŻPO4Zq°Bmś°ÜŔ —Wŕv ÷Ŕ}­Ŕ8XĄ6l¸ŸV°BĂĺŽá÷{›Öĺ´ëéŕ×gcé]ӑ˘ĂG“k˙Ý-şŰŰÝÇŻ_އŹRßůmT‘”~đţ𡝝!ĐĎîćc÷úÍY÷yĐAŮţöęşűůŰaŔőĂvHÔck@ĺ1ӂ֚Îĺ@çÔĹÎ!35Äůijś‡ĺîöÝţÓío7ÝĹžűýĎ?şÝMw÷ézؒ`ú˙^-=nŰ@řŢ_ÁèÂ6,É9=ľH‚h‹bł@{âZtĚŹ$ zŹ“üţŢ|3C=˛Î&—]S$çůÍ7C•;óu7 N´‰R˜\ҍžČՃU­íTçÁnklŤ/rĎňąĆŤ“oÔїľé܃+\‡s ö?G1Gáâ‡îŹN}‡čˆ‡kpîŠXô5Qxŕń{ý>b*Ćőd­+SwîŘŞ;ßĎ˙š\•>'3XyŚ‹v5“•%,‹ź?Ly9ˆŘ;¸ťYí5‹â_Ç˙óhMü|qEĄäË1Zn‘9&×ęhyXĹşă°ą6ăŻ(‰ą qĄíd݉‰ ž—e)ÂŤ\y&Ç j¸LţŇ-wŠČýI‘ŹƒŠ†-n˛1/vˆč†ëQL’zQÄ˄Ńô“[E_łQi}–Źą™¤…ś~ó6Úâ¸ü VÁW¸Ą ӊ­†śŃˇ $@mtiŤŽŹâŁfłZ$îaQ‚żVĄĂŻ”úÇ žv  ĹÉtĘ é`ˆ@:*fIvđ>Ÿm]YA‚@ÚÄÇť_Ů!^xč'ůF‘80úěeՆ !UOŃ2 ń:ŔÜ ˘KJľó•Şúňázg¨@žâ ÎpüÍ)‰…&ăŠHé@Ǎő`{Ćč z”űń‰Ę‹0ůœGôí7¨u­ Ş‹ZL‡3^•ŽrĽ‹hý%HârŻĹX”3DŠŠ‰n•‡íZő•l~ˆP*˘1ă€el/Ë'Ažw˛"Yf~”vq Š–‡ŤCƒţîLJĚ\´ş°QA(űr+ż)ŁľĽc(KD zÓŚrB<G—­ĎYý諓#ÔŚľ{†%2\…Ľlˆš;ĺ`ކ€ iHԟů@m2U{„€ ŕ;š}ŠÄě5Ą‰IéhR:9Ňä ur§îźPóÖ}bƒRŠM‚ůú 3śÂŔ+展ňŕŰ ó§ěĞ<$CYŇŘ+…˛×R{[Ž=HPeX1\źƒ6‹<چÚĽŒm˛(ÇŞí h(€XݤԢözĄnśŰĹ d“Îglś[jeŇÓPJo)€b"ö\VmYoŚ—ČU˘÷ …NĹ}/ދ­ŔČ~O-OWĘĎ~06ƒąOáí=Šô ˛Ć0H’ŽB8~¸‚%–TbÓßOąŐ4ś­}•?“?˜šŇhPűÖuXĘ@›ăŕüŔM<ÖĹ#u!ŚŔp0‡žłŐŃ.OTřD ţpԎGÉěćę‚üĆ;ą¨A…Í)s=Qć:P&5:Ůr:9Ľú÷×Rŕá‡ĺ­ľŤXPs•Âfń‘xm dŸ|QřKű*`duŕ‰€’žŞ7Ÿ†|{D2ST(÷Ô¤<"`¤YeK {6$ˇă„ńšĐ„á#žQ;E9ßZžŁƒ„†śôПNśyaTš]Bf˙}?ĘőaZS‹Œ§F›h ľü]đ” nóUăܘÂŮř•ΔďeĘoRşŸ”fŹt˝^Hwž9˙€ş6sŤt¤‰lxlmH>e%DˆÇ5–gAű;OŚč‡Ó/ąéUngPُP™X3ŕó Ź™ČÎ0[ŔĆKƒöÖ2đÍƒ(%É ŐˇĄä¤Ö'鍉J‚íËď ýşĚFä1X…űg„‚ÚëטhD¨B콐}Sjž‹Đ+p\ŰҸĎ$C”Wľm0ô—2JtŠÚЎÜÁ=腂BφŤQœ°ŕĆ)hxöŒ/ąŐ&ÛgxÜë˙"ÔaÉTŽĚ?{%!zᴄh7†h'zԃëˆó>ö€ F“`? L•5*<Ÿ‚ă¸Óc–ç1ś2CfzŢ ‡ódn:C}I2¸Ymvßě0*ć•ĹqLˆ“˛ŐUDžSG2Q?÷ô;×vžqGS¨ĘCŕŤčîă,FčłŰYDŮ˜3KŢúŮČ T d”/rƇńÖ.Ž+Rδ*ý7ąĺ~6† 3H¸G”kÜt¨óžŚŘŸ|ßźPňíDHĽůf”R0ŕ˝6ůÇžíxźŠMcJ+༁礈zoéŃ+hFłZĹüČ-}xż„§ŠČ‡Â Ézs÷Ë×tJ endstream endobj 455 0 obj << /Type /Page /Parent 759 0 R /Resources 456 0 R /Contents 457 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 456 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 457 0 obj << /Length 4038 /Filter /FlateDecode >> stream H‰ŹWݎ۸FoýźČ…TÄ ôCuŻ2q˛Ř‚Ä@/’^hdyŹŽÇr-9ižc}…žfżCR”==)°`Lęă9‡çŸçn˝xľ^K&Řzť")˒qüšeÉŽ”dEš%\Ť’­ŻŢôŤ{sŒłž^źúůŁ`ýg9Łzą—_Ÿ˘ńR¨DGßbÉŞăЂ|ݝëÝűjĂâĽäŃ/1ΌéČĐÄËż§mUˇ‡xY&eô ‚ŘĎçvcż4D)A‹_!rÁŁMÝ6ěíŚÚîŔâŹ˙şxť^Ö˛…ÖIV*("!S–Ş4ŃiĘpÓB˛SłŘ.îÖ7  tRŚR“ţ¤›(IMn|ÓăĽĆĺ !¨˘Sœâ‹[ńDŃĹéă.Ś˙ƒ˝ÔŤwÎâi˘ k˝"Vő"úSźţç…?pˇŇÂÖ ŠęV$™I˛2# ƒä‹2ÉaD’œFY1Œš_’‘ČĚR^œ¨ˇZ”<Ę_‚;ל-ŮkRJ¤uÁŁ˙fIĆ{_=Ä$¤‰ŃܛŮY8“IĆeŔŔĐM?k\ƒ27ąö)ʒ¸„ĘxôzuÇ>4mo#$‡ŠÍ-”3ëd9śIš‘é>Eë]Ăö0† gŁî<° ąňŘT‡v4‡ŐĚZŞŰ’$óž$Ł]Ľ-„ś=Űś˙vÄÖ śíNŹÚďîÓiśš:𥭛>ń÷Ü^X“ ¤1‡[ d ü‘łź‰ĚĆČSzJ°ĚEAźLež'Et׏ [qżÍݎŮő6˝ŢŞë­źŢ łŐÜlřS“KxŻÔFˇ$ TI€EZrŁ⯔yv‘>&}EAŚbqíń;­|Ł•i ^e‚˜7Qu[ĎÂpEŽGť,ËŻ”*‘°rˆp™fôŠş˘—)tŐ"D/Šě𛰖†.ú { űdEš§Š0>—E˜˝B˛–J…č•Ę ýœCşşÁ^#‚yĐ9—ňŹ’|r-ŘâŠ}*ËDĺA߼ ɢošgáۧb' ú.- HżkHżáÚL"´DĐwĎŔSÜŁV—†ľőÓ°ž…§¨‡}ÔÍÂSÔĚĂŢëłđäľyŘ[}žĚ2 ŰVsُ ôkÁQ˛,QJ¤žźSyuMöî[\$=JčŸV>E¸čÁO‚&p` ›Đ8SčLţ €‡ouœ NţC:^4RHcé+ÍĂŢFx´Đ<ěí€ÇԚ‡}jŕ1ľćaoúyřçň­Ě<ŢţOC§e˘˝Ŕ™ćíđÝ;Äal߇P˙pđ şBĆ~äŕ0SźđR~Wü/Łażôő,~áÉ9üŇOłř…ćđKĎâœĂ/í3‡˙xóĂĂM(őă˝Oţ@ď“%â\e–{ašžů8˝şÎˇ˘iŞ@[(_0eĄGľÝşŻl‡šMňč@C”ŒööŒOf°RűĹ-Ǚ’_Ňl› žxŚÜ)ŠŇ?¤Ď(…V§žë3ćIîá™lâŽz:üFő \ŔĂcq„Šëź€ žŕkoPŸąKsP€OůyFŋöćË};0Zbhˆ‘ăîŮGú9a.1C ţˇ5>Ňô˙_gKhNÇxąGCϜ柼ę Ő#ě ¨ĚGZ~ńœ~ÂLjá"mU?G†Î\Ę\ÇÜdcĹ|Ž Čîíö[,…Ż,W+—ˆÎű!q噣$5}ĺÜë›­œq/ŠĚW1 g Ç'\ąa˜ÂLoĘĄ4:”ŽúžŽŤ őWDłŤăé=Ýë—XÝ †@Ń NZ ÎŮćزÇΜűćsü’Ť­ { ë?ăŞ÷ Ť!ĂPŃCłaC~ü$ńsŔ1ŚŹˆˆšáĘşNĽ8őfőˇŃZ¤ {ęÎ8ü-%Ĺ7Ĺv]?ÍżĆŇôÇŚnŤ˝ż 11ړVdO2ÂĽöˆVŁ˝pŽŞťMCVŕvkÔ!tĂ^ź[ýçĹ;ź˘wŹ"(ČÝŞ}ßąţ|,ˆř¸sÎ1ÖAžc‹ŸvtОݟ‡ÉÚm‡zçoÔ°Žđ]œ!Ťí˙—ä–œLěŔ†őÍ~ťčeDIÔ ~|¤ŘU=;tl Ë­ ť~™Âw k™÷§Ý˙#Q ^6AŠR%)T&÷ÚşcĆĽŘžmíšşrnߙë!vŰóiäא1‹č„đwŸPĘƢXĐS~`3…‰/hŠ-hœ*f4¸Œ#%Ç8‚É’Ř<´VŐPąXáyjČ÷íááiy4öČՔćŠ÷g:Ľůş;ם÷ՆČŹ”Ě ˙‰%ŇůőŤĄ…;Ťűî<°mk3-Đr*ďĆ9ŮÄ;sîĂ`¨›˘ qœ/Aß§ĚŠéÝĄo(+˛ëj˙+㿏9ă‚ÜFDQx˘Ĺ °` űsŸŘƒŚYEXˇľĄf’ƒY†ć¸z‰×Y ˝Ő´˝ŮŚ96‡M?JŹĎĆ"::ĐÓŘÚ°ÚcWSš"ň̆ňüˆ„H÷›žˆz}ݜÇ)˘2­lěł%QR}=VőŻ cÎ§Gް(üĂlP¤šeţwQIcľům*UŇjiJUŠ ŃšocújlÓâCLӅ6#Ld5DŔ+źŔHŢT\iKĐuÔĽ2•„œë˘zěČńł KyŸ(W™žvË{—ÂŚ0ď`eÇŠň>‹&CŠčLZŤhżw™ěˆ¨ŘđhąöÝ~^űĆśvtbNŚśv›s=ô.˘Ś„ž1§b˘Ę ž1•A`™ű9UOĎ­ĚOZ)—4üÝá)PPđ|Üć×Űěz›^oŐőV^o…Ůjn6üiÄĚ Š^…_h:œd>T™}‡Ŕ0nŔ€AnÂťŕ˜đBĆîŽĺ„C%­fGź 7Åń2áeqCÂ8ą8ŒC\ĎquK‚›â‚ÜĆf¨ňRB!f§ź‡qŒť…kžÝĐaœă‚ÜĆ5npËÓă âđ>ĺƒe=ΉR?öy|Šĺî#qŸâčäWËnăFźäCćĂ0°Ĺg€=Ä1Č!9>ŘČ^h‰ś˜P¤@Rël>#_œęá?Ëö—ÝŮUrZř:Á\™ç‰ÓÝüâš{ý%ČŃŚ: 9ˆç’X†ejŕÍW…˛­‹<<Ć' OČ ń–‰ ŻŠůäh>™Äp„Ž„[&V¸J‹’šß–Ö4S—˛Ş˝\ƒšŮż˘¤”ç ŕ<|9dń5š_ŁUŻóňkä~Š­ŽĽ/cwôĺ얾ŒÝїł[ú2vG_ÎnéËŘ]ęű[‰OxşÚěߟh(VZ,čˆé›ĆţJßälßô\ßd\ßdcđĺdl_d|Á—\ßă%Ű×ŘoœÇ’†źeëňŤŽq„W^RÖÚŠ4ŻLRœŮäl~Ešĺ­Áˇňéđ9ődđ}߉+ż;‘žľ3řVz9|w˘|g_ĆwÂĚâ[Eŕđ­Áˇ˛Íĺß) ƒďěËřNÔšř"qřÖÎŕ[ÉçđÝÉdđ}˙ óK=TŠŽľŇ'Ü~ńs#&EäD‹tđL?6OÇĄJŇĂtU†@ b◾[ýx¨Lţ,~¸šű~júÎXŐćýŠ“9ë(Ü Í6(úŞ˘šˆE\ĐęqN!­|L/T:@ú1ĄĂœĐŢ}/‚U™F2ąQ4ŁŘ‡ćúDÖÝÔ"&Hœü¨’.ü&gë1Žőö a~ö ´9‘m]đTa,ëm(ÄíŔÍ$6ýţĄéęQvÉ “;ź›MŐÎűGƒ€‡ :zc6ťÍĹóćĆçfÚěDŐmĄÉ'äąĐ!p˘RŹp‘Ťw$ůP!V˝h,ĹĂqŢn÷ŘűŠŞÎËŽĚş%-hř˝@š*J_žERďÓŽŐž?v“čMaM?Úúe!Ş ü&¸ýý¤´Q˜ŠŮ˘wťĆą]u R"‘.p^Vć§ŘUŁč7¨މçCŃΡş\Ř_3ťuó[g 5nhŸäçz0ó&Xř¨Úůç§ŔdˆxŞEâk‘şZ¤s¤Űf¨7z÷cÓmj˜ś'ą×1ĺ˛'ša^ —m…ť żž,;ăWˇ[Jl%ň1flžôéčć׉n:ŹČłC‡QřÓh†ˆéš˙T(ä¸ŇŒ Lím­î甯éŚú)P:Á*Ő$§×Bý‚7ýs÷\ÍĎśó3SnD{čÇfj>Ď`WłőxxŽôoóůéĐożó~ÉŽ~Ş4C.Yř›źűHęfĘZÎIźĂŐtJˇÓˀĽ¤9NfšNÇqZíúĄů‹ź”읊jh”žŸ-ǐá׆ŠŞF(`E˜Ř˝Fú.ł}%Úú^ƒÎm§Ë§§ĂBš\ę•QKZˇ(ý>3ˇĎlᧀⓏ9tŽvłƒŽ´ZB ˝aœ:­2ĆzNžXřŰH]ŃS$3;âi†3vVhýzδßůŐPN͕VsCK˝cq!ÎŮ;`ăÓ"_4‰{4Ăąoş+Í˛Źŕá0ôš d˛öí Öí@E‘8vy:Ą2ő2lvĄ°UO1=Röăőż–ýřšý˜Ďž˝\ü33ú7‘ endstream endobj 458 0 obj << /Type /Page /Parent 760 0 R /Resources 460 0 R /Contents 461 0 R /Annots [ 459 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 459 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 305 167 322 181 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 460 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 461 0 obj << /Length 3991 /Filter /FlateDecode >> stream H‰ŹWÝnŰČE^é)ć˘$1œ?rf\ÄńnĐ MĐí-Ń6weÉéyîžC_łgHΐvć“d¤0 “<3ßď™ďŤĹëŐJ0ÎV× Î3k-Ëń7^Ú<ËĽŹT:ˍ´luˇxýŽŐlÝöËrÖŽŻßäěŚ]`mžĂĐząô—‹%Ó%—™IžŚ"Ďx˛ŤîťŰWű‡őí‡jĂҥȓż§X0uKş:]ř¸ŽÖÍ.]ÚĚ&7)w{˙Đl†'ľŰ)°˙9/xž|Ź×ű݆ý¸işfżcéżW˙Xü¸ZpÖ°…1™ś‰đŒ ŔT™QŠ!ŇR°C˝¸^\ŹŽ@šĚ*a\ţ.7n]šůŕťý}ş4bWrH~D•gŇîތzýÓXq•IřZ]:SëEň—tőŰŹˆÍđPPŐ;ݜg&\•™Ť0,Á?ˇY":Ď*Š\‹¤/÷+W$Wf!f+ÖŮx´´y˘yž„őÜälÉŢş¤„ƒŒ)óäż:ӌąŐMęœÔŠtűJĘÂI:Ôí=@;¤˙ŘtˇěŞîëz< }|–ƒ9ˆ!‡îqĎ0ťvEźr1ƒ=­ NeËö×ěnˆZ$ýŰT]ĹÖűťűŞkŽś5띞˝żßÖ˙i™ëL{_Ż›ëfíĘë()ÁűˇßeĄÚ<Ęm%DOń’;ć–`@Ą Á…?‹ŇL#gä  ráúyŃtŹtDÉ [<˝ŐOoŐÓ[ůôV<˝ĺý­Éű›ü9eřlMŸĂx9Ë–—.<ł˘Đł‚c–"Ië.ÂU˜fĹVY˜ŔŕœőçkvĘNă … 8nľ.žŹ°2BÓ€[Ľç”|bA(L>ĂI ÂMáü8nĄ#%ó̃)łB—´L#YĂm–Űňˆ‰fĽ$-HŠÁ1ź@ň˜#2‘ӝr¸ÇpŚY§áĄäO<(a3YНT§ĆÇMŽä J°IѝTe‰Žáë´`§;y ŸÎƒĘ”ő8*ožł=ŽO\&đŔÄ8>ńˆŔ âřÔCˆăS}âř ĘGć.ÇŤ Ď10p(ľE˜ťĺ4wÇ÷‘‹ŻŠ“Tźżš°ř|$â˝MćÇKŽ‹,î¤*ˆ D#ü+–×&^# >: •IÓ­HBmËţýOYc’Ď ݆ÚÉŚSŐ-”Šp÷Y–ť‘ Š*@G†Š@qKź…<ăľbŞ*ľu=&˜—ß3˙ńJŞ`Á÷S= =6°'s\&`Oĺ8˜LŔžČq8T<Ÿ*7ŢV­ěßÎŽ/ˆüDôsďč'eÁëçdŇOÂBĐO2†Š‘„Ż¤…Š×q A˙h „Żod&ĆÄ-ý"c˜HEXđúDZ˜xGńÁóúc%­/>őšŔC'ăřÔ']ˆăS ëd Ÿ÷)ŠĎşĂç5Žâł Ćđy}břů“K|c Ół%Fž#1&­(ĘŢ|93Żt0Žöć9$Ľ((|N%t„męm ĺLşţˇJ1NXÎĘ~%^v‹ůŚO'7}3cäŒSQ "WL}'W„ÎS+ŚŢQ+ŽUm fq!žGĆrt€¤ŒĹáph؟™8JGŔžnq8öç%‡’ÇáSőÖ8c…zŒi‹R?ßʘÇi#-Œ26ł@ČeÁ˃o$ia”1ڂď5eÁËŘ #H ٌŃuđŒĄ,xŁcđ¤"-Œ2F[đźŁůŕů™ł/ŸË…O˝&đĐÉ8>ő‰ŔCâřTcŒăS}âřŮ2Ś ÉR/cę%2ŚĘ´,Ľ7Ży0/řLƸ˝ŒáË+’éÉ@‘Ü÷ŚJ–Ľx/ć ˛ ;f›?˝ů›™Łf‹É˝bâš"0Z1ő’Zqb̖łš4ß!kÚŕ;”JÖ8"ög(‡Ň°Ż[ˆ€ýů‰ĂĄäqřT˝Á,ű’3]šL7Uń#ŞFYđŞ6Y T°TŒ!ô‘˛ŕU´ZMXŞF[đl ,xU#ëCXŞFĆ8EYđŞFZ´#ůŕů‚Š[CŤO˝&đĐÉ8>ő‰ŔCâřTcŒăS}âřůŞV(|=ŮóEMżHÔ Iiě˙AÔtĐ%ůrQ{˛ů›‘Łg‹Ššb˘š"Z1ľ’ZqbČj‹Élĺ÷ˆZÁĄ§öQó0<ˆG!‰C{ď m"SüLŸP3=î Ŕ„ƒ0ňÉ Â  x˜rŕt(w`ÂA ځg(áŔÔŻ'dÂŹ‹;0á Č ™A–„Sź‘;0áŕţtXsî8ďĎşż×E!Ó łNĺĆÔ|6ŻËáÄ˙ÔÜ<ęCĂzÉSŘ(’t’zÓ×ďͰl7ězf¤fŸŮŻÉ—ú0>ƒÇĆUk;ÜţšŽE¨ŐŠ~nšC˝îło›Ýşî ł­ÚwčëZŇ/ŮT]ĺN.­§Řu3ŽŤˇW؊•KĐ1w??˙ă˝ vŰ6‚č=_ąGş Q%ú˜Ŕ=ô8ꚏČUD„ä \Jňm?¸oŢ,IÉNœ[NÉÝŮٙ7oŢřŤ”ŞkOżŠ ůD'yÔgë[ä6OśUžÜ¤žVƒÉľ–‚ëĎţ. „„n(řŐseĂâX%>ŐşąŃäťj{ý˙E:¸ăbcüš=+@ßôąÔ&¸ĺÁ‡ŞŻNj`Ś_‡Ťý€˜Ž‡łí˘6҄€yĂZ€ŕ…ąPÎ_aůů`Íwpü~8ľßŰţšč:ÉgŞČ‹ĚG‰Ď@čŢwŐ7Y•& [˙‘—Wa\=2ń@ý<éĎ$)”eR~'3Sť]?E–;-“vRˆÝ)¤ăDPźC a<ĆHÝĺ z÷“`ĽŤ‘Î9ż V ´kƒ"œ/,ňž?ËÁ+đüţž>JŐfÖÎ$äÇśĄ\‡‡b?cžlUŰmíĚŽó z°ĐCš|¸YK {źÂ^%ǁIYĂY;)ŔşúăŻ6BErÜÇőýKJÉFg3u6vOŁŘČH×ËäT.ĚÚç…xî&9Ę!Y2$w5Ÿż¸ŮU7]źV‘ĽăYŚP Z ő^úŇŢűŕôé˝tDßőH‚ f“J“óM o÷׎›ťčłDtčÔ !ą˛ĘbŸMôŽ=›[œ-[ćß'[5ó˙..sČWYGˆž ÚÎĐ„cŽ4ƒ1=ŐŽ*lË.?¤ëĽƒG?“M×3sJ^€‘‘ä 5šu…o†Ä“„H%ОďĹ´vą#ÍA €ˆĂ-Œj׸Yą}MçÖI|čdŁä˝đ$ÉŸĺveŐŇáU܃ƒżé6ńi•Äť3§—ďMfH׃¸ŔF߈‹­“ 6^RvEČůÝŘk˘SťŞ HäjlĄܙ­ď÷šF/Š fCcëÚ¸Öé¸ ”… †m€˛Jť&žśŽĘKŽ&ú YĄEcx]ˆŇL—Ăáú=ęîÎ5śjŤV{ĺ1- 6Iˆ!ű„+ĆGžˇöĐWE0OţXě?ÚŇ@¸Ižăp-Đ6ŽÝłżo=ôé°ŕçźw­; +ťëÖž˜¸T*đѝ‰¤—GғĄfšz˙Ů]vˇÄśŰe6OŢoI€.ęł“ŕĹ@íŇ•­ cx=S°ŘVë7„ĐŸŞ6÷*w\kĆ_R†ťVhľT{ŻŞëáFĆ!W@ň)Bb 9˛THđéŁ(3ŒĽąőYa›š˜ {ÇĘE˝ôá’VFů<¨ç(I1‘LLGFN##?ŞBfKŔ5ÇĐČR†Ą^‘żůŔËÁM\főĄ+븎&B`I“ 7źŚXçŘ$aÁ˙6څlhÇ˝Ŕ`$EÖ?p$°ňš“Ŕ›/RN^ 17œOG&(ń2RÝŕ5ě6.a—Yj“IŐÖdĘ<Ď ŞżKÇ/'ľÚ– jâ8‘ÝËÍđa¨Ä)(×PŃÁ1ęR0gęŔ/ŸĹĘß(¨:ö+ź(ÍÉvĆŻ47*’ů*ŇŽ!:Ž‘}IÖA•Šœ+łŕQ†Ĺ^¨ăStpaVŞ„uŠcPÎpœńh$Â@žłr`}*œkĎ^Uë*VóĐ.uŔŁŁ(BČÎŇ]UľŔďOďţŔÎÔ endstream endobj 462 0 obj << /Type /Page /Parent 760 0 R /Resources 464 0 R /Contents 465 0 R /Annots [ 463 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 463 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 462 458 488 472 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 464 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 465 0 obj << /Length 3218 /Filter /FlateDecode >> stream H‰¤WËnŰHĹlőľč9°*ŹÉŞŮĹqwĐĚ čh‘t2 Y˘mvۢ!Ňmä‹ć7ç֛˛ëJĘb–NŐ}œ{ëňrľxłZqÂČęfÁŐZ“ ţůG]ŃJNZYÓJ MV‹7ďÚlFť­"ăfńćýGFnÇě­*0´Y,ĂăóâKńą\2AUń­äeĹný8őp|5ʎ¤\ňŞřľ„=–fËԕËţîo֛~W.5ŐĹmÉ DŢ?ő[÷KgNr8 kXU|ě6ĂnK~ŢöS?ěHůŸŐ??ŻŒôdĄ­ľ€De\)$URˆ´ĺdß-n—Ť#EľäĘäorcÚ¤Yšß ĺRAp!œ*öĽ„˙{ˆŞ˘Ân~ź+Í˙“ ęÍ/žqIřZ]S›EńˇrőÇŹ›v°#TZ§ţÉx&ܰL Ă` ü3M Ńx–ĹÚ°Ř–î C’Ą™óَ ő€śş*jV-ÁzĽ*˛$oMRÜ@JľUńߚքëŰŇ8éJaÎyfĎpÍi]q„`ȍU.9eřĺ–k˙ČLlmU“S˛iŰBĽŚŞ}ćĺRVźĄmqŮO¤…Ľ¨š°l—őáR.Ĺá’.™]ŞĘ.*_˝X ÍĄ•ÍÁ?ŚŞn ¤9Ŕoš7őŹe€Č˛†´ÍC|Šý —MK &mŞ–Xg<žĆĄěŠ8,ëş9ŘĄĺźĆ-Že=ˇ Ł.ĄˇC-psĎŞă¸â ‡”Ô ŞĽMÝâ ßD{ ×´ŇíZT Z˘†Žá D ŽyPœň Ż”Á5?† ÚĚ* ZvŕArMEƒWR ¸5ę8ŽŞúH˛…n’x%eŰBÇpŤtÍĄŰ^ÉSxş-…Qĺq`^˝ěö<žzÁc'ćńÔGť §"xŹ@Oüäń“s—xąJ‘FC"˜sˇMs×+Î塲ĽľQhó,ž‰ Ěľ7ďY “ĂMm4HČĚ|U=ău|U0Úňl$Sý´ąŻ5ˆgcź™Rƒî|& š`­ܟ$—FöÝzç(ˇ˘”ť‡Ěˆ­g-žZĐüMƒíH´c;€ř# јw s7˙…h4đ… —‡ą#pčw öíŽŔĄŰ1Ř7;‡^Ç`ßę(Gŕ|Ťއ˛ďpçň "!LaŽ+,jÁ+ě̢°˜… °x ą˜Ż ¸…XkÄBPČ#B;`źâ<ĎA,…ĂcˆM…Yđ †[ˆ}‡öCčP(ĽQÂđTk•ĚăŠNŤÇÇĚ㉟<~žľđ†Ău{žńłHRřœ0ćámfžj˘yëďťqz*ÍgÓ^üá# łŞĂ¤T|rŞ#ęHŤ:<ގ´ŞÓxՑAuäkŐ1“(ľQNuđ‰jllj)Ř Ÿ™? :-Řb¨čdŃŘáy4ôwÝGCogŃŘŮy4ôuTgŃ47‘6={žŘ@e8ĂľĆÁG¤9”&žÇ„&>ę ć?/>¨ v>•7{>j z>6@ţ|P,˙Ô"ŮóQ_0˙Љň烺`çS›!ő÷íрö‘–<‹‹ŔĄvy8–óy8‹Ŕˇ<iÉĂçK |~Ԃ‰ó%Eœ#)pż%o źşĽL0%EEIáÎ:3*ŔÍ×KÝ>ĂÇ w2­ŒČ(#Üʈ‚o+ˇň(Ő3;˛}möÓš}9Ž Ă؎YÂ6¤ŽÁ6ÄžA6¤Ú#N ߚÁŔfíh\-¨„Şb"—‡ămCŕpŰňpä ky8Ţ6ˇ-GĆó𠞼‚+ĘżGë BUt“;Q;ĚBťdÓ;ÄB<4†TGÄB<ÔB*uŢB=ÜBěÄB=”‡Ô0y QřĐRO!‚ôĄRŰaýú´Qs\ý<ŐÁc%óxŞ‚Ç*äńÄ1‚Góxâ'ŸŻ‚JŸ>獠ü.ózfţő‡ ßBËZ*–TđÔǔ?'Ă7•_ó™9-_[?óSí”ő—c ]jÓŹ(˘;b+á;B3Ą;b; ;N j ń#Âipx›Â„1Ç{ˆŔáćáHŢňpźƒŽ`Ž”çá|ƒkŽaě~‡2 FUô“QFQFĚBPĆdSFÄBTF4†THÄBPFÔBŞuŢBTFÜBlÄBPF”‡Ô1y QŃRS!‚2˘RßaýúĽŇWFŸ×:‹Ď*™ĂçuĘâł*äđ9ÇY|Ć`Ÿó“ĂĎWFó ŕ^œ­Œőw)#˜‡ď3ĚËdŢ| Xi4˛Ľ•*~/a”ł‚<îťą„‹RŒO%ƒÄŠ}GZJkŘ×@T琔ň×Ӆ+č&yLŔĐąâřŽPstGŹşăÄ@…­œIý#ĆjĐÎú•€E\E8sßPÜĎg™ĎHF„ń`ă;ď ÁyqşŁę€8ˆ0â ÔAląźƒçDmŔ„EDq¤­Aky Î;ˆĘ‚fç"â ˆƒ <¨ƒxEóœwp ?œËŒ™ Îě]ĎÚJZ͍ˆß* fĺ.ü/ýíÓž+ľščő’•ćdÁ(!oŻ.ÉŰëqpżÜ?šżźôë˘+—02†ŠˇËaG×kăOgjz9Ţá0hFҧHÝJ*k¸TcœéîĂ'L÷SšÖ/7łÚŻî ií—/~îČ˝[nýđç˛ ČuďÖţ籄 4 7¤[oîˆ9fÎݔ T|ş Ÿ/@4XUŹw[÷đ;äĘ ˙#čŃłä펣ŘÝZaqűnöĂďŰŤrŠ!ÇťţÉĄ‡Xr+˜úÚcuĺyӑ7íxƒ˘üŮÁIiÎܸ„tąpżŹ=rAÖ#éÝł%ĄľĄ™Ľ ź’_Ěל*ü.›+ş˝ĺĐüâ÷Sł_Íă3uőńĽZódâ[Ýuäăs?ۆÓ÷Ý8=íË%Œ@piٺjכÉ0Q´.aĘ÷ŔÜU|+™6šPvXťi?Üßwnľ%×ţTŘ6ĎťKťí=dbÝýZ‚IY@”ŮŰýŐíĐď\MžŚîů_ЇaŰýƒĚLčóżóś6L<Ŕ˝űyžó ú ÚŽˇéŘ6´ëŸŕÍékńîę_ÄX˙Z^[;8Ôçk]ęBű`i„Ś*ÍËÍ㰟ş­)ł}őw_ "\Aśý8őťÍDď#ď†çŠqn/˜>ČmÎ^ë؃†ëGH‚‘Á f&üTq›„1î >“}g‚Ÿ/B|Ő3›ááşß­§†\Ő1áKş%ˇĽŠsgK;ď§~w3ěěÁ‹ůţWśáúţy {›ÔiśB˛ˆ1ö‘Ŕŕ,WřÖçŠőë˜FZ˙“­ßg_°Îś—IkŢlŚř†Iĺ¸~茓m7ÚŤ,Š d)Š} ՅSŁí˛śŘX3ĐÉT\ř&Î ŒŠÇ¨¸‹jşž ޸#żYc˛pëŢ Č}‚b3ňÜßߓÍ`9„ =óԑiđU„"Zú¸­BSÄÄ ^˛ŞČŐ8hƅm(eچ1ăťěŤĺĆT˛÷E‹|ń„ťœ…éŽÄَóxßw#vnpHWNVˇšfżu÷ŕç/GůŮ “A Aż–óŃĆOŒśˇ~Ž\–&@˛ž6w˙ŤťZv˘čŻĚrL°A¨MXŔĉq3Ё6)mĂ´¨ßĄě9wŚŸ¤´ˇwÎ=Ű“ zÁźÄĆónw/şˇÎpÓťkËűŒl°)˛dWÖ{œžt˙ }[ @NŢżë2ąÉ%‡Zř0š§˛Ÿň4döBçÔŠëËÎl*Ž h׌Gň7”TĺędŞžóXóbÁ!/ŮŠ4I~ȸćL“rEzîŰÉŘîb¨ ľg$‰Ľ ˝u¸’ľ4zjĺŞÄŕî hMN˛‚ÜVlG˝ _ÔJMĺ։l4´ŘqŃşQť>ü*Đ"GCfűь;ý“ż‚tkŰs #5űn› ˇëĆĄlŐśĚÓ%qĄöž‹x˝x{\˜ěÍ=œŕńj Ăn>Ă ɐF2¤Ă÷ß÷šäËôOôJAĐűf™ˆ:ņWÚĘlM!6~ŹO$üL"m)´Ď´:Y_ďč‚đĆWq€šgrŚ˝§ČŠ&V\}ušuqÖIř ˝•#\„ď3äí ”œů’ ]›śăóÁFŕ’8ĎqĘlš*/¨žO4żvDÁÔ endstream endobj 466 0 obj << /Type /Page /Parent 760 0 R /Resources 472 0 R /Contents 473 0 R /Annots [ 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 467 0 obj << /A << /S /URI /URI (http://www.synaptics.com/)>> /Type /Annot /Subtype /Link /Rect [ 206 289 333 303 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 468 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 133 672 141 686 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 469 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 162 672 170 686 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 470 0 obj << /Dest [ 209 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 152 595 211 609 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 471 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 262 595 288 609 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 472 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 473 0 obj << /Length 3742 /Filter /FlateDecode >> stream H‰ŹWےŰĆ­\žřó$ƒż­dIĽT)ŮʲJśĺ<`Ap XŒýś˙!oůÜî€Ř]iĽ‡ÔV-síé>}ú̋őâj˝•VëíBk?ĎsŕĎ6óŔ˘(TŤ8ńƒ,ĘŐzż¸ziUž(S.ŽŢÜjuo˜ب\xcóźřŕÜşžŽüĚůŮ _;mqj,_wÇrwSl”녁óÖĹ ş4e¨\/Ĺoż-Ęşu˝Üϝ{WӐzsŹ7ŇSŃĘkńŤuŞçś*ťvŁ^męĄîZĺţkýˇĹŤőBŤZ-˛ĚOňŃžcGąŸĹą‚ĽŤPőŐbťxą~ĆQćçq˜Ńýén:§krÁ—ÝÁő2‡b•Óť1ţ×°*đ#2œ:w.ýĨŤ×ÖăąáŹőˇ´UšpţஹŶĺ2,ůPۢ“UH^Väaě„óuî§p";y1uŘÝKrš9 g3Jß60şĘ'с‡Ýƒ,PžşŚK…4”eŤŔů"˘”ş)î]:¤r#ZˇŠ&7['ĄŸágŒťĹk1›eâk۝ć@[œéŃŰÁJ.Fq$O}őm_Ÿ`IćT˝rĂ$…5×nŔ´W;o­ŁżŰé*$r‰íVĄČ¨HUŹş­vľQ6F:á -Ar›ŐÆ>|ŔŁˆÖŽ8UjÁ ÷eŽ)űúŽÚ`_ۉ€Áă7ˇW!z[őuѨCß ]Ů5‹Aí;cqäéĐĺÓÉ30ArQÔ_¸Ĺ읺yé•ÝţP ő]S)4]'ŽCŐu4•Úv˝jşł@Ŕsi´ŠNUŁJUçz„›ýţŘÖeÁévއ ŹŚĚö•Xšţ lřGKŮúcŰÖ#OÖřŽÔťşě;Ómő^NC.1l7ÝŮđ–B—GMی40Łáě4‰ŕ> ç).OA!c bK㕟 #äň ĺ6Ů:âíŔQ`$ů ŠĄ]p{ŞŇBUšŁ .DDĹė;f5äm$ëRĐ'{źI#Ł'ůiĆç~řĺĂłł@`לë÷EÓظZ^Pű˘ľœpĐÝńÂßăčoű‘—ńß%ť•$rŒâqśËű ą˝>šÚÂÁöóń2ąŻŚŕ{ó–=ÍG ş{€äH.‚6„°•Ă;umC\Ďž„ą‘ŁęvS÷ll\ô2zŞmG!3řš‡/fäÓ,|Ƨ×F™]w†;[őÚM`ŠEáý…Ź’(ě*P„ÚPčöÓ%üôü) Ť"5ŽMó0ŚÉ%Ś6s TňČٜäˇ öŐ*ú_%˝„Uƒtă"%ˇjY×X.á;—6täÔÚÇĐ ¸…kˆrîţÚ]qľ MzY&‹ţ-Sdţ^ÔĐĄ‘ąo„7Q5glţˆŠ˙ř§'/ËÁŸFý5%š€—B~FF\FŕĎŔzÁŠ…ŠĹŰąŮP-[Ş}цTďzçŮĚď•Udöš´G…*ľéĘăĆą$XâóÜ6vĽ#žˆ€M5I~–‹ =u5ęc=Č;í š`ŞŇˇě†H ЎRzI}Úşţ^&Ţ)Ôi.GřR0Mš@˝ˆćÁÔ3ˇďŘJhÄáđÍŐŐů|ö ÷Xhćň,OäAťžZ/€BŤ0‡óS„5L}䊜y˝Ř.^ʍÉyž+6BšQ¤ý44ÖáB™FíŮȀŒ”×—?1Y7 şŞ=ęƒ0— G:ä8Ţw9ő ´C*¸7öZo•…sWÂč#$r~§á3d´ţzb‰1x˘ŚbGîŇś„D¸Č§—ůĽ˜ßýŞ˛)Œ!ZŢY–ĹüójYR‚żâŁŠZČbfkOINšQľš…‹ÖxY°]~|~şgFÂĆI6ÉlYIóčîÉŹi*˘çœ¤şg§F`Oú ÓŘVe0UjsfoNś?űvrę_ŘHL؝ ŞkŤÂŚDĄ5]U•5JQŠagŔ&M]‘Ţ2VG'§mŃŇtIçô‹žŮ´ćQXmŽ!×BďˇöŮedRśĺVäÍń䞊bĽÖ~ŐLżî&Ł&V9÷šŕę‹!śaîUlŢ/$ď>ú(š|9K7ýĘ@T>Fł‰übĚšî^š sQĺj\˝ÓƔmLâEšdŰŢČDM^ŽťŇ÷†}kBč[ąEĹV°8:+Ű÷Ewą Ń:Đę\Ö*ś€ …"EĘV8YQĚ×e*ţZ„ř€DŢĹZI|łóť7…łeۧwÉMű6ňspKuę(˘ü‡ůnj<ĺ5%žŸˇ›Ŕ[âüTš^KxŸAe´vŽÔ4 ń2đ9´Y@ Ÿ;@şŐş—=Ë”jAđŕ˘Ű‰Ü~ƒ8ȧ‡~>ݎO§FüÄTœ3Ť›PĎC¨çjŞ cl|ÔżŒ˘Ż÷ÎF&kŞ2FŒ’iŰŤ/6ŕľD¤"ż"WipžóE†Ř˘bŸWoo…íŻţŽĘĆ掎ľ÷'uj—cKsdSä-ëç˝ë'6}š•˛Ęée23ŚěçÔÖ6ěԒ˙ÍH9áŻđ†NAá=wm[I_ĆNQ{g=ЎVłŔÉę?‰˛×|šúlë˛W†TY„Ľ=;ädoů¸ţčD)§LŞ Ž¨Ÿ6ąĐ'Ç6MkíGEŞňcÔČŤlŽuŔ$ĚŃCNŚ+dœP“lĄ-ŁP/“ÎJĺÜ ¸:’‘B­Ř>…­/‚)ŽĽ"nyŮÁG^ :Ž=žĆ4ÖfTG) ­Ţo˛ćë>™`OÜü3o­wőx>vórŔ)ÁĎ÷ŢϨ䌭;ŠŤ Ž ™ @iÝŤ |1Ĺ QƒzAäɨ~’ąlß֑úŇř Γ—ćP‹‡ďČ5Ŕ§‹ű>ýŚaŇž¨V}%;ŹânÂßłvEEűąůš°MC6ÔŰĄÍƒů2é:ޗiŸź•ÍŸŁ"2M5š™ßí„čP /‘]bPž’’’›R\oĘáşFľ (zTԁďŇ~¨,%â endstream endobj 474 0 obj << /Type /Page /Parent 760 0 R /Resources 475 0 R /Contents 476 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 475 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 476 0 obj << /Length 3688 /Filter /FlateDecode >> stream H‰”WێăĆE^őýH#.Ż?ínlĂŒ,°6NœŐŃ#‘ IÍŹĂÉ?ä7sNU“˘F“Ý [}­ëŠSď6‹7›Ml"łŮ-˘((ŠÂ„řsĂ" Â$‰Í:͂0O ł9.Ţźď3Ső˛-4}ľxóýÇČ<ô ě C\T-–ăđyń7Œ’ ÷~őă0ˆźŚ< 5ŽoÚsľ˙PnżŒCď{°čsË`ýĺ ßnWVuă/‹ đüˆKćűs˝Ő˓1ÎâEŤ(ô>ÚŞmśćŰm=Ômcüżoţ´řvłˆLmydEE˘ ŠS“&i§Š¤ëŘtvą[źŰ|ÁIiœSęT3Tߡ'™C8hˆS^ç§ř_CŞ0H(8'÷>˙*ԛďœĹÓ Á[›?ňŞjáýÎßü2ód+tY šĘŁnėML+Z7áý¨V0"_N˝’V\ybî;‰fŽăَ*pŹŽ‹Đˢp‰ŰĂ<4Kó–JĹ\Ęóučý1Ć|(|>bý„çÖédfgá,˛0ţż ź‹ WaŞm>i›ŤśĂޚşŮÖU9Ří?QŐŢMa#@ěΞDšÜłÜ@°$Ó˘œ@°ôCwŽş*ń*Ć5ńĐf…ęř4ŽćnXĎ}?ŠńĄŹhîÂ{´Ăxƒsă:ČfÇŁdԋ#ńb{φń—Iyśtˇ•.Ž—qŹ#łDřf/Eq#ŢUžNˆń_ál_OŤúţ…Íź;Ÿ>ńĚOw毚TăŒě*‘A-LÝŃÂbÁľWůLNÉÖm9”Śě !űwuăvŃ~‰‡ƒÇöÉMY9؛˛kĎź×)łů˝łĹd J/>ŃŁLƒşćń˘˙Çśł–ŠŇ.öOľű]•şÁ8.‰-Ő>šjĽçö|ŘŰĺýĄî÷Śź œN]ňů4žůg­Ÿ{ۏ‚Őz1Ů$zć\žëÚŁŘpƒ0Śä\â}„N5]3ËÁˆÔkdu‚çŢöc` $V/#š’'“Ç_Ś!ÚČů–/d¸íB‚^–[]6M+?kţŰa.״ʧÓ=1°é´ą7iÝ˝m쓄wÎĐ(,qtšOŻ“ÝŰőŕËC˙ÔIـzV))5Ý}â_>Ní!ĚřZӏŘđ]ŰűŮ͗GžU‘íݗR!gžRuOăÔť¤ŞA´5ďřxi÷óq\=ňAĎ*Cť3H•Ř`KŤbř2Ś˝ËNôŤŸŕS†Óč@60lˇ×R†„„B&YVČÂl.§N$3M`¨p:œ˜ŹČOünîĚšÁÔTŻ–ú)\ţfdhÝŞťťcĽuS;™ŞőŔůjŽ?÷u3ÝĚäxß6C×PR{TEÍúč’:7U`ƒă[ÚŞÓ(N%Š‘óp@>Z‡úÝЛ6éʃyDŮč < ˆeíś˙ƒ{/(^âL1˝Xč‹ÂČČ$(ŘTŒP‰`莸G݃‘XXŠęmE†BŹy"ko)Bi>qkÄřžłmŸ{s´˝ÄćÚă—9ţ`ÍĎŢs=ěĺ:Ź÷ĽžĂBă.?Ť(Ç{Ü.şD¨3 HÇ㐺´;“ąţŞÉßJb =šŹW>ÂĽ­+‹ďĎžÎqü¤ť8ěBňń3ÔGN›’˙ţřd¨5Żěš Łżs4đ2 źĚŢs}8˜œíŮ^NâŒ9Ÿ¤ňœŞ“ăQrżťÎM{^TЉ’FëKm2Bh %¨ F9C˘}?•Bh9\Ͳäę¨W‘QyĘ­PˆľRˆ„6ć/cž-őŽjoŽzČ ţ:đÔxHÜäxo㐡r✷–0=–o ëD„ĂJÓ~âČŐ<|ܛ÷NĹîî:…W—^†Aޒć ĘËč&˝RrťYfŹćŮĹ`_ 2Xf–iŻt iqŰÁĚچKćĎřţÖ$ŔÓŮLx˙ŔCšx°ŃęeaŠfjń#bîôG­żžôŒi}›×ę›ü§Zi­žęDscŰ$XŻ/´>žWÝ Ö_yÝĄ­đyäř%ÇOŻ ë5ŠďŇ{"݌źV´\éGű4’´çnÖźrä#˜Ń6֙hE•hęôK=â€gľ†­~şžˇpMё îlÚçƒÝ^÷w#pBm}ČŹÚą œaOAşrŐ îŘł]˜ž†„ňlg#IŒŚˇŽätě}vżš-÷„ €ĎöŐŢ”AřϝŐ×kĎÄ+>éL­g.Ĺ`°Ś5OÓč˜ÔXHyaЇŔ´O:ƒˆ˘Łň2ďÁ\žŐBŢXţd2Sž[ČsԃôłiäçÄ7݀„ŕČkzJÝÑţU:n˜˘?rďkXŹum†g#Ć5Äłó ÂdV˛ë%ő3ońÖ.ĄŘ”7ÝçčO#(Oďöó=ÂvGö哼;*^jžÚż!ń‹Çô%ăD)üÇËŻkém[áđs"Űî$݉7ś‘&Śsđ˛-$c”1‰twŠmˆ…Ŕ^yĐÖOnígˆ™1oHj: ™:¨´¤môwkʤŘJŞÝ˜p+$Ü7†ÚUu͈K*ź*3ƒyŰi۔z'ŠBô*šąDvT‰\„V>˘úޙ{˛A_}ß~vڞ,ľlœZěż?ȍ$œNŽÔäÎ ćä~ĘkPo?Úmܧ}ĺźâŚ—Šëě×;%…ď‚`0°ŐýůĹBŕ‡S1~­ěēOڞ“+8á4..};Ş(NŰÖ˝Ş.đđI)q­ŽÚžÔ'ą˜ ™ł‚o*˝e.,˜yăvęžKžý€!+ę~Ořđż4Šc?…(’†NťłsSšK˘Uë“6‘g×9"klĺxđu…=[5ś‚r¸Šu´Ľ[ŰűW­äÔáiď§-ĺÔÎ{ĘKë¨-ĺeWiĹʎđT:…›dĘWâźBbťĚEí„ę`I^]čFŠäč“a( p1D6ËŹj3çúʜxĘîŕG4šcöh<óˆƒ&ž˛Ő­ßčÂüî/Ő0–'znŞ˘ň˝+óĘr8č$ĺgƒy),şŤ%/âŕ3WYřq5ńEďÖHřŠŤk%؏ŤT[iDżţô•.ÉE×őÔGbz[—ňh– ţ8H&ZčxtVâaíś4žŹÔ éěEq˘,K6iÍĺČ=ťý&Ł:őÂËnˇi ˆÂ÷<…/)TuhÝZ\U^€H\˙€ŠăľÖN*ńí3sÎŘŢ8¸îĆű?sÎ7MǓ˘Ś¸—őŮMM2ÔK˜ó†Ë]“t6ÔńjÉS´Ů˙ aU"€Őä.€UđŚĆfwġ RMw!Ş^Dˇ jULaɓ‚Ěń%1ů˘S°IäB¤U^uÂߪLż…›äšFgĂŘ>Z'ż´ĚÉÖvORŃd‹F]Ą™5k0Q´Jő- É'C ÔUÁ§yl]Ź 0ŹŻĆŤ­ŠÓn‚‰9zň€0C ş58ŠÍîéuŔŁŞŠŕ­ś¸Ź RŽă2žSĚ|ÄnŰ_XÄZ͐Ÿ§L˙É7(ĽČĄ™r¨ ˙ˆb+ŹżZ,™Äüjd§†ŰŁŞÂŁŢ˜đžiƒÜĆ‘Îâ0oŮ2Í:UpĈţd ĆlÌ{}b4â`Ę(UË{ŔN„ŻCŻ9ËŰϤç-r–őĽŔ d°]6RUPřlÉ40§ö™ˇ•4L Sý­Í˝áGf[ęčĽM°“XĆüœŐ‡ó˙ŕwŁ„™ł˝(ŽÎŤ^ęŒůłŔ=ţ>–ISkďŹmÜŞ Đ{]O>9UÝřnY{wˆîÄmß.cu%Î,Ž:čň+ MćźÄŃŔ†›#ˆŤ‹ äIRqaŐö úŠ˜EҤo%5t?ݧĆCL*b1ŮĄđN#÷oÜomŤäŁ"Ž Ç=ßÁ<|„¸Ëűą)†˙™JI— [cKŒža{Š$4"GĂččY`žOú8gŚd-Ů9™Fçú<[źďŔNűiskoňŢBó\Ř%jŸM•ŽťyŸÍóŕj†"8‡ÉśţşÎ>r“† ý¸0´™ł>’é˙âďrŒ‘gţ&×uâ_^€lŽ–¸‹mčŒ5hR”dŚ 8žĆˇĄAŘpX9ű9L⋝jŤď‡"اlAX,°_śg‰#|Ćć đgIŐĐąg#ş5#Ú/¨Ć(ä˙Ăąď-ţ?yHCS~§ÖcEwŞźdXm­Şś+{Ť Ŕ`Í~ę5ŕ*‘†Ô˜lĄ:˘WŻgď,8N4ŘkŰa˘™‚<ᤊrĚćplmŕŮÔöČŤkĹť¸Ćƒœ Ę\ťÖĐú›äŢËş%ą™˜!|05¤őăňŇ4ćŽl­vŒŹţ|ĹFľćx&0öX_÷ţ 0$2 endstream endobj 477 0 obj << /Type /Page /Parent 760 0 R /Resources 485 0 R /Contents 486 0 R /Annots [ 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 478 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 478 593 504 607 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 479 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 376 551 403 565 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 480 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 391 538 417 552 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 481 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 413 524 439 538 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 482 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 423 510 449 524 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 483 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 408 497 435 511 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 484 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 432 482 458 496 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 485 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 486 0 obj << /Length 3259 /Filter /FlateDecode >> stream H‰”WŰrŰČ­źň+ćqa`p!đä˛%ŰŮÔnEeą;ë<€hb—¸(­÷} ?‘ßLŸîÁE¤ä˛KUâ`Śgú2ÝgNż^/^Ź×Fůj˝]řž›ŚŠňčĎSĎő‚Ŕ¨Uš^¤j}Xź¸î"•w,ćŠ._źxwçŤĎ݂d=ĘËař°řYß9K?pýĹ1žëë:;öm_7§|w›ĘYO˙ŕ -:éKgÓoťÍňŞv–Š›ęώ%őîT2Sb§Ą˝ôëűąďéť2oęB˝)Şžjjĺügý÷śőÂW•Z$‰Ľ9âťž U„n†Š,]Ֆ‹íâőú+7 M˙ᛟÂMOźnŽÎ2!ăČCÚĽ['¤˙Yĺš ÇäÎÁ˙^ŒzńÖF9ř°K9‹•p˘ƒ’w>48á{ŽŠüB 0=1G_čů0č˜dŤńVV0šÍ/eŢŤfťĽŠçĚ출×ßű0G™YmJÎ6li—.wĚşIÁrŽ^ů”>¡H_ ľŒ˙ŹËxĂăjO¸-ň„W "{Nˆc eŽ•tњ÷öVŽŠˇ,RY3řŮXBđŹhăÇĄ9ýČŢ>ÂƟ[ţ-řtwVs‰™âńl|é”8ŕçĚŔ šb:•CQú拓 Úyéů˛ŞęTQŢW\™r%4ęÍőŃ𘲳´>dĹK˜A ý T\Ś…5ű]Ůż%Œ őż 6ŐďŠvĄýŢfŹ &JŠA׋mŐ€ƒtł­­Îű˛íĺútŘĐP}Ň])Gćœ\|Ć ]˙“cƒťţëTĄůb^Ť3ënڊŽFęŚúŸ ™˘ˆíK!iâHě+XTÝŰĽ’Ŕƒžć™UçzăQo|Ą÷śiéé^ĆŤX?śMßä͞ńQpŁďł|ÇĘb}(ë^ąç“.]; Ŕ ľ{ĽŽ˙ńÜ3`nă(aW`aT‘rg ¤Ł›ŕGÝ5íšü0R$THKCî1a2eÄĆ 8!6CB“ŞŢ6w|đ9œ˜Gpry3yS”¸\N@J”W3ť^3^ď’ĐĚKÎŕ#´Ţš4Ýuŕloěä`'[›Ö_œ´˜Äcgyý+/Ď\ţ™}~W2ŢdŒůröšPA¤_GU7‰…ŕ*2qŠüÉPŐIϋňY,Ą ¸ÎŽŮFŕąĂ{:äxůťM˘žŹ zčóěh'Dœ> cÁBĚÜT˝ÔădZxY„ÁhMpaÍÉľÖÔŕ´Ír>ŕ'”&f›ŽŮŸú’RĽi‹ŞśŹ8وĂlľg‰ Îí f!íş`9í.ü(Ďvůú}u ‘p0gSţ1<¸ňý`VSŞčo1Ĺ)ož2†€(7ČŁ_Ž&üŻśŠYz$śb‰Şś˙íl6Z+,) ťń3qŁ„Á,ś÷yČZ™ŹęΖ˘Ń_ˇ|4üéŤMŘr1/ÁŠôVx Œ.Ę׎¸D.Ŕ$= 1Bi)[­řŻö9ó€lzŇ$çÂGž'ëŻ@TŐCŐďV%ˇ JÚlůPQe]žń‡Á1Őuů=xţáć–{ŚÜqăĆ´%'k˛\ŐSîžjd𞓪Îw“"b85*á  âŇÝO§}_˝uVHóŽĽ+ Ű!ąškdJĚ­!T÷š…ĂxĂă˝3œÎuđŹW`âYüźgŕ´óSř|×:ůŽíŻ:ŔÖă ľeب'şŒsť—ÂX+t0ÇąĐčë۲žśpEpÖOuɇÁę\xr”ĂzE{fntCTY§ĄJęihj;BŢa0*R‡ƒľa Î]y–аužXˇŇkŰ0eĚ1Žoj˜VLœ$DôЏQŸ;Ul…Ľg9ő„śŒéh÷ę˜Őĺf­ÎJFŁ’'Œ2bTŹo$Ńŕ Ń¨6vÜč7˘>ѓ‘ɈŘ0˛`S’ů‰ąŒ)¨şëOmiŞŹĺňVzňĽyl?XPŸ˙ůəÓčąuô§î̡ažŁ×`Ź]qiP<ěÝ}qŸ>ŻßöŽ,sńđGn<řEƒ}řŻQr)3ŠÁ5ՈýÜfůŻÄş“*Ţ9¸tVČŠ„).ąľŁ´Ë@6ůUI4qNj;ÔöT[Fh‡Ž°'ĆßĺrĆŘ{u=ž&ˈ:'çźá,4ičgôœŔŠ8ÝEçň,8r…’D!qlJ˘_kŁ÷*/NIęŚ);ŠIŰPâÚ3ş~a˙D‹ŹĎÔśm„Łő˜"kGe˙ž>ף˜ńu5—Ż+n0!ŽQäż F11 ČůAŽ^ÔŽüíÄe‡ůźTĂđĆgôA7ň5ď žir'[¤Ą\WLQůIŽ3PR˘\˝ŹĐČöžÂ ŐĂŽ˛ćԁ’í<ř•{Îň‘źěśo;ś¸4w/‚Ĺůó÷ľ&ďĂúŠŇ´q Jř„u€Ŕ‚u ˜)0€^‹ššŽX(‡ŔŞ>gc2úÉSˇŚ˙ ć@sŤň 4'BHPkUv݉+’ĘŕüU7#y1—ě×€ąXbľ “š–ŮR[)rN’ Ŕ_r‘SřÁŽV|÷=ěďšÔą"*ŘPżecFŇJ +S4t/eĽŇX9ĹbŠűZŸ_kNí‹;ţZĎp#—ĚĎ@ ?Ęp>˛d';4'şd ’˝çˆď9’ˇqĹOĽÇĄBŐD<ŐÄťbv@ú…ž˝Ś¸ĆúJó‡ůĽąMœ‰=ŠR<ätŒ(ą0=,f¸ÉxeżŻşžKˆ° ]WŔĚ ŸšýOřk9g/LJ2ŃaüÉ52s<8s7šÜ˝ˆ´ƒüč?źĎxđpĽţDŞE#“š‘…^~ˆR\É÷Nú`-{r–Á‹ÄÉÇËâwÝŕaĆŚę^Tʗ=ŻÚ÷óŮJˆI-§~–Ní›{ź÷ň§FĎ2ŚmgéŔÎxOP5ĘŐ]Ť<Ř~:­UśŮËł˝Ú—Ű˙s^-9 Ă@tĎ)ş $ŇÔişb;$$¸@”Adç€3ď͸!bŐƏÇöä}ü‡. łEV[E€Śžh2~mýM¤nFm;Şâur㉊íĹj–3ˇYŽ˘LAd&p>řĘŰ%q~É1é™ÔÉóűé/?­p­˜(›S4aú[_˜ĎÁGďÁŇÉ. A‚Iß˝Ů-ĎđĄ xÚ4,vH&v6ćU1íúŽ,>W ‹đâďőf…ˆŐPŔqńéb´5ĽnEeźí%qFˇ‚Hŕ<Śč|)r4ĚŰ;cyƒ=”:X5sňyš:ČÔ­A˜Âö2š"äĆ+ňCNťťQŘĘÝęű¤Œ8­sśŠmÇíĚg˛ŚCťŰš -Ú޲| "QĂWńo;_Ç|š(.Ú Žk¨mYOťhs_í­mG4RůdvNłZ6ońä;}˛]㘠žÉßȉ×îôÚłäöű—o `ő„%Öɋ˘?ÍŁ°t´zÂĺ"—}÷؈ ´:8ĽŕS’óĚŁŚ“9 7ăőŸ°oôőLŁŤ}…ěÜ*ŚÂZŠÄ.TşAĎ{ëřNÁçsŢCË´`-ĄPsX€áióä˘2KÝ04V[űcä&†F°Ż3Ő4PtÜN!uţ!ż’Ďu÷ÚFfŹçËYÂŕFĆĂZăŠwƒ,\ˆĎ*5>´:´×ôí}[•˘ˆÂłQ]C.5"Šý}ywň%ŔÍ7Ý= endstream endobj 487 0 obj << /Type /Page /Parent 760 0 R /Resources 488 0 R /Contents 489 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 488 0 obj << /ProcSet [ /PDF /Text ] /Font << /F1 660 0 R /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 489 0 obj << /Length 2618 /Filter /FlateDecode >> stream H‰¤WënŰČF˙ę)Śé2•h’"%r]ŔqlWmœ¸ӽس&)‹‰DŞ"ÇöyúšýÎ93¤)i‹Â5—3ç6߹̋dp’$žňT˛xžÇąrń§‡ąë¸ăąŻŚAč¸Ń8VÉzprք*k˜ĚUM68šœ{ꞀÖuÁ(ŒĚđapcÍí‘7v"ëŃö]ÇłŞtӖ8žÔťlyćĘůŽ5łAƒM›HÚÂMđť]¤YY٣؉­{ŰŁ-uš+sY)褏łřőź‰çZó"ŤŤ\çe[֕˛˙‘üepž œÉ¤ŕI#ś'”\1Ţ!+ľIÉsš /2wáéŕŃöŮ#ČX”ôłmZž_NdĽw+Z(l‚ł˙$y„OŽ/Lż$íą˘¸= á†4Ş´ĘĹWOČ*•ĽĚ–?0Ýçŕ}ÂéŠ9–‘?)ă0O‚ż‡I­•ËŠ†üFdFföĄ`>ˇÖ­ýÔüC(šČP˘äğ†ęçĄř:ś ú/şŔdľ\ĽÜíŘĘË*m: QYŹ×ŞĐGł%’}ĐgŠÖ1)ޓ0AŠ cŸSžzœú<¤Ę §cĘy¤wF{eĺe•­vHŁ0đá‰gÚážw;ËgĂŘsƒHP|f"‚¨žădŕä†Vi…vžçs$n<ń(b/œĘé5ŐV9ső8ŤčHŮ2Kâ0šş7ž}ńúL)ĺFýęÜ  ťMŒ Fԟ̉pĂރY!{h!ë5Gň\ÝŻLÄ×äľ Ťş÷8A"ęŻ:ł#\ÝÖŚČ,Җvşt™>ŕ(t‰âv;w˘Í¨ďŢ˙Lȝ§=2ę7^ßjš0śÝZżß$d\ePeôĂŹIjZ–Uň8|Ž1đ™EöN67pc]!>R:v_ź¨?ÝZĎhüş6Âć|›Ň{™Ĺ}9FBŽôű°^äŽ!<˙„ŽŠÖŞ{çöśz…0ů~/‹j{oŹëşi˙Ćl˖tbŠ÷Ĺ­ĺîB Ţ@r1KúPݧfn‹vˇeM4Ž'hüĐ¨óÁřÁÓi>úa. ě6EÁ1sk-ŻŹňĄńGyő¸o†}B—7ö{†“…ţÄŔőUÉäÁnŁÖÜ*RrŸ"7Ɣâů›Ţ—LSq÷89€šşç›C¨= 6ŘÚ2>śmoës¨‘œŽĂŢżď:5' źś6:"Τ‹Uý`sąFľŚ"Ô1 ވ‹#gęĆ>4Ă  B/ýĺíI7ó›îaŒj …!fT>6 ŰlRËú ;CmAj]P?Zgˆ}(D•Š—˝9<Žđ˛řXŹęÍş¨Z”ďĺ–YÔ- •0,¸$Ą”ó‘ łěԏś7áVś*‡;HNsœ¤z|x>BĆ}‰1cÂgLDŒ‰ˆ1Q¨%T_1YąĺĹďžzô)ŕ5^œ_Î^˙zu>§KŸŸ^ž˙zuĘůüYţlĹřhša—s†‡ýŐdó†Ů1?°ťĽ Ą1ç {ŽčŽŰ› ЇÓǘfz$loŹó×/™-+ÇZBĂ=Mž… î÷NčŻzc“2-O–ěťU†B­¤2°Cč­JŚĄžˆP‘˘sDćD^ž˛é1uqƇĐFÝuŹŻ(¤>ŠkŚßtÍb‡ęąŢɊ2BťÓx2ŽűƒY‘kĘâ éJ%č÷MŒ"'˜8¸#Ă8šr‰ËR™ŻVˆ~)˝ŇČSnQ=xhž;ÖUqlžœppÜ!GMüi˙Ví2çówŻ’[ ™WŻ^œžýŐdXÁ@w˝­3ä_FґLë€W­‡kIhčÚÍŇJ˛–13ŇJî7.ÚcYďFíkÄyHçCŞ–=Î7ô4•S…žďdŽ–“A!Ä_dUwżŠ;Ě_ÜČ.Ś˘=G.YđnĆÝC˛çiz;`­óôŤ7Ż/ÍýŹşí˙Ż;<ĎĎß&óÂsżgřf%¸8JńÔäM¤É+Á˛”pŠŐ˝ÖuŠ6ƒž˘(LÔץĺáë[ô<ČÓϟZ˜ŕňËFF\™EľĚ9žŮÇ}fߍ•Ä7ĆŁHę=ľZÖŤźá ôŰAHŔě•lQľ™Z˙ÜUV0ĘŞÝúŽTâ˜&gEyécş*Š  ˇÇ€l˘ÂHĎęŞMËŞ1ŃÍ 4ěhŘ'P_IÍşäaŐň'QnCýLŁô†vŠź¸”ŠôŇ|OZu˝WŒ~„ťić“ ‡îhŞç ó§:812ľ°Žűš ސš|S!¸§  őţą(ůzďtśß;]SCĂśkT?´ş4uO.šĺĎšU׊č ;=Č+Šq˝×Ýö°ýÇDš3kţÎ÷ îÝ[€I>´n•ú?ż‰fň”AŐ ¸Ý ˇ‘žsÇÖŚ–“ĐĽ•Ś—ĘO¨,ËŃP4=}Ḧ́߅đŤî aĽîdAh‡6@tg8¤;9S¨O(Oxuž*Տ6UŃKŐzó<ŽůW:Žiďƒií@ŐŽZń hřĺ'_ ~ÁŤ%Y{^§yhˆe-ď/ kč‘$rĹŘŔ"ă]źěĺ23všĹL~/ŽÉ Œœ„3Đ[›š’wv`óˆÓ#ˆœ˙˘ źzD}%ečŇ8˙ů”ýh mç˛h"„ueÄ"oţ|dŁýĹtgĂ˝°phiÖ\”•4‚[íÁkíiuŕV˙HS(çÉŕß6Kĺň endstream endobj 490 0 obj << /Type /Page /Parent 760 0 R /Resources 495 0 R /Contents 496 0 R /Annots [ 491 0 R 492 0 R 493 0 R 494 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 491 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 384 530 410 544 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 492 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 359 515 376 529 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 493 0 obj << /Dest [ 385 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 338 375 355 389 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 494 0 obj << /Dest [ 442 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 377 375 403 389 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 495 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 496 0 obj << /Length 4564 /Filter /FlateDecode >> stream H‰¤WێăČ E^ýő°RĐÖÔMˇäi{v˛ŮAŰČlÔ˛ÜÖÂśIîžÎĺ7sČ*YňuӖŠ%yH˛ł‹…J,V3Ľ˘<υÄ?˙˜ËHŁEjăHf&‹íěĂÇ.eÇۤčĘهŸ”xéfŘ+%•łůđř6ű<…se˘,xľŒT°+ö}ĎÍĄ\.–"œküb„!méŤpžŕˇ]e˝ çy”/Ą"‘řńP/ÝJE_j|‹_Ľ%ƒ§ŞlvKńiY÷ułáż›}Z̔¨Ĺ,ˢ87pDEJ[a2k,MľhŤŮjö¸¸€É˘ÜęŒü'ßTNnJçŕÇfÎ3ńUІkX%#C†Óâ:¤ż˝3ęĂ_<â628kńŠ*gÁÂĹo“xŔśÜ‰ –őOt˛Đ„˛ „Ą 獤żŻŕŻN4pQ÷k'ńť’§;œlëŠ2?:÷° yďEl`§9Í— Ům NłYEŠšĂQp˛î×>7Y ěĚ)Aˆ’DĚ4; )ÍŘIĚX™ ßÎM,ƒl–óŽßTbK˝Ăd˘Ű%ú˝w€UŒÁő´Éhł9ÚěËeßÖMKř˝R:31Đ&ŇyżoÚ5P`GVh<篐~ČŽUshš8Ä35šĄ)Š(oŸú˘íœ`Їëëđ՗Œyýş›˘ëE˙ÖU’C†C3:ÔĺË[ŐşBĽzHŔ,“r~›Şx­wţS2* ÄoŻwÝtýźŤúžxđlćâcť/gÓĆ?1B9#rďůGŚ´}úŘýđW.2RE&űśĐnš"—;Ş…†Ž%:_™ ŘlŽ0ÎLÝgˇr9'ce'žőrĎç&KtKçPÍ&Zţśü܇$ÁşB3°~ ˝ß–‡’‘>˝ß ÜJă4šIzۂĽĎŹżŢÔ=#›8ŽI‚—2Î2'9†Ć[„.DçXÍTCc–&.VąB¨Ë_(<fv‚’í"PԈ™Ě&üQďVÍS˝Ýo*öéăvyV“÷Ň)œĺ:˜šîŃ`şŞäŃNG6Ňč :ĺR'Ç9쟲ó—­b¨×ÎĽsłŤŽ— ¤ŠŁč¨ó҄”źB=˜ť^ÇI‹!Ę[­_ÜŇÚwŔÝH:Ĺ=I,} ą5 €W|­d‚´™Ň“.p‘ v°ç qÁx'âîK7Pƒŕ&€MɌQňŤ„[¸YeyÜëV7Í[4!7šđ‹âŁEąłč§Đń"AăĎO4šé›˛Ů<ˆŞĄ‚Îbgś~â´mŤ‚Š‹Mˆ1ŹęÖó‹'Î?>’$‘€juŞŰ慄–ľW7Řú˘ć:w;™ŇóiľuCšąëÖšŽ¤ÝŽ1dŃĚCŽűâ÷ľˆďź@:;g!i­žzQšĄ) §t_<{6Ń|KszPol§xv$ó,ĽŕyY ţuÖňA›ťk‘dęçe.WˇaM9ō;Ç|-ޚþȕŚ^AŠęŇ2uii(Đžśyřwyy}Ř„DŢĐÄIů8Œ“ǃn|řg_‹}_m÷ŕ#B¸‹nđQ§Nĺď‡ öLf/ş("ž™ëÉĘđ– ë8`ÔnÝäO’—öíŘ`îĆôÓVËęŇwČô (2÷ÉCÝÖ`Qâ–ďéTüšĎƒÇhĚß^Œă3 ´Ěsëo4y‰’ ¤őş@?%BÓÍ0lžî)Wç>câ¤Šńŕwštó͔V6(°Ý’ď`•požd–ŽźĐšň@ů?4Mn—~Sç°ĹdfĚ7‘Ą(3ˇz^„ŢM˜íîœN5ÓŠç3ňTű‹’›vÜĘ Ö˝1â όhşő3VdJQ–UçhűŻZNÜ<Ü!cmŽt~r>#͙˙üZ7‡Nź|U2ň-Wš .2 K_ľĂ­Ô]CkęĹđ…7)ĺ"V÷ď ŠĂĂx{rś‡îDoœD¸NVŽËăŠőţŽ[ u6D˜ÝŸ.ĆÜóœe)üŁŇ:JR4qŁm$ úĖSĆdcóđę­Ô”ů ÷”îu2^“Ó×řô՞žšÓW}úŞř5“ü"ĎoƒšŹĚŘ˙8ş€aZ§yL>`-×I<×h1ΨcLžXů§ĹLŮ8Ęmƒ<řŤĹœ˙śŐlő ň$J’ě(Çk'';r$–Žok€<ˇńTƒ5'´EÍcťĽA[”żź/Ďô(‡KŮŮ Ş*NokČ2ÜŔîÉóHć靌ąQnĚM ĆÄ°ŕžœî€ćŢ ™Ž´ź)’çúž=eiœŞ“,hr;’Ö j˛űňLĆw|°)˛Éގ¤MŃo’{ň ܋tŹ‘męv$O>­™r Ÿ]fű5ů4—ŻĘ'™xM>ÍŁŤňI\“OcxU>‰Ŕ5ůŸkňÇĹďĐ.¨J)\-L#Ľéčy7=ť~ ßÔŻ:üç”ˆI!öęýي“HjŞT¨O'ęíx÷FŻŸR76ĄQîBE ĂX8c™˙œÓt¤ĐbęWNL#MÎA6,5Ţ@M(Uu˛Od]šF˜˝Ű&ţN͝$&‚OË o‚ԝSó_oŰ—d›TćĄWü,ůnȏÉsC~LŽňcđoČü{]Jb%“ů˙ÓĽ¤‰ţGzľěśmDŃ_™EdaŠž‰ŹšE ´@]¤ŮĐ"e1ĽE¤’ć;R żŰsç)Űź’ŒllRgćÜ;÷u8%ş‡í:w]ÇáśëÜŽĂm×1¸ ,‡ŰŽcpx?ř¸Şh*J üՁFýEraüš7řšçŹÜ{Nî'÷Ź> ƒ•s–Á'|™ÁÉ5ĎŕJ‚a°rĚĆÁÍ2ƒ“[Ö_V ƒ•S–ÁWś^˘ šŒű\3¸Ëä2îóÄŕ. ˸1ƒť.ă>>ËřŐrH­âřz5ŒŻRC‰ěyšÎƒťĐ3ř…ŔžxŞSŽŇČzŽęçUe0Ş~ÂŔ¨:Ç`U÷Á§“a0ŞÎ3ř„/3XU?ĂŕJ‚a0ŞÎÇÁÍ2ƒUuŢ_V ƒQužÁWś^ úerŚ1—qŸkw™\Ć}žÜea÷1fpÁeÜÇgż^ŐIćbŔŐ˛ž\!ë1nyŽ8Ç9Oče˘F/=šý]w%„Ôî@Ÿłhý~ŻŢ[Ó\+6TôˇÚZ˙4š}Ý S­ŮYŠżAö ډ-E° +3D˙Ä´ –üéœÂhKŁdIme°+\îŘĆjŽŕ–Šü=ËłuZŚ|Ű0¸kˇmĂŕ.8nۆÁ]Űp¸mwĄgđK(đÉKô šŠŁ”×3ƒŸŃ3ŽÁę™gŕôŒapzĆúŕÓÉ0X=c|—œžń Ž$Ťgl|Ń,38=c}đeĹ0X=c|áqő`ë%žĐ˜Ë¸Ď5ƒťL.ă>O Œű3¸‹ŕ2î㳌_Żgi…‹dö‚kjz•žQť&8_­ĺ ˝,œž%šý˛ë¸‹ŕ@‚“XĺI”ňZy GĄşJÖúUËY˘ĺŹÔr&ˈŕŇĽ’Đy6f3CíE âĺ ĐČÝ:­•gó*:ŠĎE]cWřr+.Œ×4Eîłü[t —ůóöqxŠTĺ|űą¸×?3Ž9ÎX°ăÜ[ŕĆ9cÁăËܸgĎŕ†gÁáŒ+ŹWDŒ/[prÁ[°ƒŠłŕpƂ•6nÔ1<žlÁÉ {7,9 g,X9b-¸Ve,x|ŮÂ%üń¸–’:]ŞŚˇĎ˛’ë˘LAĂٸv˘‚Í ě\ˇţĎÝýqlŐG˝(V2GÄk!Ţţń}˜ă×8TŸňˇĂqŁVíކ;yP7âahZq÷EýgVčI ÂŽŰá8W•Ü_BY)šDC <ˇa‚Až W…Rz9ösۈyŻ’7đ0 nÄŤ(Ÿ,ťę~Rďý6śÓ㟎ąQ{çîSŰĂ݁ŒľRˆF=ë͇ás;ŽŽ‡ľ>đíwú ątsWyŢ~|”Î5Íď۟´ěŃŇż‚‡q߆)$e|ťx]VzšŽOéâSšÁ~×áҡŻďz:*üJpÄÚ2hĹFŃŽ °Ć8ŇjŽÚóm[ĎǑB…eŻEm6"jÁA ŁhÚśÝ#áZŁŕž°ĽÝž›ťzV´ ŢČ#DBš9Í+čÖZfŢëÜymjrěˆ;Վ渜n•F\÷í(ěË~ăúH&¨ĆŠSĘ\ÇžŚÔÖb´?=ć[ÝĄő{ąéťÍßđrš[ěśŘћ T/q°5KAłÍĄýk(Ɂ˝˝ěžŚůyŠR…Ž{ŐGťˇu3Ý x­Ť …Ś˘JĎäkf㪞uńN&)xŸDÝĆr™űú›đJßCôŸpô?ë`ĐÉÚíěN,Ţľú¤…i*hŐDŚ\#JĎ&é%e%´6xżšwhœÝĐ7fľŠZÔ@qRäŇÍ$z´U‹#˘äŤ ďŃGꊥLŤ'ąŚ™:W/iBÔSđńHżŮďiUTŁţEů!ŽS{˛Elń"ńůG/ŁzځAŸ?zŮŹ˙môKˇż'VIʧŤtĐ;LÜ'Ľíž`鉎v@DÚý†2]Šź‚ …G5Ź{FÚö'YĐŁJý)ߎĂˆcâSmJ$PcÍö1}íUĄ×çiýם*`Ěŕú“‘Śh’ŕ_íĄ*_#)‹8uî›ĎűŠíۍꭽö×Ć<ŘtuŻk*×ěh‰ž3?ÜďfmĂ÷}™ęŢASĺiÝ"ĘßT [´­i#ä6ҍoĘKX3Ş0“śÝ?†ĄU šĘŽ&ÝŃLŃՇĂ8čm2čĐ4ú4‰> ‚”Dâˆů6­Ý§ń˙€)p; endstream endobj 497 0 obj << /Type /Page /Parent 760 0 R /Resources 499 0 R /Contents 500 0 R /Annots [ 498 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 498 0 obj << /Dest [ 298 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 188 113 214 127 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 499 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 500 0 obj << /Length 3239 /Filter /FlateDecode >> stream H‰¤WˎăĆEśúŠZdA#’HĆČÂ÷ŘI`ĹLl˛Ô˘G">Zq~Ăţ‡üfÎ}EŠ;Ó6ŒZdąę>Ď=÷Ö7ŰĹŰí66‘ŮîQäynBüéca’Ä&]­ƒ0Krł=.Ţžë׌ěy[húrńöťűČ<ö ě C*K÷x^|ôîýe”™÷هAä5Ĺi¨q|ێĺţCQ‡ŢŸ}ěÁGŸś Ö_nđŰ튲nüeäŢŁŃ'óÝXW˛bédŒłř˘Mz÷śl›ĘÜUőPˇń˙šýËânťˆLmYŹóŽDAŻĚ*YŮje`i›Î.v‹oś_@’ů*ÎČň-ĘÉÍP|מüeăŕ!NyżÂ˙V…AB†Óâާ˙ƒőö˝F|$Đľý–D• ďwţö‡Y>`[.Ÿ% +VŞO¤ŮÄeC†$čň`ƒ ’ć•WP7‡ű ‰ÂÇłe řšćĄˇŽÂ%¤‡Yh–ćkr*ŚOY–†ŢӪ̇âŃ'%ÖOč\šMaÖŻă`Ćż:Ŕi˜q¸a„ąˇq4…ŘŰî‘l M*VƒL#÷ęźmq2k+{Đ@<h24р>ÔCoÎśC<PrríIčÂĐ ­Šęžx8XSf€ŽGŰcg_(ĆwŰđçG¤€œzó0ŚiSużÔĂ ¸Âą[ރ,3Ks}1m3™śÓf ,ôŠłˇŕb—îĚ#ń+Ď%œśE‘Ůľ›:´ĺg=¨Ć8ŮČџa$šżš‘óY¨‡˝ĄăuóHÝč-^>/žn˙ ţ­'˙ÖâíZsďbJ"đnÎíx¨ {¨›ŃE6őZr›}‹ŻđńTwĂX(ŇŠżjύqčŔ_ÇŢvĆţ›†Ô’,K˝q°ěí…7œˆ52ËńŃ⫞;ßŠž#8 7^ꚉÝzł×s{ödIߍ0äTháď|ÍĄĎçŰş˙Ué{îœ< âdVńŐŚn(3őn'ŕŽ9Ô Ľ¤eŒb_]PČ,—Ě”"ţ$Wđ"ŘŻžYézntĘŹF撩WĽK㙥ŠZú'Ź•-[˜2ŽQ„ý Ůé)!ˇúŇ 3 D‘ƒbMVpDᎳ[ľŤ ŢçúäžňˇÁ¤xÚÓdŒGF Z+śá§.‹ƒ0ýšĘ=lí,YĽËdN책ǺŞhZů‚šc‹Ţ¨]ÓÁÝÁ Ng 19.ţR§[úy˘É!@Đ;LĽš)ĺ9nŮâu$BVěÁ-[eÉŤcœ) 8Śé/[ĆťĆvKJţ´ŕłĽűv†‡T?7†P"béëăx(ëÂŞŁ†O 8ĺŔW?ŘÂe}l’ëŽúÂő¨Ý!5zťŮËőÇ ĄÁ—Âř IWZŽ÷=n*W‘Œh8˙â ă…JšâDˇžb0ie•˛Tđý€3Ŕƒ§€s#sŚÁ)–ä<‰Úˇç!Ô6<„IHí>óQůYůó°­'(ßIé\˘eQŠOj% 1!… ŽÔŰńÂ'N}ŞQ*N ĎĚšĚĚŔG‡!Q•Q*Âí´şSM…„5Ůč>a'˝žŒŸĄů‰&6Ž+f ľK3&پߍĄdę,“ƒ\;zę„npވű ŠŻňš0€šçÄo$đQäYjŽÇ˘{ʟuř0~ľĂ›]mŽÉö”"P,t{ś2žďŰ~ Ä’Ť]+óţŠíkJCď„ óţ|ÔN\đŤö\ŮQ7łŽŸ˝Ž6ČţkʟŠƒm"ÂXˆpń†u÷őÚf.6)ćMČčŢśĄ$ÍJ‹ĚĂőŁŰŽíI˘p7 ›™-”Á€6ň=F÷•T úœŢ\ˢéÚéľÓ0€+ž­PŠ~1ĆÄ]÷žt˝ŕ•.i!ĘĽuŰǒ/YÍŐŽŽkϜ„I—ťNzÝŚőGx!C.NşŢůÔۊ5(9ëĘžVPEŚůšĘô~(şAǰDůbpÇ}˛RdT4/U‹|­`iőĂŘP†Čřúy§‹œ+€mÓ˜ŹBッ7Í%y‚˘ř ÷ÔŹcďmŒˆGÔîZŮA‘BĐ~äĄĐ(ˇ” s3y11ŹÖó&M”0—ˇá9CdÓ,ĎDzŮ\Q7ťöž>žŔÉh˜ŢťcuŁsŕâň*Kô–I 9žÜˆĆ‹ČYÓrz˝%’äćíJć䢫̇{„F*>Âľis[ň٤0…e{<㖘)i¤Ćě ŔłŕŒf"ú+c‹ž&‚gl"ŹŠUş˝â 1v2›>𸗠uÄŢ@ă=zˆíí֍2Źť äÜz4ŁÚ8E˘ţű;ܗökŁ@vő„Tˇj÷S[“ŤÍnԍ<‰â˘ŕ|ˇpŚ“(Vč’~*ŕš&Ÿ3çäŠ3dÔ>,Šaj§Sż;[śWtُMÜZ™śqšŇŻœŹĽhű“kźe]ܝ‰ť€ŁNx˝ă^›N"śţ’ş‚"üĆĽőäŇZ\ęŃ lSŞÍŸčrB-b˛HuФ*ّ[8§{ö"ôVIݟqqRçP]’ř¸łĹŞÂ}áEĐcĄŢh,‘Ik3żóĚ)dęŤáćšBh"$|ÜCŞ6Ą^ŃLôÇČ|Bltů“/ó„œŐĹJ.r㌠ă–ǡŮ÷aşDĆš¸2ť# ÁL’;†&+ƒäZÇf‚ŚůúÝ_É­%žxÖlÖŽĽLÉSŠęK%Ś*Ü(#‚/ٝíě,ĽT:qłëGšő:}(išŽ)‚ —FK!Ď/—Ž\ŁVCmfIĒß8üDáʲΠĘyPŒx 9Ap%G`hĺ.• Ÿ|^|ËĚőtŢź¨VNT˛u˛`Çd+Ďşź.ŒNű‘O>€ْt~î(<“•ٍ“m؍„A>|uĂ#YGJÖ ö\j!¸ýîrŮm˘čž_Á’H4 ćąmÔu­ÔM7ډ%WŞ~Iżˇw@žZrÔĎě<$Ď(qeúú–h[ßÝ,&ŻścßK<ëQV˝J$ZŽˆ ˜Z0ƒg ?jQ#¨Uľ€Ţe“űĺ žv5tŕÇIÔ¨Śł§Ú3 N´Q2ŰD 0ň(ú C˝Ä™4˝žu\ŘY˛^ôž˘YMď0ýwLÉňЈ ÂŔ@y` Ů­ű\HČžź?ü 0jz4ň endstream endobj 501 0 obj << /Type /Page /Parent 760 0 R /Resources 512 0 R /Contents 513 0 R /Annots [ 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 502 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 317 557 334 571 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 503 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 423 508 449 522 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 504 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 453 508 505 522 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 505 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 290 431 316 445 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 506 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 251 368 277 382 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 507 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 447 332 474 346 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 508 0 obj << /Dest [ 428 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 333 248 342 262 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 509 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 359 198 376 212 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 510 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 254 170 271 184 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 511 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 404 121 413 135 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 512 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 513 0 obj << /Length 3410 /Filter /FlateDecode >> stream H‰„WˎܺEśý\xAÓ˛H˝ÜĹŘžžpƒ¸wv‰=­X-5DiĆ7żaAžŕîňŠĽVŤÇ6˜ŚřŹ*ž:uřjˇyšŰiĄÄnżQĘĎó\đçšyŕa¨EĹ~…šŘ7/_ŰX”–Ś–›—ż}PâÁn`nŔFĺf;5Ÿ6ĺoŤB?“ż{:đ•l‹ÓPĂň]7–‡ť˘ŢVňs`ĐĂ)ƒńś üöű˘Ź[o›űš|đ‰ßĆşâƒ+5Ź…_ĽČŚěÚJüZŐCÝľÂűç_w%jąÉ2?ÎCpDůJG" #?‹"–ŚZôfłßźÚý aćç‘ÎĐôMĺčfŔžîNŢ6ăŔCX%{/‚˙5Xř!Ž˙lÔˡ.â‘ÂYť7¸Uš‘ňv˙ZÜؖó04˘C] OŁ,0°œŻr? âɑ,0Љ¤pß`0ĚZ/f”žkŔhš2VÁv˛@lĹ-:Ľq(ËŇ@ţ‘úZqWŇů>R´FN71Ś•œ(SpbźËŕ26’˝žČ(í$>ĎĐRZâé@Ţ*0l ÁE\Sˆ§Îô•čzTăžKs€ĽŞm9Z¸BžźŒ…€ŕaŚV6žXg|ěÜđ•Bô˘ÜŮ$Aî z™Ž9 D×8ÁŤJ—>†ŤˆÜŹC’ä‹3ÙżąIÇBź˝šˇęšŚ@v Ľ°HÂ1˛\Ŕ쏠lŁ1ćžUw˝§•5of…Űő glA÷•ôż>rgăvŸ$ípOŰń˜…‚K\Ę-Ş„7ü乥ŒąŘ’5ÄŽčtĘĆżń"} {Ś’˙‹_DđĹQĺĺaţ‘žĺď†#Âů:ˆRČ Śŕ\i*ś9AŁĺyӘ  † ZÜŹžŻ‡íèѽŚpÇé7•}qNˇ†űÜĎ5r_ÇK,$g,ôÚţŔz `ślY’ŚL› őH~ö€#™Ď‘tP˝˝÷śŔ˙ŇvÍČ­Áˆ÷]Ĺí5§.ťÎý’*}Č[qě*ƒ ůt¨Ë1ÁŽ 6•ŽýzsęúÁ>ËĄ<9ƒÚ.O*îÁdĘëXŽ@نőÔYbř+łłěd"—\ľŐFľF`6;šńńPKđ~5ąpĆ"îšżÁăľGş B[ę’SQ˛.ůl†•éôjšlś|fţO’h_j?üä]ń™jŒ„†.œ™#'ŕýĂÍßyD”‡Ř~6–é%P]ËA@!°"á}@ĺGTńűrĺ?ÇQ§ˆ˝m UŁ.Ś˝šučŘąßóŒ˘4âČ3¨d˛°”Œ‘{¨Ń&8>ňĂ4Ż †4K^(—‘ËK€T¸@< f7Ÿęáś'(wX%]U-ťŽŻj–1P_q„¸ZBŞ~ą´٘Js´Ń@ÁŞŰŽ3¸ ŕ"—âb÷gśBϕ_ťĘß`žFp_[ôćÉô[×cö7&łúÖ`Ä"Ŕjű$FQť(™ éŇXŕš*,JgÂv™ =&_"`äGjń70ÂÇżĘĹ0\RČ#˘ĚžžČ՚AوOÝ"֘Ţ şŻgŻá$+Y´.ą‹š‰ü‡g0˙a nëćÄmd,”CáŚ5Füă˛Q1,P:} v­Ýˆ~×zÇ !ĚÎâVÍ<ٞIÜž#6%#äŔĽš/(ĘŤˆ¤0Í3‚!ˆ7 O8ŹKńˆˇqü­ Ąňź‹.$ěѝ‚ô$wHšJ”EKôí†{^MžŤĚšů2ż(żľK T˘ŹIŤĆ˛/ÇŁ Ö 1%*dŒď2ˆĽîépN(\m1”œś(‹F€ď#ŃHčśp”C|ą˜Śľ §4űޞbąĂ긇ôʤކ œ–pR¨‹ŁaœĹsoÇڧ㽀1Ü&NŔ=ş5ŁYˆ'  ؖĹŮ|Ę¤ŕœ˘ă~qů˜÷^°Čő´EßwO¨•‹U/\č úl]´<4Úřçu áhúUć+˘“EÝť-KĂÔpë?Xu\ŐЌů‚3ôě€çš†I ďř5EtH)ąńř5đ×e烗"ö*óčúKN mŔŽžŚ!J h°Éó83lˇÇř…rŘŚŽBě‰qcN.”)ŔYĚƋ"‚8ޘJ|uóů‡ƒĂăԁ̝λ9Ťşö›˜˘XŔô‹fşÎĎtířő+ŕ'iŽ )¨Ý4ľ…‡)ľí7ú!ŮF­T"nőŽ^ĐݤˇEŠ!´”Fjđ˙Š{^Č;œ…!Žqؖ#âP?¸íܜç6ľX,Ÿ%Ÿk Ôőú`šUؑľyN".IJĺd꣥ńrě‰!řN›ŽuĂXŽ`:ź%‡‚7 'řf¸ŚÂÂc˘9sËš¸ŇčŇ(aĺv)߯‡jżź}ýˇőŤPëD°;‰Cä¨UşÖqÄKJkůEöBxń–ˆăââŘTę›ňsŰ=5ğŹzᧂ Hˇ)_čí{čěŔn'~š­ďdÎŢI}–ÝńX´Â­°IčŢN#żąŽÓëĘCętO2ŠQr˜$Ó݇—ZœúnčĘŽáƒÉĎŞăçƒ<ąÓkňëÎCůîJ—Gяe >T,ƒoŤGWÎFóu×îšR͢Ś/xa!0wˆ9ńžhÝŔƒáߣ˙ÉŽwžÖT”¨Ź nźßťĽš™0ën"N~zXvŤ˘Ż0|€Q°ÁLÂuâşw‰×–Żçňšńž.űÎvűá†\ŮuöPßSÖ@=ńżs ęšKˇo^­áŽÔOăžDřÓ ÄÚc?ÝIźň֎Ä˙TěČ ŹÔ‡oŐÁ,˘‡ź0šŸłűj˘(Hęűq °™˘ojs†{–˙„‚œaď‹„Č {™„9Şâ@¸&< üœ˜3ęcb_űÜóčßüJ2 S­dÖ1€ ÍŹiÚ3şwĂBGŸđü"„é“ŸĆœ"†é@Ë/gY˜6ÉÔŐűšÚí˝ŻŞ˝'°hB¨™“=)ŒáSqţ•H߅Aç<’šžT‰ĆœžęMËĐßx4GëS  VOTCçĚH鈐°C–-ę a€nƒăfľ‰răv/ôuWŻŠoĆšůhZr=ŽŽEťÔÍqŽŰĚgáL ,œňŰBq„8փRr%{yAÁ(ő?˝ź,’§4݀jp˝őLPů{őŽ5Ä(ÚÁŢŇűů–ĂlÉčÄ Ý­ŚČœťÖr|ÓXwŠ˘H§i’u•üȎɬ;‰Ń#vń-šŤ—\ÍqŒrŽěŕ$“ á”R߸ľĘGk2* ;§+…MwzŃ ăAľ3_|ů'Ŕ2čü  endstream endobj 514 0 obj << /Type /Page /Parent 760 0 R /Resources 523 0 R /Contents 524 0 R /Annots [ 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 515 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 236 678 244 692 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 516 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 244 434 297 448 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 517 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 250 378 276 392 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 518 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 479 321 505 335 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 519 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 364 272 391 286 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 520 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 308 236 334 250 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 521 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 301 137 318 151 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 522 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 389 88 406 102 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 523 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 524 0 obj << /Length 3373 /Filter /FlateDecode >> stream H‰ŒWÝÎ۸Eoýź”ŠXőcK—I6ťŘ˘Äw›^Đ2ýY]YDůűşšď$7}‚}͞™ĄdŮF’€EQĂápxćĚĚŰÝęőn—(­vǕÖQY–*ĆĎË8ŠÓ4QŰ,â"-ŐîźzýÎĺŞr,+W­^˙ňQŤ'ˇ‚lCQľZO×ŐoÁÇp­Ó¨ţ“8ŇAkúąĆň]wŠNĚA…ë$~ !ƒ!‰Œ6\o𮦪Űp]Feđjú¤~šÔ™ą´2ÁZ<ľŢč8řhŤŽ=¨÷‡zŹťV…˙Üýmő~ˇŇŞVŤ˘ˆň2ĹAt¤“LeiYŚ`é6Qƒ]Wowßq@ZDe–t~:›.阹đ]ׇëĆá„X a†˙VĹQJ†Óä)¤˙QŒzýł÷xĽŘk÷ŠŞVÁ_ÂÝż÷ŰJů,ÍxS?˘UB^VäahÂţşŒ6p"íœ†ź¸ ŘÝŻČIäć$YHT‘ŕ붌ƒ\Çkh‹X­Ő:TBŸŠbnŁD)őÁ<…´‰ SZÉÉÍŢĂyĺqň;X—E' —QobrÜ|>n.Ç=ŘŚŢŰÁŒśĄŤśrâćIfš÷zŕ씋Ë"u’G›ÍýM=$ÜűLëk™ţ˛§tb"œ}–ůüXI Ć-Q–=Ÿm{iđ}oć$Ú(w2=_Mâ„}礄!ҸńźNgVMĹ$kŞ“÷5!´œžŕäœBţ yĐ(iŇ(Č+_Ő(ó'™ˇĘĂ1g8ć_ŚşŢśľŒ[żąá6P~ąÄ¨ôúşNůĽ†ő OöŐ$ęE&ăpr˝• d…ˇ`›IěiÍţ›ĄTđÜ6XĂ D3–4Éő$ƒ „7ŕ~9ŐpűŕĽn”(îҌ \`ě΀Ůçą÷9 a0űĆŞ/_čY8ŰőÝ}­SĹĹ,x 韭ńˇŸóíĂ˝âŘv.Kv)btgÓ4đÚ¨ÎFNËĽ‹ ע[ű˘ťŰƒ P‡ęŕRq9:ŇŢۖMQ琢O‘AÖT×ÓąKöÎöŽŔ˙_1Ryv˜É˜‰ĚŁĺ*ásH1Řń,säbĘ?Ô]^Ź–GËěBy}KrUç߇Ô$"\ ŕ P‘̡˛Öľ\šá’^—¤-ŽIőwzŻĺĺLŠ’J zÝ]bËŁôGy-ÍňH7ę…ąz6ÍĹ#U˝Đ™AĄ—†8ďťa$ţšŤ”ůšĚœkň@Ňޔ9zŐÉB‹‘Š'ş4„mÝ:ßŃŕŢŽwtÍrëešâ~ĺÁmœ–ĆŽŽž?u Pz“*žë˜›*šoyl˝Pw”çʘWíĺĺł<ŞěEŃx12ĺ P´Xşˆ4O"xâ]dfĎăĆžß§ŠĎ5 ÷ƒźöňŮtím\׸,Ž>Č i{y~–“Z_ŒӾȏ™Ť˝<=#™YŸź×’h&vŕŮWčsŽ’““nś÷'ZZ/p[/ńćNÝKKůs¸‘Ҍͅî3ç‹ĘŮQpq˛ćˇt: MŢđü÷!cŠÇ‡ƒ|?ˆÎŻ"ŒNŚ[E%śTEEZ9kĹ6uîŃ#Ëys[oŻ]Xㄟ~@Ş{O †{Ôžčńülže<é@d„{O,y%ŕ=ĹĽ@žœ–óHń(rT\Š‚˘î Š8ŐvŁ‘ŚîŐý Ją°^V (źĄt!îgđÄhůAIÇE{ˆjÁˆ&} Év.0ŃŠ=npKŽ;ËäXŸ§ŻˇŮöĄčzŚ:TSQĺËŽEůŠ<9Ą­Œi L+ ˛ÜJ"}‚ěĄo^űr˛-SďW.”r/ěřR'IźłaČ/Ň l„7LŠjaÔ§ŕOÔŠQň)üa;“Üv329ĺćąkZš2_Pż4ByTđˆŠ˙ŁTÉÖ>äsLű|~íDçŚůü…ôÎţÂߤô<ƊďŐR€Ë’i?=××ji.œ°Ś?ýáęęn"-ęqŠÚŁi‹É“ÔŒć×4{M0żďLSďf`Ă\=2­×BňŽÍnű،QN-b˛1a~żëÂ<íCpž]ŸLs%O‰Ôů.­˘lůrš"…Đ8ľ†Yçלů[0ˇ’¨’zżľ­ă°Ž|—Ö›Ş^Tą‚(…ř†ÍpIEÔP”ŽßčěR˝YôéÍžnę1”âçލ7^|čáŠ,ÉɋT™]V_u#ÔÜĽď;ßrQRŠđ6ÎMł^š˙"}aez?ď­’ŽŁ´˛ŻÇݤÖ{6żďäJ§š’;s8Ö}Yä›ŘJjşšhjšÂ$‘6(ÁiçeTäŃV/}tunđËěőJÝFÂ5俑~„č%ô’B–™Č{…†Lśš˝âÔI„ž—Ő˙}ֲݍߚ3@ˇg˘K8šS0%ˇRœL­ ĺ—űsĂu‰ƒ,fŚ˙Ď˝Ľßm9žN¸Í˘Œp{Çčô6wÜ*ţşb—č•ÚJ Ăz¤!ů˜Ú0űPf'Ĺ9!ŰĆ2ł˛ w:…ći­GFAV›(˘k=Ęšô˜˘š“ ĽW \{eÎÉXç>Ęß;ř‹* Ą˙1^-ËmÂPt߯`ŠĚ8Žƒńş“UşČŒťĚ†be̘‡¨ű!É÷܇A‚4é.&ؒÎ=:{(÷Al$ŽS€žGęčF/⇐Ő˙¸ďfU);/fĺŁĂ.–ށG¤čĐWĎb[S‚*_^Ňą‰ýt>ňÜ/Ż\.R„őÚVWP•đéoţ,Ô|1y™Ě‡ŇĎ/wěۜůąUS‚Žvî™ôfŢ8Őťő/Íš,R̊ŚŮ ^U6ďuA\žąüú*l¨ßJçÜđ(cn¤Q4ŢA¤:­ĄzČŰâwŐwrIݒĘá*ë,”Üg{˘†ŕc_×Č (ßHC}ZĐ!ÜšƒŰî­îbi’Aú+$ġ˘j‹óúR-*x>> endobj 526 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 328 615 345 629 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 527 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 355 615 372 629 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 528 0 obj << /Dest [ 428 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 382 615 400 629 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 529 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 473 579 499 593 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 530 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 391 530 408 544 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 531 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 351 453 378 467 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 532 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 254 417 271 431 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 533 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 269 354 286 368 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 534 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 290 354 343 368 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 535 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 417 275 444 289 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 536 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 162 225 176 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 537 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 229 162 281 176 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 538 0 obj << /Dest [ 130 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 438 113 496 127 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 539 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 540 0 obj << /Length 3611 /Filter /FlateDecode >> stream H‰”WێŰ8ĹóäŻŕ#ľh)uL:“`Xl0í‡ ’}`ËtŹ,y%Ů=łż‘üC~sO‘”ŹK_fĐ@[ŠŹ:uęT՛íćŐv+XŔśűMxyž3ö2÷=? KŁŘół0gŰăćŐmł˘ÓË|Ö›WďďöĽŰ`­ďcŁbă—›OüÎqƒĐËřŽđ˝€×ňԗř|ۜ‹ĂšcŽ+|ţ‹ƒ5xéВ^9n‚ßv/‹˛vÜÜËů' WěýšÜ™'ŠžřżA>żSESďŘĎť˛/›š9˙Ţţcóóv°’m˛Ě‹óŽ^ "…‘—EƒĽŠ`­Úě7ośĎf^‰Œü'߂œÜôƒˇÍÉq3ńo˙KXĺ{!NýďQŻŢYÄ#/ÄYۡ´Uąásś˙™Äśĺćľ4҇Ú+:™ B™ÂŘ çš—D:9â’PL¸†ű†@"˜…˜Ź(<{ˇiîó8đ]ěîg>sŮkrJĐŤ,K}ţ#őcěƒüâĐ!Ę éť,aśÇ‹}ńŔđ-{‘k~î ?Ń\Ó~Á lŠ6Ŕ> °˛ŢLGŘ"/ś z# áE$bŸ˙ŤVŹiŮąiť ď5Gź`jÇ:U÷ô>°ď zýAąáŹŔˇ~$^]óĂŃV~hş~ĐŔKŇÉÚôš+Š5łoNbž:Jxi<Ąƒˆ'°ěE+ĺĐ.ÂoĄ  *ӏ-í•E.JĂäĐ`&š˙žüŔŽČž˝A7Öš œ˜‹€ÄWžf#O3ł7ˇS—˛Päŕ śŚHîŚ=˛ŽŃ ĚřQ1Yč´ExdÝ=! Y‹%GŠ1îLŔŢ`ę×~ŘÝţá1K;Wäô ÎÄő#m0q ‰ĂoűيžiŸ"הšöjJ´×ěTż85ƒ@Őä>˛ŢÖvžć…tűűJƒ%ŮQ‡˛VfŔĄ‡faÝXě)ąÖc+lČÔyd‚)eţ)+Ç ÉÍUüŠ~<†3ś>Z/" ęŘA^;‘ä‘éuÇeq`ű˛':c}ےÉ1WÝÉD<ćőŽüω釦R+köX†šÚžŃ‘•"ě•ÖŰŁŹÖŽ$Éԑtt$]:’kGD#“đ#$ř”K‹ˇŇełĺ‡ťW…„ ú:â7+Ł‚xE؉P¤Ŕ´ÓŃŻ?-E°•ŹDzěŽHéô 'řLŒ95e­YŸ†,;ś§ü#Ď jđ_đŤď‚<÷×nSâŻŕüÄ˝ÓMš+Bąô˘:Ńâxź žşëÄŔÚřLƙűŁÔ?•}kîŒßć‰u>öVňŽa0äÍ+äüŕögţ Č űé˙Řöł3"0ˆGŽ…#ý™ţx&ź`Ä@ܖ=xqĽďť.x6ŁP2ڜŒ:ĆĄÖYśŹŮłú|ź×ąĘ82ŽÜĄD•{]ň#n2/ł…=áä*ŞłŹ×ALGţMrB ŚźďšęŒćkVłB/̧=Ę ¨Ă†ž'ŚĺVóˆwş[n%ÂçĹł1НŠő3"§´ÚpCîŃź-â=–2_—2Źh“ĄÁD„ď”Zš{~4q ŸkřG$[Óęđ-€ˆ˝YÄEŽëŹ\‚„‰ŚßˆńaţMwnEŘ2ŞÁp]đDÓG˛G:B}> ÍňÄgg^ńŔęd?ݙeP[ˇTţ÷ůáđ慺vfžĎˇ@˙ŰmĽdkrkŰ őî;*DmĹű_ďH5ŘŠmúŚh*xL›†62 -*…4ľĆ ÚŞtVžČĄoˇÍńžů~5¤IŸÂĄ^Ż?ËŞ˛ycӈ;ÔĄŰíJśľ)D‰f׾jůĹnxľßÉI˝Ł6rű÷§:[¤ˆşaZăQ3Aó l‘˙O§ĘS‹atĺčišô4bŞMgŠ(únŐτžŸźÔ8ÉIˆ:ÝńƒE€ś‚űÝŠŹÔ/¨˛„|GÉ, ˆEsŒčŃ=zFa>q›ąłu’˘B…§ĽŠÖě{UĽ1Ąý ŕJrťƒ<čŞüި\Řβm›}šm\eF;oPŃŠŸˆą4/˜'˝şźîí+j]đSQ_ߊ  -šŚG0ě`(Ř%uŚ` ę4Šš˝Ă!1˙ݲĐ>4Sša% @ěhž7ťGmßSŤ×fҋ9yFՅHdČj7l†ăĆŁGćyŰŘ+kőäĎY¨ ĂLVJUTeńŐt(‘iőĄßŽ p˙ÎîĎ˝U™žą*€Ó ŸoQ&˘nuŕík+íŻWÔËÂgŠG* #íZŽşŇ¤“î‘Qł*öPś˜XR#ŒŠ&Űś4ƒ[Çv˛—ěžě;¤v˙ l˙ɇĚ|´ď`Ďl´›v[ş‰#6&Œ/łI÷éBí Ԙü™É‚zÍHĎgKąđ˘t˘šżœŘšD /Ógćn"=ŸŠv-ës2 ĺŠdÂÝ|ĺţŹł ƞ#×*M%…˛Ć`颲čAHÓV˜Š—íävŚ .a@ˇŻťXí›)ěs<ĢĹh~ěpˆJŐwÔˇ5GŒ• n˜,l˝b(A9ż*żšVF&Ayޒ*%üC3 ‰śž ľç7&őNĐůAQÚ {bČÝ}yVƒŔT•;-‹ú $lź˛yLřŐHbŇ'5éE­:S.ßŃ$ó0Pĺ P䞝Ş3Í,ľ}˘-‚˘5DS”Ď˜ĆSSĽ˝×Şl_˛şéúu‘čOúćĽehšşąë¸aď˘\i;ň ćgň€Î2u]Wpš/ŒOî"Ůř[Uő˛[ňež? I‰Ÿ==$•ěÎv$"00(ՓŃH÷wXŕOWúRň]'›č:źFćřÖĚv•ěˋšDۢǞyJ‚žtíöĘč€qßĘŞFFPĄC×ĂmK‡@(aŠ.Ý)iő=VżkJbłŽxIKľßďíˇôäŤyTŃuߍqc ÉťAÎ -étfŇĆ˙4 ^ľQ㘌cFĹö)?PǂŹÔ7;ǧ„.mXŽR?5 œjÇtăĄÚďÍ]e^ R€J6Áî Ţ $ʼnŇŔdbd2äޛŞ2ô÷Ă śt)6n6PzŞ $ťŘ7R?kK;xܛ3*e;šos€Qń×N3ÓV~üîÔZ°SŞÇ;˘ęP>,.ĐQ˜ĎZâŠqҌ@Ę ™s*ŰÖGÁż(Vę™L|ĄŰ(ş9˜OW…Łâš)‡)W‚c3Ÿ0›äŇ\É>ŘzĂJOy7 ç吅`ý`ŐÂ[ŮÄŽ–)˝sˆąŢ]o̜Ş-yw-žŃŸŔĘůixČż)Ěg€Ťě„píeg‰{Q-=uá™öČfńrÔ˧2ŠžH-etŢÜ­ËŽmî~qŔđÜdB`š2ĚwšĘ9F´FŸťŽňü§ú@Ž„œŞÄš™‡ËÉÎSmÓ7ESu7s;#ϟڹä+űff§˙^6KjQŢç)Xb•Rƒ 5ŤT™E6“Yd—lTP)śŔ)ç9RóŔ9÷§۟Y!Đ´Đ}ď9ߥşŰ@ÖȁąĐš0ˇ­^ôkš{ŐJĐg.4\)…uA‚|2Ú֓4¨b ˘Ąž"ďÇ76Ĺԃžcůyś­QI¨oĂ.¨ćÎr=âJ‰žKqě:-٧żüů:[<öX‡QĽféjŕÍÔkĄ9„óC?i6!&#ŒœHRj”!;†Čä?BĽćăžßçŒáži˜<č;Ÿł’ĽE‹ř„‰#4xR´Yä’ĺĆŹÚÜW˘úÝr'#>0ĹÂťřKe&ţ^\ŇŹŘśýuçQďĐŘ?87=ƒ K?Ż=9\BBÁý(gP,:ÔeSθ%—dX!5/˝Ę™ÜZŸň ܆”YLÎĹďe–‡î ŠŠŢ–+Ģáxf™3Ńo䑼ôCN)úŃUů/ŤB‹.Jýa?aăO}‡FŻúĘ‡v-$Uo^ľUŢ5l×Ô+şŁŇßFčLjăiĽi}DŹĘŃĎľN˛Ů# uîÍĺű„˝d†*™’Ű˜ˆ™‡Ięw“gč$ń&˜Â‹šúi/`‡ţ} ŽzʋĘӜ°4gÁw˛]ň÷_-@3ô˂'OÄEr¸&Ď4H“Żş;ęXanÎͧ'ĺ™20cN a%Ł”6—ďz}@ ΋-–/W\ęXăL;<Ěď7N†^źĂ‡P‘!ZôĆȡfVŹô˙Ľüţ ÂĂâ@ś(žŒK0c\Č źk…Î‡‰×ćt2ľ7ŚĐ݄O™T&žű˘`k“żW…ĺZŽ"ż…‹ŇLÂfÇŠŒF˘5ÚŢ ODóFqI[”ÇP2áeĐ)ź§z ă]éM‚ů5éŹ]ҧ˙wBuěŘ úřÉqœ(0]žĄ+АË ƒ4fÖŻ_Öf:çhlćú”Š %Ű’ěI ™­H§\SÚš[yK$źé6mŃ™ę őĹE’ř"šőLŇCÉy_Ř$yäՎücU˘°—‚ œ8Ÿý;˘ěpá?gŒƒ ­dn´ćéł÷špÁ„ŘÂz‡]_ÉQ…NkĹrZ :ľŽD˜1 ŠŹ)u$ǙŁéJîTëÓ?~ű/ŔŒŤé endstream endobj 541 0 obj << /Type /Page /Parent 761 0 R /Resources 552 0 R /Contents 553 0 R /Annots [ 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 542 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 636 234 650 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 543 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 245 482 271 496 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 544 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 275 482 334 496 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 545 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 405 234 419 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 546 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 370 356 387 370 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 547 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 365 306 382 320 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 548 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 392 271 418 285 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 549 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 453 207 479 221 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 550 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 399 131 425 145 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 551 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 435 131 461 145 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 552 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 553 0 obj << /Length 3416 /Filter /FlateDecode >> stream H‰”WَŰČE€<é+ę‘ Z4Ť¸#Oži10ÜB6YjUL‘ —Ö8ż‘źä ü›šKqŮś3h EkšËšçžúá°{u8(!ĹḓŇ˲Lřđg3ßóƒ@‰$ŒlTěöăău÷Áyp÷2đR糍|O:u~é ,?4Cqz——ÂÝ+ßůم9đŃĹ)˝v÷1üśÇź0ľťĎźĚyr%~oSňˆĆ• ÖÂŻ”ąô]4u)ޔŚ7M-Üżţ˛{sŘIaÄ.M˝( ŔéIŠ0˝4 Xš(ŃęÝq÷ĂáR/ UŠţŁo2C7}vđÇćâîS0<„UNë†đ߀Už á8xrńĎF˝úÉF<ô8ëp[;çîá‹|€m怆t¨}“…Â( Œ0ěçË̋!ˆxrčäĹŘĄpßa0ĚJ-fž}€ŻIć;‘ô÷°ťŸúb/^ŁS ?Ľiâ;_O !ŢĺO.˘Ý׼j łp¤źČW˙w€e–zž b~ć)?&ˆů‹č6ľCmzŃĹšÁÄzBźŽEţŘ5ŐĐk؛0ă0"â‹űw„š ý qśxĘëNô§Ü&|,D}Œi<#7ćŁsH$řXĐĎ  Ű!Âdč8g=%+Ĺi´c41‡ßŘSęń $<…ĐśËČĽůˆ­ÉÉéýĽmĘĄ°0ϐQÁT‘2ÇOžN˙sĐuĄEƒ¤ä%Îę xbLĹ'Ýť{„f'ާqRa…0č;Ŕ7?ZđU„óÇ5IÄrA–™ěL§„Ň’q[őűweZ_˛úŻâ™Â% ‰S şyY20‡‹čĘńˆ ňŒhJQ݅óŢélĹGç dĚ >şÂړ˛=ű WŰL~FĘ÷-đэĺʃ\,â‘NńH-i6˘Ôw'-ň˛@8Š ĺ1)vt×üRŰŃ'—¸ĐâN“žÍQä…Ë@m ęÜXX ÔĎĐ÷M=îa-Žź YçĚĚĄ•š Ş{ŸĹ@Ą7es­Ç° Â™ÎŘ5Y˘xÇëÉT8ôŮP•¤¸Ľ†â0u?”ú™K ŘH{“ˇ_˂?ĄÍg´a>Ä[ÝőCŤoóyé"NŠŹS^)kđĆ:śá”ĘPŸ^Ú\Ą˙߂+”ůsSYĎł— GŮĂ,r>ąĎ/ˇ§@˛oćˆ…c ňćŘTUsŐĽ0gËQg]šź×#1Žd´ćÖ~ä#=fŮ÷”ZeYNY–6Ž­†đŢ™#¸­[ŹHěŔCȉ`Z7€ÂâwLśřŤą_ŻŽt´-ĺœK@9 ,nĹȄş˜LÁú;lyŠĄtŰZVĐř@¤ ű'ű‘ĚˆZéTřRu˘2Ÿ *ŰĂcE=†÷$yŔoq˘ƒ:˛¤÷(JRšŐ ý›ču]˘Ö¨9Zűe¸üČÝȁ‚#•?đ?k Lä˙˝,pŇőmóI˙yĚ$YŔj>ß"Ľ?Íöć”zwę”ünLˆÚôđŠćg;žá"ßKÓ­`AźFŮçűS^7Ľy#C‰{÷*öš†ŰŚáĄťŘކxŤˆ˛ľÝY3°Zë–çAőŘ'cEší~‚g#> Ó\TĄ¸)QuŔžů´źˇť@űYŰą‰ˆř`N†͊/božMke{ϛ yő5Ň—° Ŕ “w6” źÖ•ëS}|xŐ;%Ž[/UK@’'rΚU- e抪ŕDvÓrŰ,dËBŕž;ľ_â /iˆŹŘŠř'§˙ˇz.AcđŽ'~­ůľˇŻÖ`ڈ¤phĽplwç •á)}'ř?6´ŮyŢíÂ痂{Ţqţő 4ÇOƒË˛¨hsqâR…x‘ŕˆ˝đNüäFzn~,0cÖŹ¨ă‰­T{~• Ş”¤\Ë1ŰAˇkzHočdCç˛(ƒKîkq1uĺŮOŠ‘;Ć?Xw]s쯖Đ[RߗŚîĚc5B Ů\,ǡ9u}Ü÷dI>wŃűśźÂb|ą…c7^axĂń¨ĐJĐÚúd‰8'ĆŻŽhť-zi›Á œ9ś \WΞŇĎşbg¸řyËvS-}ŠÓ;čf ˆ%–ě­&ŻĆŽĆom^AťQÁÜ×n5öBm¨raŮ ĆůščúŠW–y[ž$“xŤF™8pWCœÝR ăͲ°Â5ŹĆÁŸÚúĺR°™…bE1ö‹=˜lČh#aR „’›KÁOr đ˝ëőůŽîcTnEŒ.`4ŽŐůĽ7EůƛÝă(‰\#ă}a*ŕő!öâď_Xc~pîđ6(÷ë¸.ƒMˆćkBń5áß÷ÔfbQ<č^ź×yIÁľ^EÎŔźç;ŻFł޿\)źNöMŃTŕڃn ĐóBxG67ëúšdŹ\VÜł™ â†úšžľgÚIuq˙đž;Q tŮcwƒŃŰŮĽąŻGb *­î9—Ą˝4žĂŽ´•Ě+~Ľô\Şá‰„ĆĽĘ?‹ľÎČä˘ýZ.6%Zv4…qě _LÍô —€x.’™|1ßśžî@œŕË&鞔ßÍ{ž÷ƒnĎŚ†Ä˝×ˆ'¤%úaşÂÝČYăŔ’kš}—\ˆ‘|UC0°J/, ’ëgž7ÎűĂŚ0Dž'JšIŸJŕÜŰâű°Ŕe¤ÜŤĽű:Jőqťď$oÓ$'ö‘–}޸{–Ă¤Łř%oŸHřĽČÜ8Ř­{~°žżMÝ&V%Š R€_ĐOÓ´đ+Á{R×é IšU™łéQÍ_ŃE@-˝×.ž~?ťŠ>ôăöĽy6%f‹vƒ}jěf™ÝˇƒIW˝Üh^ž.6h›ö›N!w6ŐżšZßÖˆâ›2iUߊx@Ł8aĆ˜6;„mmo”Ź3?:ćÄů‚ cËĹ.TšNĆe ŠŕćzuľşLůG~0‚ĆäŁŢÀˆB›0€ŤÍC@Ű廬űR1N×ŃyP´é"ÓLDŢW¤‘iťňw$t´BGWĄďÇ(Î/E#•číËŤm:ŽűÁFŃEĽ¤čœAȊé~ԞK#BŞfć‘ëƒěV˝%ߓ[*䀰\hŽŤŕĘóxšńx”ç%9ů'LÚ1ŽbUɅp€Îƒî|ŢÓ9ăxF‹á=EDˇoč7eÂ.›ş†{ue˘(ԙüš[yźXÉĎĂ\Ô_J;܀ßRş†d‡U]jÔ`q3¨ÖXŤŰ’q4WíŃ/-Z(ŘNP%efíDm”xŃđi$ĂĆžŽŕC(äZÉČg¨Ô‚ś÷M.¨(\N‡B 9œăÎJ:§Éüđ.žKŮMđÓu¤á~ÜŕąL– źyCV|ýŒĐeŒÇ‹v"™ú“Ě.G‡°ýŰ=%•jR)'Ő[qb$~ÖÚ-äŕÔŠŚSC=ľ,Iü‰÷˙¸ (QŃ#sđţĆúęŔ†ˆ$s}ÁTř8›ä%(ŇgŚFM/Ԍz—zÍűÔꥎTgşA8ĐÓ"ɄĽ­C’+Ś<ˆBŞˇ;ˇŞÎlZükŰtuŕ‚arż†Ô¨Ąş&Ź“üâáŁKœ§tŸ"0tyúŅJŇB őatćYçŃJNĘĘˆ/róYˆ¤–)…ů°ŢÓĐ\ŞÎ^ąĹřČřzMSݟăŤIěˆ[¨,Ť1MOîEĚFĚڕÄŠí đoîŠFŠ ń D@ŐŐâťáđ§ď4ĐÔřƒ§(Ń˝Ŕ>yVň‡gČ,QXĹç˙tœ|x endstream endobj 554 0 obj << /Type /Page /Parent 761 0 R /Resources 564 0 R /Contents 565 0 R /Annots [ 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 555 0 obj << /Dest [ 466 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 283 615 300 629 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 556 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 422 516 448 530 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 557 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 308 425 334 439 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 558 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 344 425 370 439 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 559 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 431 390 448 404 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 560 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 299 234 313 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 561 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 244 299 261 313 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 562 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 422 173 448 187 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 563 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 123 234 137 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 564 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 565 0 obj << /Length 3536 /Filter /FlateDecode >> stream H‰ŒW˒Ű6­Ůę+°§Z4ž++Çq\™•kZ‹™JfÁ&Ąc’Pdw’Ď˜äň›s EIŽ=ŐU- ŕ>Î9řö°{s8hĄÄá¸S*,ËRDđç›eFqŹEž¤aTÄĽ8ôť7ď\*jGÓ"áęݛJ<ť̍"0TďöKóu÷Ł| ö* ůk ŁPÉĄ:O-,?Řš>}Źěu$` 8e2Á>ƒßńXŐíě˰”ρÂ!ńanî1¸RĂZřU*S‘|4ľńži§Ö"řĎáť÷‡­ŘE˜–1\D…J'"‰“°H'ÍľÍî¸űöđÄEX&şŔűăÝT‰×Œř‚ďě9Řp8¸!Ź’cŔ˙N…1;OţŸřPož÷OÂö:|‡Śęü[přy8[ÉĂěЄ6ő-ÜYhô˛@ƒ%Ř_•aNĝYĄ3Iî~@'Ą›ľŢ̨C߀ѼŒdŞ˘=XŠHěĹ[ź”ĆĄ˘Č#ůgj!ÄÇę9ŔMLăş"^Ýě=œę0ô˙í`Ua¤Hą¨ u”•Ť‹/™¤|&ĄcěŒîus7…BN­î\Q5}qß~‡´9w˜$ĐŞ(HĐsÂë-ł^,ŻŻítގäŃ ˇ…é¸Áó&°† JÚĄőŤžóŇÖţěđ&ĚN/Tk ýÍԂ¨.Eáđj–cÖˇCۡAćň7ŒhLžĎĽ˜NFŒ­ű$ěQźüN4­ç3Śţď{řťß/]÷KyżĆ¸ă˜b*DđC—Ă… zplw˛s׈şňÝć8wčA ”eŠäĂm×ŮWĚ@@>ř1_ă˙ĺ9#”%ĺY*űŢ M…GtbŠĐő”ÚŸRa O‰',čL…´óĐ´œˇÚˆ ŠëépP×LÂ/5ŁňľPĺ“ůÍt׌ŻgGńę¨ŘWzŠ.žŇŽšÂuςěU* qĄK**6ń=xWĺčă\6Ëâż8Aąž đ'€äQ$ߢŞ1€;˘Ś&¤›,%Ă Šo?"äŤkřőÔB‚Q4Ӂ‘ѧf–émvŢ9ĄŽvěŤíVŐůÜľ5wUOvžÄąžÍH1yš=öM“ĺS6Ţ7W•Ű+@ţ˙$˙ř)>d‹ˇKrľş„xľŁźËžJtv!ű ’66¸ŕ§Ľ ~)¸ĆÔ8c˛ăM@ň°Č6‰˝ő˘Œ—€@˛c1s—|¨ń6˜é& 0jžĘjŘ5źŮ6 uşĽ‚Ű[C8Ëä’dt´ gâuÖ^ŰMâ˝+ŕsxžŮ"F$Ž–Ő*žŕkźŚZŐjâŮ)Ň1˙Œýtbň߲MČ w¤/ 8űŃ ść’—Mü#ÎÜÉSoSÂrüďV6Y‚çw:“U)çmů=§2,%0Ň´`˛l@°y^ÝĚŰ]ŔĎńŸä4RżÎ˝ŕľĐ/ćxÄtť5}ísoهeyńďä`[ŕ”äVۤJśC惁•tŚBĘi˙9×F¸ŢZ¨˜Qô닸pt8TQ—Ű‘őň˘ĎĘĽş‘˝r‰řWœ‰Är¸âKE؆ĺ Ćmvpęč&s?NjMA)LŐÖ0)¸%"ŞŚEÓŠw`keĺ@,3ˆŮa+ů‰ˇť‘|ő[NŽ~űäl7OÜŇń/ň⿗bZ"ň1_‹ Ő֎Ŕ.ŐdÜu”’ľdV!RŻę„˘Č(Î#ë?SC˜Ĺ+ ë%§áěqz­–I^oU•_Ĺ߅­sfë˜Ů:ĽŹŔ@ő@Ó ;ˆ~sT1î„H]=Ÿ;ĎaˌގĆ38rD?ă¤őřę0ýr(|CzĺIŮ@4ôźĐ2ŕ-ŕނć˝ĘX*ůŕĹ+IÖ޺鯼/ŞÓÍCĂ÷Äň%Ź˘ąßí˛d+kGDřDţÁˇŸaŁ'ŕją”jÔň˘†űéţżÓŰo˝˙~ôűüÁ‹!~ž|îˆ ód##8 ćśšŁŸ$Ůd6˝h~Oz‹VD‰ŻnŮň^°îÜ4 2)ÇąčëÔ €WHĄ í ˆG-ŻĹŤŁ—•˘\t.öaš˜D{œĄŰVr9TšĘ’FRWUŽś’€ĺ‹/™’J:^a ƒÚ~‰É—ą7Íň-đ“ úî1Šő *]_(¤–5’ĺ{ zZQžěc‘IIźG„Äď*pÖ|{Öľ„#ľćŠÖĺŠřřřF“úçă^Ç$‹lmíŸ@E"ČĂłnĽ˜wJJŽ–đ8fÎÍě°¨Ťn˙ÔN|qĐńWCůűqʘ¤‚uŕ+ÖľÎc@ŠéyřHÄş­›ŞȡDSMś€şń"w/ĂH^~ťÉžŻă I’îľľ‹.ŻąUöIŘűÖJ”}1[$ů!ĐČjx5vPoËŕ‡GS›–UË š)G!vˆĆL^ý~—ĐK‰',˜*^G|÷Ňşgxŕ˝Tϙ{$bo:ßaĎŕtnúžž"Ž{I6€ZŹÂĺÚdľLźđ÷ü1Vƒë[GUj0ń8U/Ť„Œ=YÖŐěLCޜH°Ą‚…ČYČ?żäÁíňŠł‹Ş! T=ĆôÄLf˜ěL†ůd ÁkH_¸Ű1S–Ť†vŮΚőŸ>â•ĚŤ—ŰP f×N¸)¤PxĄÎJ@”áÄť&ľćMşßŕC(9Ąă ŒsI#otÜćŃĘHľßBŞď8‹ä[q$ #X€zFDOˆR¸!2äBë=G_'r× u:úúxţ™°ŽŰÜ?ĄŚĂ† Đź˙îlŘVKÍ%÷w‚{-Ůé{î]P!E řšo7 Ѱ7ˆëţÜQ/bœR*cĺĚ7áí<ÝĄČěů ˇ>ç ˘Su˙Çx•ě¸ Ń{ž‚#–l4€[9%Q¤‘rĚsAŔŘ(Ř Ć6Éw$œWKłz<šŘĐ4MuuŐ[ŇĂzŠ!p˝Á qëŚč=¸}k;BşĚÔULĺW€/^Í3ÁGěŠör5¨Äť•ŐKAžgáL?>fIÔ_ ódőŠšRK"… šI"šéşßÜ58)[éź^ęlÝbX7V‘N^ŔYź¨Hf˛ßęX4eUí45J‘Hœ ƒ.Śá[™ÉŰB™ů‡˙ޤ÷.đW†KĽLYďźâeĘÓIŢĘK'df¨Ś›ŠŢ'8Čx´>Ÿem™”-ßËeń Tř˝´ľ~ŚaĆ;@\ó‘?śÇ~é×ätżŢVڜȏjh% ŸöĘVcYÝĐť9JĹ}űüeNŠűčąłPŢ8+Ě‰'K[Ú…}çé<´Ä ’Q/ě‡ČHňĚCë{t`}Č!}÷šdPČ˛ Ś+‘TžŤŃD "běœŠ5éë^Š<YI•ÓC#â*q[Ń@@ŃܔˇÂŽĐäő z˛Hú؉ ŞŢ›Rˆ<°¸ÔďFňݐż+Ą§NlŞ2K˛á".]jЉő‰ušwOćÎp"ŹJ ŞAƒ(ÂůŽŐW>]v"kSlލ#ö–„{Oť1¸„ýnĂAÖư@ŸdżšŘĕMPKAk@eFr.!KN$×\{ž9GxĽ–{eĚT°LJů°Ş­ÓÉ)Eîĺ8ąŠ­ţÝ/4\q “ź*~Š”&%ĚXÉą^Ô4¸l™Ži.Ó.8ÄŚěÔŹÔ6ąi¨Ç"×V–ŰÄJýQ7^N?z~< G"wŚ!!˝qĘZӚüłž—Ô´oœjÚjŠŸĐšł>šŠi)ć7Ő›äçšFůÂËF ŸtTu=¨UçIJĆdôRÎöę5| … Sędw^}u@˙ŇěXʕ¨ö-ŤvöCšTâ1(KćYC mč9Ś^d$•:ť|ś"YsÔ5mÉ}’`­äŢ@!‘‹Ä¤œáícŇî]Ű×Ô]a ĐŻnŐ2j­+ÎĎÓ;ÇAĆ7 e™ÇgÓ°-6ąy!â–(ŰÉk˜Ôs}y!ťÚüD+_Žőőš˛„œOáh-°8ƒŕŤŠOÜăŇekHB Š”dzPܤ"÷4ÂßüúňáŸm endstream endobj 566 0 obj << /Type /Page /Parent 761 0 R /Resources 578 0 R /Contents 579 0 R /Annots [ 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 567 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 493 637 511 651 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 568 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 257 574 274 588 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 569 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 524 234 538 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 570 0 obj << /Dest [ 318 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 244 524 270 538 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 571 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 266 461 292 475 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 572 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 482 440 508 454 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 573 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 236 360 262 374 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 574 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 467 311 484 325 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 575 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 326 275 352 289 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 576 0 obj << /Dest [ 213 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 478 239 495 253 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 577 0 obj << /Dest [ 213 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 479 163 496 177 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 578 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 579 0 obj << /Length 3417 /Filter /FlateDecode >> stream H‰œWےŰĆ­źň+ćqZBŔŕţ(ɊăŘJT%ć%v°¸DD î–üśŤň ú͜î€ °^;)U­ˆÁ`ڧçœÓ§ßě6Żv;Ł|ľŰo|ßͲLyřgfžëQIš^djwÚźzŰGŞčyš§úbóę돞zč7˜ëyX¨ŘlǟO›ďőGgënŞ?;Ćs}ÝäçĄĆçťöR>äĽrśĆÓß8˜ƒ—M*gă˙nŸuăl37ÓŽOŻÔחş”‘Šž4ř˙ű~ě{úcU´MŠŢ•őPˇrţšűËćÝnăŤZmŇԍ˛ń]߄* B7 C…HŁşjłßźŮ˝€ ułĐ¤t~:›ŸŃ1=9ŕŰöělS‡â+Ý9!ţֈĘs œý$¨W˛Ý{힢ĽŠţƒłű×ě>[&Ż%Ą!ojŃÎĘP–e+a?sc$‘vuNYŒ5§űŽ’Di6f6ŁpíźM2OGžˇĹę^ꊭzM‡2ô*MOI\Ł”ú?8´Iĺô]NiśŽŒyćw'ŘĎR×3! ćeŽńâlLą—]‘”Éq› ™M´ü-•L÷*秆ŸÔ;F‹Żeđž2_ü_Ëc§ÓřO—ľÔĐŞ{;yčpžLĎďOő0Ô “ĎňNVý$ëČÇ’ŠŰč]ĽţÜ[Î ŕEÓ]úţx—žĽÉůxyxpRB]fkyTšúXuu~TĽŻƒm뢒[•y2ÚÜĚéňă, źÚSkgtŸ$§ęńö›;u>VyσDłŚ*šĺÝĺj˘ëŐDýpČuŔiĺHQ¤…ş‘śŞî-úw;ß„ăîÓ˜PűÝňŔwM:çA:ń ľ<čŔüÓŠjĘŞTű–AęN}řřĘ܁ÎŔjĘâj;őú+wŹß81CœÂBŹAź¸&/žśŠeŤ˛˘ź÷˙šgJu‘_úJɖąŢ#ƒ`Ĺp°7SV}M| é^h‚j÷xkgW zՌ m×ßŮ7łTŇÇucÇĺqşŒďą}`cÂ*)(EӓöMœIśN4ôTwUO0çŕNů'Ž`Če‚Ŕ}ŰA˜j4¤Îíĺ+ŇU§úËů|´ëłŕZ–ăĹďŚŘ~E˛žuqP6oZ!é/ÇAՍ*󓕭™AȔSԌQšxœęÇO˝Ş$šÍŸĘËĄk(0ţƒţyüÁ™ŕ— Žś]wjˆŃ$3U˙Ś9Ô÷ V %'řăÇ”84ĺDčąî!+QęqiŁ\ń-ř‚ ÂĽ:wíĐ-ÉpY0Ï]ϮϋW~Ú~E8y!ÍůŽé@ő ťÉçăf ™}oćՍ“ ôbše"˘y kŮŚŰ;‹žŠ@>˛žV3mĺ¨Dy…‹° T#ńÝŠK‘*LĽáłC„’Ţ_îűşŹóŽĂ6v:ÂěO“e-ŠŚľmŃ=ŐE×"ő¨G˝T ˆŞˇHě‰51ᲀŔŞš°ŞFŹŞ0(||)BŠfĽ)ŇϤ™ó—<—´œ-Ӓfךţ äŁ8ÖÍPąO&Vů(œ!łÄ Mhő!cfďŁ,7]ŚeQb4ˆZŕĆw @"~ Š“ě‡f†ÄďęýŕЅÓ^Vü•7˙;2<†:„Ť÷ò|SÚ÷‹Aë:1§*op=|…)_ĄŃŸ(˘ěĆ^`‘”ä=UŇŘNëäUŐŘZŰ;?X’ËFOČ+}ÂPôaeť’Dĺ p%Z$}eÁ(ŚţB–`ł5ňëlŠđtŠzk>Ř0ňk´€MŤŽ-…M ÔV°ĘYT‡ŞëŻlľ3šâ*‘0ö\Dj:k¤EôMÇŁ?ńß^źţš#ĽŽěŁü&y†Ł—Ů|-WF]đ™KH Ż5"Ňëňm¨í™`ŽŽŮXňţC=Â|H ¨>^Öe5Kft ŻeulţölsHŻ>{é]đł}˛’nÖqaÇ+=ˇĄ˝@6ˆ*D3/š­ž2×™?´Çň–ď ÚK]˙ŕHe b>CHĘVşđbé5céHMxeňwę­Ą‘#j4ňO´Ąq:Ş7őŇŹ%.8zMćUff͏3OđĘTsŕ\ĚÚĐ1o|ö+ţľ2%óˇUŽ˙÷ Âsݐöńnd×oíÚ˘ 整䎆=[LP^yľŕE Ă51=ĽŠK_˜ć°XÔr3Ncóů>GĹťDœ˘BLńŸ ­+zĐE|hCĚędŘ*ĆNďŁmLÖ ź)ĹŃ,+SŸ•pŸĺ.śU˘YŞWřD% ŻřĹáH'íj:+aăvŮŕÖVËi żç4hž9ÍTüuU>TęD{7p]ËxĄôKżuƒ’÷OvűĎŤŔo]ת‹ŁJGŽëoM=ڜZę=Oí@źČa—ŤsŰ U)€şwŘÓKĽ‰Ľ†[¸ŠjĄFِîśëăŕŔň`Y„f‹ÉuՙŕĹÂ/¸`kÓҖä@2F-Ě\i„ˆˇFK&…nžp?œ˘ĐÇÁ_7*ݒ˜<ćyu¨ŽĽ’dD’ŒHĎm׎Tm­uqœ; wČkëçŕ óŽF˛I˘zɘ/ł“L%c‰FÉ-ÄsbďŤCţXˇÖ1Řr=€DžcÍË4Ĺą”8\Yô|!ů^KĹ4y[ĐBÚÜÄÂ[…$Ѓ—}„ím ÖĆCšŔy˜Ť§œ=4§“z2ľ'yĄNŤť:\`ŠŤ¨k“60oJUňĆ>ƒK4óÔÂÓĺĐŘg‡ŞQŃ3Z¸ÔZPRĄő܆z.ŞQꛯVxňŇßjtÂ8ž” O(Äçśĺp´Ü…|É*ŕŇŹď,ž,Ŝ֜ú_Şîóma‚úż¤@ˆH ZŽŘ•Ś˘čęűŰNm_˙(ú+ƒ|ś×xÍoúËţŸ+uŨ5•LĽE+ü{Ç/dŘ űlůZęâ3ľ‹Ž,ś•Ë–1ő× n ďĺ=ŰŔu ť-ąĎ]¤1†…!?žÁËŠęęb¤zYÝŠža™č …ů=ýy÷>ô?üýľ„śýĺN>˛÷P]sO Š­<*&/Ëx„٤ O´°Š;ď˙âáO”1j .őÇgźlô2”pžś++ś˙#pJqW¨‘&+G4u˛çĄ.ú‘›É3 …ů¸šĘ`ŽRď˘J+[]V1ˇ&kHށa"–ą€çź+ŸAŚ\”­źĂüD‰œČŕD|E şhRŸŚ~FZ×/cLV,ů/ßŐ˛Ű6 ďý m  bËą%ôÜcoůZŚ`Ą’ˆ´ ôë;łťR( í!1)Q\>vfgVlvMˆ“SŤ‰Ő ŐŹqîÍrľĎ&^Q:đˆżĄ–`ö6ĹD­”Ąš§Ćk˛[ŐäÁůěŞß jFs¤rŘל™XYŁŃŸ7Čş-)ž˘Í 4vh‡@`ŮŹ{ö֕Ĺhó:NS‡'ŕ¤ęf#iFőŤČáW•'źö{Š{F†"ÇÁsĽ};ŰëZý@ľx-’Żđ`<§(łG…óŮTŽmçĎ2ˆľččŐŹÚŕzńŒw´äjLťKŇĎ\zöp Ž~›lĄŒ0˘ć°ÁšËńŸý*ć Öx8.l_™Ä˝Çż<9™rç|űRÖÜĹťjć€ÄŤ`܀/?ažźüżEŃŤűĄĂŃ1[}öěP˜$đac˘’\ښrŞJ ś€p(NÉFtÇŞCrÔćÓżÔ?ńNƜ’ęśdž"_ˤIň(‹”ŹŠ>%jXŮđ]9Ş@°ŕ4ĐwđˇĐ5نTňđínô0)íšj².Š<ńś§^aâ ę Ö}˝ĽťŒŞŚĄváFą>óŇś“•vÚâ‚ô=RKČU2Lš8Ay‹<ła *€śäŽ´y&‰Ę&ä# uńş$}oă|â‚7W'•dxiŽ$MwÇMx&;…Ą%ˆz¤R§ ŻUÜ:äő‰A_5ŢϏo­X? endstream endobj 580 0 obj << /Type /Page /Parent 761 0 R /Resources 592 0 R /Contents 593 0 R /Annots [ 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 581 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 389 671 415 685 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 582 0 obj << /Dest [ 305 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 425 671 451 685 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 583 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 274 579 292 593 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 584 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 401 579 427 593 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 585 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 448 503 465 517 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 586 0 obj << /Dest [ 91 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 476 453 493 467 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 587 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 204 440 221 454 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 588 0 obj << /Dest [ 94 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 323 321 340 335 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 589 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 315 222 341 236 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 590 0 obj << /Dest [ 151 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 351 222 377 236 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 591 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 290 118 307 132 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 592 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 593 0 obj << /Length 3417 /Filter /FlateDecode >> stream H‰„WێăĆE^őýŘ F\ŢE"Oťëáą;BÄ·jčĄŘ/3ś?#öKž`3§Şš”(˝`ÔěŽŽŽŽËŠÓ7Űm¤BľÝŻÂĐ/ŠBřsĂ"đƒ8ŽÔ&Iý  ľ=ŽŢźďSUő,¨žZ˝ůú>Tý ˛AEŐj= _Vßë{oĆ~Žö˘Ŕu[ž†ۡvŹ˝ňÖQ żń ƒEDă­3üvű˛Ş[o]ř…~ôBZR_őNf 팰ża˜…ž7•mwęĂŽjŰ*ď?Űż­>lWĄŞŐ*Ďý´ˆq‘ĐŁD%qâçI˘`é&RYíWďśŕ€8÷‹$Ęéţtˇ° krÁ÷öä­s‡b—îź˙kXř1N“ţbԛż:'~Œłś_‘ŞjĽ˙ämźˆl+dYšđĄnD'ŤˆźŹČĂЄóĂÂĎŕD:9Ń%y1Óěî;rš9Š.$*ß °ş)†ÁڃxĂÔOňËćs ů\­JdŹŰ2$çĹçóbŢs:üÜ×ŐďˆÂI.rŠsTűÓÎűë(ńáĚučçŃtNÄ÷‚s=r!<ÂłÍ༈v}˙BŽŐ”.2YąŕáĘѐZ\8ž/;G#f ę­p˛EňvŁOFYW4{ĄŃ.ąŁI uŤ%r/ŐgĄ §šÁäĺPWՏ§“í†^í)QxO'ŻC ?$ˇîšL^\u7琞ZšßkBşˆ3JÇvwG‘˘HPŹNöĹtœi0*"đ%á;oMËĘv5Ę4ěťůWWj_›f‡-! ü ?¤šnĺ,ŢÄn˙쬚Á/pŕ75NţDę#uő‘r}ÄzŮf{$—QĽz掰=f ĎbčvS:rŽf8Xlěl ÷ź3…Ž”u[kXę_ 0!ä Č@~ö^ÂĺL˙ …ĄlĐÂ@Ž*tSyQľ”m=‚ĘX’şă/Â9§ď'‘:§‘殢ʝŰÚił’“JţߊŚËŠ‘§&áëaĄčF•^E˘˜#QČő)X˙źS˙ş'ßýŰ#j˘ž9čf4=˘ĹŸĚnŹ$Üâ-ušdŤ'72ƒęĘÁ•D ľF˝ ná†IF([í•y78SŮăC9ˆCN€A6B°$BĹÚă–‚' "Ó˙pŠsăüˆ/ŘĐwe 3)BšľBĺÖďm# îuať›…}Ż8÷˝bŚ(LĐ:šŢŞ_&äËÉđoťFŇzוüYKűjýßřS)î6Q(,‰œěöQţŃFľŤeĄDEŁzŇ ‡Łb§S^•ĐpˆĂxśc]†Ť€ľ2#{dDŚ‘ăY§8Ž.–&<éĐéjć•.IC75֐?xʒ"rK HęË㉓'aĘČżBü,8f>ߕĄDŤůőuݘ€źŇťo‰Ék͉ę"F&@—VďĽ˝ĘľŻ›Ž´`,›Ů>W$˙هUšăaĽöŚFć`PI1žÇ!Ł&^Tĺi¨Ťž^,8čzŔ ÝŠŤMOÝ!¸ĄëQěÇŃĹëî•R•ú(šXš#Ȏŕe%¸š]ÝźŘѸ“ŸÄ×mé*:ôřŘ9 Z5Ł\ O§NÚž!ö=÷łßógŢה<Žę÷ŮŚ7čČԊ˙Ďyľäś CÁ}OĄĽ¤F$Ër|€Ž›Ew톖X˜,2…$ǰŰwއú5•?˘$ň˝™73Śźé„xkŚŔ 5bh>ďS&P€H&„ޜď÷đ ˙8ŢcŁ˜—1_mć,˜%ź1M #ýĽí˜Ý‰ĚYE°kíYÓT şĄRż] š°Wď’G…ü‚űCmú´ˆKŰyD€ n¸›ěÎŒ˙f.|ŰŠTg-é&ÜaĹuˇěyŮ~jć,xľgţ˘>ËW,Ť˘ĄŃ~^ďL>q/8 Ă6ooËĎŮÄ0)Ťě1ÂČŔ´ůt”!üRĎÓuŔÇ"ÉäŰqËš ĺƟx,­?4%ŮvĐŇs@I-=ɉƶŃŔśmŰ´!\LŽC3ÁľŚŤA#M0ëMo–ő›Ľç’( ŽŃžB"ÜŤg#RŤ‘5¨që<–žîh­˘zbωđΒÓ%šF8ôĺ‰ϕ4¨1’XM'¸ÖěÄ=ő adś]Ü–F˘WMY˘ďţНű]čAÍŃFč2'.*y÷mĚ'‚m_‹mßĹĽŽżX僝ćhaĺRa ëA„ …ÚłpNĘzşT .7ƒ€P„Çj8˝0őƒS+~EN`Ž/AÝkˆvSj˙ú/ŇŠdÜŠ;IrBy3ć1Œ‹ňS(€5#°JĘÔĹőŒ´gţ‘GWö+EwÝ´|jî .…Yg/GBžč÷ťĘ;˝_YzŻoY€˙“™'ú|T'Ť<ń6íy›źÝ&x[‘gËvw˙JFL9;čâ!‹ËÔžëňžÂf!äÉf•t|7Ú. VK1N~1k˛ń¨™ő3HÉö ě85ŽLjě č Ą›dp“ óâgü˝–l—őÝÄ-ÚMĺ,W”X*˜ň€„ČĹÉÖSŁ4íœ^`TĽuý‘vťĄiÖúĘm( bk ‡Ě{W9˙Aš7S!2-â Š!]ŽtkbE^č9\ ’říǗ ąd5{ endstream endobj 594 0 obj << /Type /Page /Parent 761 0 R /Resources 607 0 R /Contents 608 0 R /Annots [ 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 595 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 361 678 388 692 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 596 0 obj << /Dest [ 100 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 370 587 396 601 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 597 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 331 510 348 524 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 598 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 358 510 376 524 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 599 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 399 412 458 426 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 600 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 433 335 459 349 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 601 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 469 335 496 349 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 602 0 obj << /Dest [ 226 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 261 222 269 236 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 603 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 404 187 421 201 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 604 0 obj << /Dest [ 252 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 398 151 415 165 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 605 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 440 116 457 130 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 606 0 obj << /Dest [ 91 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 317 80 334 94 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 607 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 608 0 obj << /Length 3302 /Filter /FlateDecode >> stream H‰ŒW͒›ĘŽlő˝„ÔˆĄPYÍŘ×7I•+Sw´ťÎ‚Ah„@h&ÎkxŢánóˆůÎ9͏Pl§ěAÓÝç˙;ߚߎnˇ[Ł´ÚîWZ{iš*˙ěcę{~‡‘ç'AŞśÇŐíť.RyÇŰ|ŐĺŤŰ_ľzîVŘëű¸(_­‡Ç×ŐďÎŁťÖ—8_]ă{ÚŠłS_âřś9燇l§ÜľńżšŘƒ.mé w˝ÁoťĎň˛v׊—:ĎŽŚOę×sš“•‚NœĹŻÖí;EŢÔ;őËŽěËŚVî?ˇ_ý˛]iUŞU’xQŔíiŞ0˝$ 4j‹Ő~użý‚ÄKC“ýd›NÉL_ |לÜuĺ`!N9­âo ­|/ ĹińŕŇß^”şý`=zdmßÓUůĘů“ťý<‹tKĺł84dĄö‰$+C^VäaÜů:ő6p"IŒź¸qŘÝ7ä$rł1łšgđ5N}'Ňţˇű‰ŻÖꎌ2ô)Ibßů#öŒRę!{vIHát.ٌnśŽŒůć˙v°NĎ7!RĚO=ăoŇÁĹţfʤ˜ŰđlčÔöW†wOŠíaX¤ěűIáAᯔ@G=Ů}™lpy1Ëů­?Ëj…3´üɁ•pWSŻůĄ”őú‹deˆŕŇńO.UŻ­ěęËúŮJëz$Šfń†ěÍg ů ŽFBFSŒă1ƹݴŞěٌ ˆCĐLíK‰fěP`§­kđRge%qMVSŠaăpIÓŠVľd•áŁUźŃËîFąŮëršĹuÎűňĽPÍÓç"ˇÉźýłU=UDőţőŞěŞňĽ¨Ë˘îŐzœ‘95{*…$"‹‚Ë˙€â^řÉľĽ˛Ý&R ë”|•.’bŚ1"đľ†J[SžvežUęţÜ÷M=\e kăĹŃź°6Łć6Ó”|ßšSO|^AíîľěóƒÂKFIĆńmHmD|0yľ+^ĘÜFçőPâDWÔvűNśw¸!oŽÇ `ŚĎDËD0ŁNÖ¸Ž$ Żş„m}ŁAuhşđ(Ve÷&Î=yÂ89ŠĆČS֗OUĄŢÝđQ„bP=™Tżˆę•oz^"Y:'rsEP<­ŠCÖŠţľąŢë išĘžŠŞŘŠogiâ쑥(ť7ĹŽ ŐżŮtLńçĄ÷ŢŰîN§jŠŢ&~¤žŃ7Ýáʍ#"Ź™=ëźPsfǸĆv|>w˝­Ąş° ŕ,Tš*ÝÓĄÍşB};. Ż*ŽT.| mąꡣđÂh[řšKý5œ úě‘HCjk_r›â`{ ŠĘy)[>OM†Ă5ĽoĺžćČ헍ľş™Ő‹n†F”ĺpg(I?/„"hAv1b׆䃘CąĐ;ň‚hŇ[ëIď>;]ŞŁ=“ĚŰŚ˛Ÿ‡Ť|*§I]žĘy.şţÜÝĺUs$ˆĆF,ŰI"ÉِěqĚ ¤G˝ă”t<‚a]Ee9çgÎőËĹěë "/;cşs‚§„áŠëŠcvň î”O"čᕃmüRUÍk' ďÖŘ+{řŃŸ”ý‚ťŽ§s_ŘŰׄ^HĚr'+5ž÷垘Cő&gٚŔóŻ@íŞZYť{ľDĽ-¨S ÜýYĂ7Ź‡Ç[ł(jŠçNí.‰ş(vce~‡“f–UZNŞş“ĺ”y‰Éú˝Š($ÄçÂEfŚÇSĹĽŤÇ“h őPšágŕĘUë‡*“Łvë_ěIőX´$e4Bˆí%–,ňđwg0˛f|ˆŠ˘2¨mßĐşqkްˇĐ[kxl 3€UďS§°qŞÎœecGOÍ­ľ‡­;ôƑ!ÎÄם÷@oC§Â$%ĂĎT7Ą§oţ?îćßixîÔcíąę=ű᪟oćDŮđUĆó7Ć^ĽîŽđ&Ad=ĄŸÎą9wōZ"…?/ÉtŞÉÔöEáý ’"ňE=eüPU7W˛Ă žCdz GTkuĘv7 kqúG˜kÁV„ŰqÖ؄á.Řü fnKšĘXł˛eÍ&ăő‰ő eÔuLH×Ó ÉĎm״˞˛Ń×ţˇOb…$nNěEK¤F cy[ČzfźĚ-ţ(şĚ/mí°Š%UˆŚc˘4ąźÄ45ńęŃž\úĚ4üsŒMĐ|jÚžÍĘ~Ý´D}-ŤˇRx~ŕDD*„'"mÓg{Š˙Š˘}ŰĹ٤GD}řgŠ–€nĐî”ČÍnT×(QaC™ÇÞ/~)ڞ™˛´‰Y°…2ř_5 ąő0ó Nťt gő¤š 2á™ôů÷0HôYe9Ô Žb.ľ~EË")w°ť8bçňBe•IyB"úY Y\°ŃTťśbކpXŁ, m@mĎ7䂮9ĘZ_Ú 4?T•,€ĐĘťh%ë]gˇd—÷Ć?âgL–Ä‹>¸ą+e€cŔRd§q× Ţ׏ŒÖ8łäzœá’j{ş,4ű,cyHĂÄzÍfífĘÜ9 ‰S[â˘ëHĂe]ÄfNšFĐĐÉT~€şčÔœĐ)2şEhĄ–É!Ąfb§Ú-đŔ%’@úš€@*ݲxr jéMÝt:"›ČH”n‚Vh¨žCçě’-˜“č…˙\Čŕ=ŮĂĂ@HYEoüœá>4TžI•§G-§@ŰŔ„Űě‘ S2ršTó%R<ˇÎS$D?tľp”˝óý őd!|Dˇ1˙ÁfľG˙+Zâ@änššŚ¤%wXś,Čbłó ˆß ¤ŠLßWE‡ąv/ȉ$j űŠÉjÎ=š7ćŠ ĂgYwԟ.ĺ_Ç^\ ÖÁŃŞĹËđŹ4|ËŔs$óŘÂA-P”ŕżĂ9úö\ uŮ֝3OrÙç2N&{˛E6]ÚąŒ/hűˇÄęmppMIM“}އĽęY7ŲˎĹ0[đš3¨ŇXď“ĽĄƒŮ’4LŇé†F6yS]UćĐg/ˆH‡ÔĽv‚ ĺŽEhvj/wľÂ#AxçÝAČśŁžŠţŐÖ’â Ÿ‘çĎq 0łŚKd„JSÇ>@;ćmU\PëŔ‘÷ Ódž3“JƒĽŽ ?ááĄézo9AŚs5M0´•§Šł `ŻĹA؜m.‰ŤC#ʍúíqmss) ü‚t.š•˜yÉŤô%ŻŇ“Kť÷÷ޒU şqCpŽFVCi4ŽŹ3f„”‚ÉšşŇ-SłˆŃBŠ>fIľI"ęę'0JFá—ň>OBšF#uúĽÁUx}ŃÖóyˆˇŒĚ5`ćŁë–5ÍwĹSÓ|‘˜Ä`řK:tE;ňF(cwĂÎUbQ=öHŁŕĹ Wq1P‰kĺ‚qâd䈀>¸”Ö%őĄÔia›˝ż„ćŤgvo2M˛Ľ%V 0^CfП‡šˆl[Y@&8 V˝ݯ9ýÔ\PŁGŤ˝ŁB˜’źńşn7ŚK  éˆ ‚k+‚~˛ŔŰŞ…çß‰ËşŽ–ť„őŽ9"x€ŤWutlĹô ­‹,[Äӑ 5ŽYL˛Đ*źšMčËôeú”Đ—} ˘ žŮě‰)žCÚčÍvRšR˙ĘÂŐ3ŚĽ˙ąAHdřáy(ÄŤÉęȒtţkŢŇtźTfi1Řü7čňăäě{°üÇ “űç‡ĹÂفäŻ&_ŮŚ–@؈ cH׏O٪Ț—˝ ŻDCYĄŠٚseT=Ÿĺ2ňĐŘĎJ_@é Źl´ÖŘn ynz/˝ˇœ‰ĘË-¤ŮÎô}ғŽúĐÇOžą,żÖŻŁ]/ <ůúŐDWÍҌ)Ě'Î$č*jp’5^Ś=# IľNYĽh`Ř6śŰEÇŚĘFŽňћfúŽ%á„IÄ`1—Ëżäß&‚ᜠkŸě÷\ÚρJ'†łJ´šŇ䞕,VĹNœ˝2Ü8Îl8ÉŕŘÓciҟA 堇Y÷ ,"č^ĐŔŁM0 ˛ˇŘNŤƒťżź;ů` Q0l endstream endobj 609 0 obj << /Type /Page /Parent 761 0 R /Resources 620 0 R /Contents 621 0 R /Annots [ 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 610 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 341 650 367 664 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 611 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 602 225 616 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 612 0 obj << /Dest [ 242 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 335 447 352 461 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 613 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 484 447 502 461 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 614 0 obj << /Dest [ 434 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 470 434 487 448 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 615 0 obj << /Dest [ 133 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 291 384 317 398 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 616 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 369 285 377 299 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 617 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 411 236 429 250 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 618 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 494 200 511 214 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 619 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 466 137 483 151 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 620 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 621 0 obj << /Length 3273 /Filter /FlateDecode >> stream H‰ŹWËrŰČ­lů˝Č˘‘"! @f%ŰcgR5•Č]œH4EÄ$Ŕ@ą&Ÿűü›9ˇoăAP–6)ťD<Ý÷yΚďÖłťőZ _Źw3ßwÓ4ţŮËÔs˝ P"#×K‚TŹłť÷M$śYć‰f;ťű´ňĹS3ĂZĎĂFŰ٢ťźĚţ)WÎÂÜDţá(Ďőe™ÚŸŻŤóv˙ĺÂY(Oţâ` ^:´¤ŐÎb‰ßz—m‹ŇY¤n*ŸŸ^‰Oç"ç'šžTřżžżô=šŇŰŞĚĹĎyŃU)œ­˙>űy=óE!fIâFiG|×WĄƒĐMÂPŔŇX‰ZĎvłwëW$nŞ„ü'ßü”ÜôŘÁ÷ŐÉY$0â+Y;!ţ°Ęs2œîú۲QwmÄC7ŔYë´Őv&˙äŹ˙=ĘlKů544‡Ú+:Y(О c'œď§îA¤“C™Q—Ň„{NA˘0+5ZąuíŢĆŠ'#ß[`w/ńÄBܓSŠ^%IěÉ﹍„ٓC‡h' ď’¸łp¤ÜČS?0|KŢŹ5/u•ˇ4ľfüöýÎoߖԣ>dmńŹĹŻĺžJ çĐöŃ[şÉr˝¤^bهox˝ŢkąÝg”D>iQ”âT5\EŐN´X°+Ę']‹Âx/­ meޛđŇ"DGáý"–őŽr}fFŻäňTëç˘:7ýÉŽ÷ýŹKşÍâˆ×05+ٌĐ&ád“ˆXĐO݊Ş<ŕeږÄőÖrcŰú/ł!:‹!<ňXŃŠsQV(Z.KßëŞi粼őqß 2Ű4ŐáŒţ˝ŞăŔ Ňq™O÷ó\ö3˝…€ NâĆ/ĺ6p•ĺÖďŁéŰhÎĹFo3 Wë,D`€PđďM(MŇöY'ĹíâDz„Bf?ŹřCŽ[Lré÷•ĺŰĘjt‰Ý‘'gĘ3í’Č–ŽľƒŽ:U]—ć‰ŕ2Nä(—ľŢQó%fi­KűvŤĹgٜť;źŰ ośŘóZPćCś:‘]/|ćťóaŰŞîvDEwUđƒ&ąĺŸë拨j[‚'Ű*Ú ˇ×ŸGÁvTígůĽçŸŃĽÍ6ý"ĽĐ%ŞK5ŇŢU]šÖxĆ0ßËßĎüŰ´NäF”!Vü¤Ě'_„ô~CłG!…Ję•@ßVwJœęŞ­śŐa.2.‹meź´t‚˙´zƒm÷Y+Z}pb˜…řňdĂ0`ÍęJ[…nŒ ž đŁăED@Ź'ţ`ÇpÚb‹îF°C]´P‘ŤŇ)¸D˝÷6ŞľŃöŽhrWWGŘlźŒP8űŞiМš žf‡šbsĐČčJٚMő’{ٙ Pđ¸^š×0˜WW0`=Xşj ń% NeÄű\W‘?•ăQ7ş~&ľ!ő´>Đ÷¸>n"„Ř„ ˘s/6EK•ŽŸĹŽĐ‡\řZco˘S :!i$ŸuţMÜ'ű kʖ…ęv%&ÎŃ8š>4"ˇ1„œZNłvSł˝Ôn0Œd ĘŇ|,Ńg§óćP4{űœŔ=’9âe°l‰ťÔľŐ.ÖýZNwłŻÎđ*ĘV× Ą–ęä5f@59ÁŚđŘđ?z&eŚě›Ü!X0á$ëÍł’)˜HŽGc,5}ú“ÜÂ`TL¤­)Đf 6ü­ľ‚úW֙47YgŁ×żLœSŻĄPőéPŐ9X—§ZPÜeçC+žMPÁ!6=œ5ĹőR’Űížhnş4;†”í„8•†ŻK˜ĎĽúR$IęŠJŇ0śa+ÜŁ2ë;Ťë1ëŐĽx‡ŕĚ ŇUš8Śň`B›š5i“™š%ĺ`.ö|Î%d9˘ˇ5yUéř”ˆCŻěӜžr"9óŰ ÇPůH=,ĽŇąűĺýwfë -/Ź…×yťeăMśý2!É&;öLülš0Ă͘Ť|ŻĐ“V0Â;t;M_0Ć~6ݕeˆ ćýąe’ŠE‡Ď-PJ‘jÚŞÖ]cŽńw2"ɘ^ěŕeXf ˝Ŕ˝pC4ËŔ}5”‡­zꏢmPĚ ÁĚßÍQřřÝ!ř”ŮHRXy„#y“š6k‰VHxĆ@XOM6ĚI綍>ěÄeŻI”_z&Î%hŢ1öÄÂxNv: ă€ëÂčşsíţ@/”M5:ŰîŕG,ȉ,Ҁv!- `Ň5˛ŤęŁ}Ľd|řÚT;ťËľšąňŽŽźš§*möĽŠ1 ż™ŰżÚşY͔%Ą>iBPI$WÔNžźă…jţdJ™ÂPüůăGȨTŸ:ŔBWN ĄO@šPn?x­t]dHˇŮe˝—˘&ú=ěW\3ÓÜxçĐ:F¤O‡jƒQ†j &Kž\đőßMł<Ť”9/%kíLCÍ+"˛âG=:ˆoʏ°ć"ĺGưo†ŤČС#cy>n Ÿ‘önbăéĚ|.Šc ł)÷)VtsŞ %;ˇK‰ˇ_,$ŸŻčEÔR#ާůĹá2ö‡Ä“ž‹{Ëc şŽÄaeě)ˍ°Łvčrr^ÔxţXXďĂĂ/ˇ ĎÇřČ >o4śśřL + Šv-Úý „cŘůŠČ89‹!;ŇčřÚd˜˛á qmnŮÔ|jF–G–k­ e‚ŻŽŚ4Ş%$´™Pö˜Żýp†ę‰#OţVjžĽĐN˘Q“Zá'cxQ5š! â÷œŁ—Ś  ţiŕfŢ`` Žä- šq4úzT#$ÖŚ5˛Œ_!EI°RŰĐrw˜)Ľ ďVĘ Çt™ëƒŇ#ř烈k›žd<™¸7U1á~.nů¸Z¨@MˇóŻÚ`Ůť¸ě !Z† #Ýŕ)LůoLŻ/š×Aęßϐ”Đ^ €27( Âőt*ěŕ2DËÉđ…)Dszězћ´Ó‡!ĽůÓdş‰Éf۞ł ôŻ ¤’Ô ňFB(ľÖřf‘ůĆîÇg5XÍ%Jţŕ)3?ý~‚ďťfB=ÇÓÚęŮ´ŁÓ–Gśjn攜 flj5YěČĨÓ˙^nť AžďSěĽ$ډ‡Úť&6˝ˇžŔvA!Ah,ˆĎŃôűρuŞWş‡awć›˙x":  4­âv!¸%Jřť˝}ŠŇaÄ­OŤ4ZŢë q2óę„ű>ÍŹČ3@G¤űk¸F•úŹăÉ?KŤ­Oœ˜ńdĹëĘ×o|>cáŁwcŕ`Ľ­ÇĄŰŕl7çUTBÂ~HŚđiń Ÿz흆*­=ˇÍTH—ÖŽÝăňŚ}´ ěSDäěTďšĘîŃ ˇ‡zoÂPÁĺv‰ß. D:ýXd݋wW@Ɯ4WgYŽSŻí•ÚĆBŒŕőÄŃM¨Kő1äÂt#Ÿ(łŰ4?ĂÜsBüpQŒBÓŒ(Ş˛D˘š÷ˆ…lbô[0ÄÂ2”S˛6 cŇ/m^GäÚSĐj%awhí!ťnʗI;ŔťéňÂĺƉ‹ ‘ŒGÂpv>OrĘNčăÚ/~ă2ş˘JëŽ[ŠÓ׾Œ,űŹ•Ö>˘ű‡ä#ÇHöhNŞ„$_ ꛱ǙÂ?‘.ü7ZĽľáVp%АH†ÖúÄń1Ey_LF}Ȩ-Cáy´—™gŕĺš • Ÿmăó—kPś˝óIŠü¨_ŔŻĺš•l@W@Űu6řŻ.ď?=ŒSçm/V“ÉF7 —RźËč†lĚŁX§o7ß.˜6r#ňi'šĎJ˜AfňСÍßxZ endstream endobj 622 0 obj << /Type /Page /Parent 761 0 R /Resources 633 0 R /Contents 634 0 R /Annots [ 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 623 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 288 602 296 616 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 624 0 obj << /Dest [ 159 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 402 552 428 566 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 625 0 obj << /Dest [ 166 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 329 503 346 517 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 626 0 obj << /Dest [ 236 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 395 425 422 439 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 627 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 432 425 449 439 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 628 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 491 376 517 390 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 629 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 477 269 503 283 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 630 0 obj << /Dest [ 184 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 419 140 445 154 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 631 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 344 105 370 119 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 632 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 380 105 406 119 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 633 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 634 0 obj << /Length 3194 /Filter /FlateDecode >> stream H‰¤W˒ۺ­lőX‚ŠM‚ďĘʏW˛đue´łł HhĘ"’š‰ďgÄţ˙fN7Ŕ‡({ěŞÔT@<ݧOźÚm^ěvJřbwŘřž›e™đđg›™çzA DFŽ—™Ř6/^÷‘(zžć‰žŘźx{~ƒšž‡ŠÍvl>m>Č{gën*?;Ęs}ŮäçĄÂň]{)ŽďóR8[ĺÉż9˜ƒA‡Ś ÚŮĆříyQ5Î6s3ůŕř4$Ţ^ŞŇôhZаżžűžź×E۔ⷲŞśÎ?wßüśŰř˘›4uŁ,ŔE|×WĄƒĐMĂPŔŇD‰No›Wťg¤nŞ”îOwó3şŚg.řş=;ŰĆá†X%;'Ä˙ Vyn@†SçŃĄ˙ƒ1ęĹ_­ÇC7ŔYť7´Uą‘rv˙ZÄśefŘ84äCm‹NŠź,ČĂŘ çű™Étr(sňb,ŮÝwä$rłR‹…kM2OFžˇĹî^ꉭxI—R4”ډ'ż%ŽBźĎ:D;­KÓÉÍÖÑr#OýŔÁ¸[úSŹy™Ťź8}­ü…ŻďľÁMßvƓ“ł”›^9+œ•Zg9Ű(=š;j1´gŃ_€/Ü[Z´1ľńŃŽe§¤ŇâóԖ—Z߉§cUEՋ|_Ó˘×MŻÍőV_l­ˆƒI§Fs"DÜŕP˜Äšƒó"ižzgK01 öHüagçf¤çśg`›9°™wąăÂ|ęÜd܇“f<ČęŠŃo6ی OŐ=ŸwU^‹7úą*ô5B#7J-€)+ÔtgjZ§>ĐóR|q"˘ëCN%ŤÍú+ţávU3Pś§p=' °WŇT>30>Ż<đďźń–˝ĂPFdČÓXplűA\zňE,ŤfÜԎŽ~đ=  ŘMÂ%‚â wň÷[¨ëť+0Â2y oą‹Šg(˜‚ÉفqËšk‡śhkWˆwůI—bϔ‡ťäd/ěô9Ă"śV˜ăŸ Č3ł›˛űjčŃA!ŞąŮgx ‘w抻?›Łł™ą˘m‰P"ÂN0~‰Ą:™á;Ń>šA(“&M쏧ŞÓ¸ĹGÉCďbńv°űÇŤď„éD 2iÚ ˇ1ł˝Pœ|ƒYâKţ&i’ď„KšHŹŃ˙ˆŃűűŤů%\E( Ŕýj„8áëž9yzKŽś^FJŒ“î>A˜œO,™€Çů…ĆN&nĂi0ĹçƒlôŁîDa;gn­kŕâË˝6}´ ÎëŻt o Մn>Č.7ÔÜť Ť(!övy¸ôŘřŠŽ7>…)ŰšŠĎE\|‰ćrÚëŽwŻÝ ÄŤEŢLkÍRÂơśŘE#íř-#ęń§Ľj\Ş&é@lĎ>çtŻÍŻxw1#'¤´ÜŰYŚ^­ëBěţ2ŤłéjŮDQ* ‰˘. Î!˙ű˘éŽć7yßW,c|, •­Áđ6ÁWižÄ`V´öSçT0L_SÚĆŁý-/tją2ßÓ™—ČŠ—&>tś†k4]Â֖IMq\óf´XY(Fśćƒ)KqMxŸW%ĎÓŮzĎ^ßćœ?sŢ “BŞ?tšBGčú×49ń$ĘËóY('ôŽqkNÍBŚĹϔţą€qŠč5z#Ş}źřƒÁŞrC7˛€`ť*—*tătU2ƒt)Q(”‰Dp‘Šú|#STşL–9[ü ŽqČÂCŁčYáAu7°ĹA°t9ëÎČϜYe š„íÓÜW^ ¸îlגžÁĎĹžőK˘Žő‹?ëßbŒ¤W ˙CsŃĹŠZ0!ˇ›3APiŽpŠďšb ,ufˆě0 ´3/üŃ,÷%™cv­Ťc‘uE(5!ϟ>Ů)fóúzÁ9k8šŹ‘fáŢôUËS3ôš ˆ`\8rśÚÄX#eí/ĂĐ6(˗A4€ďÁ0t ë?:Čj.ž łč;čZˆ1v}8G!4X&éú ć^„Ÿ,ň2žK}<‹_•zňw.ůPI-Őr„“mŘnVŹ,ăEÇŔ'–”ĄlŸńhúę‹]d>šČÇcĹírӆz7ŐfvÁ˙¨ţ´ÄŘ`FîëOŐ0˜ĹĽń´f°&ŒUú@ĺw"K źˇH›ěŽśS›2Ăš•˘ę!5§XOţ…Ľt1|ŻJÎąßÎÁ—‡.?!ÜBw]ŰőšŠ’Ńó‰d4fÝą%ć˘ŘŽH °K ˘w’$›Đ¤Š‰ĎT9vç]Ţ \ľ°‡ś^ܲ+7Ţ xŔRóŘůOZăD㜀üC^Dßeßk”Ëfp˝ňP€Ůő)\O’#”˙EyňnĘVxlAřLAë4nĽüńU‹|/Ž]ŰTĐŽ k$#Ъ냕ü‚­fÜt,Iż.čöN| mísŐĎS.Ȗ\>81<Ú9 F’¸ŸôíĂ3¸}6Źr/SÄčDˆb?tí'M…ˇ5Ué‡ g›§s ܍sY1ŚH܅i0ylëGC+ȲsŐ¸í㡏}—&?Ő–˘ˆ١$5é}Ůđ>çźźŁ§g_íkŤlD14XűXâÂěĂëŤÎëÍóŽô>G‡NiOzEŽádih,ÍOíHkü8á4iD]fź<9ÄÉ[úÝË'Ԃ”^>}ń=b*CČłĐJěö4^Űľr ň`łBü\ă%ˇFJź”˘F5 DaZ¤Xí oĽWJri-˛™uÎşq×ďžřöÝł”ŢĘ ŇYzÓ~ějXyĺ$@[7ožÝ˜ů˙‚ůŘoQŸn˜ó|üÜW4š)ŸîĹžÁłĂŐ,PÔ(‚ółxKĎGâLDMöj6FÇ_ëÄE9_ĘFĹVV2eYpTŕ‹{„S˝9ş.8WAP“Tţ˜Ż™ ËŻÂĺń Î@˘Ř[@ŰW > •Z@˜Řx°ŻÂŁE=¨âtŇe•şśCătS @gţJőÍrÉärPÚÉ ź´lmOYš‘őAJ$ $›1H>ygę‹uhŤu)•ľ]ŰŇ ˆŁŸmm„÷d(ZBÍîń]CkAŽ×d’LţOĚŐf~c éfE ą-=ĆŕůRm9ÉKęîM­Ém-¤Hă``S€duşÔđ>ęä•-ţü\űŃ\?h”ësş‘INĘJÄŧýëÄ\K ɄI%a}Ę2'§˛ŮlzŹşá˛LI\VŹN†˜X‚\MľOĹÓc(&ň‡jzÚŚ˛oo’*pŁĽ4ZW(Yvůƒ°Ivóz ž+žr˘đ(üšTRôšTԂĆA'[đ‡’H.Ű0?GÜÎ8Ü8#şĄGččč1týě˙öŔ‚‘nř3v=uÍř\°äî՛5myńĎÔLgžü˛kĄ Y#›üě }ué~âő(eš!‡~Ćľ}zą1ů@ßççĄ*z“=Tů—n8Ž:ČîrÄĐ)'poj/y]~gć ,uíˆOI˝Ĺ{Ç'é–s’–Ť°ŇĂ˙^-š Â@tßSxi¤ŚŞ q€öYĽ+DŒ@JÂ$=HŤ^Ą×ě›c~MťI‚qěńĚó{oţČ=Ÿ85†ü[×6çatK8úľ)vô˝nĘZĆ^”.żó4Fmˆ jź‰şĺšŕŠíŮľŢůq9%˝ZŇő$¤Ćk–ĽŔhşčru‰Ć•Ä„Tâ×%"Ž”I."ĄhĺAâŒvDŐgˇMúÚđ˜ůU šŚěŹóű?˘RBqđ+‚A íB¤ěąˌ&ĺh{ˇ°}Ł Ą„ ’%f´~ČÖŤ‰ŸŞŠĐIŒIN$żjčHyjŃÚsĄ|–ŮŒWîyŻÜż@…!ţ?J…ăq/ŞŽĹébU뗬üœAlá?}ů7`)Ľ^Ŕ;(”ěؓŇÇ´g)Ń[§ĽÜ •Üťü\ň’pT’L4ÎŘێ• ú ř Ş-łë!$Öč_ " …Œlfz˜|ł˙›šiŸĹůäćňŚ2Üß}ÝGrÍčÓac¨sK$ŒÇő}΂­ăă'“×LŢL’Ó}ž@žŃ(S)é óCí=†ŃśĆśą™śˆł)vöú ŐÝšƒĚC…ňŃkí[WôöHĄ­T¤$Ę`ć˛Ď"ŹŢăF°eČLyřîŒ!1]ľ|ďCkpZ„ęfÁÉĚAL’ŒÎ{˘{őčBqŸ÷w? ÒÉ endstream endobj 635 0 obj << /Type /Page /Parent 761 0 R /Resources 645 0 R /Contents 646 0 R /Annots [ 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 636 0 obj << /Dest [ 372 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 208 650 234 664 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 637 0 obj << /Dest [ 358 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 465 587 482 601 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 638 0 obj << /Dest [ 377 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 266 524 283 538 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 639 0 obj << /Dest [ 130 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 202 440 260 454 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 640 0 obj << /Dest [ 194 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 435 404 461 418 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 641 0 obj << /Dest [ 123 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 252 341 278 355 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 642 0 obj << /Dest [ 188 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 469 278 496 292 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 643 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 380 135 406 149 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 644 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 306 86 332 100 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 645 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 646 0 obj << /Length 3385 /Filter /FlateDecode >> stream H‰„WM“›H˝ęWÔąŘhaŞ ćÖśg&ź1c;ܲ}°÷@CŠĹŹ, nďßXű˛ż`nűçeVrˇĂŽŚő‘™őňĺËç›ĹłÍF %6ۅR~šŚ"Ŕ?7L?C-ÖQěI˜ŠÍańěE‹źăičňĹł_o”¸ë˜Ř(_,‡áĂ⓼ń–*ôůOž’UÖô%–oęcž{›Â[ę@žň0=šŇošÂłÝfyYyËÔO坧č“řőXöĄ•kńTjĽycňş*ÄĎEٗu%źnţąřyłP˘‹$ńă4„#ĘW:QůI XşÖ˘5‹íâů扄‰ŸF:!˙É7•’›uđEÝxËĆÁCŹ’­áo Ť?$ĂéĺÎŁż˝5ęŮ/.â‘âŹÍKÚ*_Čży›?&÷ŰRűŮ4âC݈Nš˘,(ÂŘ çŤÔ_!ˆtr$3ŠâJr¸Ż(Hf­'3rß đu2VÁťI –âšœŇô)Iցüsík!ÄŰěÎŁCŒŇş$Ăě"k?ô#†oÉą¤žVéëp ľÜl~;ž†g5†gĺƒŹă@^W˘ŢŚ˝ÉwU˝ŻŮëŽĆ>9npf;|hm´Š’|dŮg{‘—m~,űN<ěĘ|'čÎy.c5ÁĽk yo ńPö;‘‰řƒ ÍZ,šřdg8ÚZ;›úĆunj٤ýŘZ´–¸‚é âßĺŢ ΏĽŘeŔ:Eë2ÜJ [–kFíaf{Š[c73•=2ł?+ť79pë ;Źxńű››+ëĚćﰗ˘ďÎĚVzäJŠŽĎˆY[°‰Ýą˝/ďMá Ü×őƒhážnu‡ĎŔݕ(Jˇ­EßÂ`GR%C$iD‘ě°$Â|.Y€‹ÉöôŞĂ…ÁoÜSÖÓožçfŘéÖ*ű•źËxśGŚQoů˝ń°­˜Ű}÷ĂëB|Ýli%ƒľZ.í—{â&œař§xÜ>˙›8wÎe;ăţłü3ň˘Ďžƒż ,ţÁ™Ť)÷Ý%…č͓(T1ĎÜ|yyžJ˜sF6ńˆŇř”MÉ*›ŻŒ1 ¸PVÝĄěĹËŹĎž‰ŚtÂłÇÔw7KŹnÚşŻózë§ 6_ą|É ś^űJŇ哤 ĆBrŻťk™}-ޝvŠíiťşë˙ °™ś¤œĽy_ˇţ<¸9řşî vČú+Á†—(ęüx0Ţ8kCœƒ÷Uv@’lŰú ŚöáŘSŠ4uYő€¸/ÍĂOâŒ}%z 8âHF˛-Mçhq}›qT)áéŕą`řěšRrşě”/ZW¨ő AďŻßmfÔé'áäžG$öS­\DpĐ5°I„Ň‘ĹJÖó#Mö˜řIžżąEœvŤôÚpŠ45&1[*ęv†bĺ‡C•¤r0-˝7/<:ăŐěĺŻÖžđIúž őű ”Ôv€Ę5ů¨Xڍ”sSć;J^ŮÖU}tWóÎä†Vˆg6¨ÉjÎďăqĂy›ń. ˆ×"ߕ ťÉ°uŕ•ňĐě Ž›&%de*Â,OHۛ{łŸŚ×› ĹçPn ęľl+ńöŕĹ5ţ÷ĚŹÄđš6lƜ.+ät^Ëý~üĚç9j´S„ZĹq s_憽8KŹY–ćßÇň>ŰĂŁşš {NSé9EEjŠ#N­ ă­aĘśŹě ˜]yäGń $šÉgĽëA ÜdŘH˃á‡đ˘0 ŸčG–§|t;ä I7%ÄdbTkŔ0ŕv”W´y"R)ŽgŹťuąr˝oě֋I_~T=„ăŠJ= `g.˘J‡—š‘chÄD°T‚šöňÝ}=6ßpWTPCBÎĘX#oq12gxEa.DfAČf@Ý\™ Á…̰3XÔBšśČ­H"xiy ůbž8ůDZ‚ŠôÖěJˆwšÝ׍0Ĺ(ŇH‚^I„:Z4Bî"˙qo@äžńŻxŰ-áÝ4G@l‰wŮ&Ůö˜éúŻqĹv ˜ý–ňIĚ´+łľü‘ů,ńH™Sŕ‡şlĐN,Y_¨ŕłœƒ/öĂxRŮ-‹góţ`ů5MÉD‚ ä%(ĄÇăďVˆW?żŕŃ4ţĄÂN‚)ŢŘĘ˨{ŽěŠä‘BYÇÔÇď˛bôQ¤tޗŐŮľ‹}ý°@ň ‚x‹ŚĹš<–]caŚ)+/mÇÂşĄ­uĹáĐAËÝ JÁPÚ)W‹­˛z^ô܈ ř€ýHçaš 'K= Żx}´ƒƒÇ`źľżH—’˜Z(ú‘ ăś÷Zôő˛ÉÚ^TÇĂ­“H­( $cšľBŠ<& j|ʜn˘(Ł…ŕœ"÷[„ŤŁěľUĽvÓśžŚ dáúőúwq#w‘ś9ľ ČfJ˙fÇŠÍ€2pT˜Ž´=7)€ĹŠ˝ŕćÉŁb2kLi9ٖíá!k Ň2AϕIzÖQ^x"Ä+[’Á É˝łĹŹĺřYu@íS2 ń˘^řŇZń5ňăoWŽŻŁo\ŚŽ›ř†‚<Ő6Á¸]ŔŰÉCö˛Š˛‘*Č_Ä~œ\Ęľ r9ÓžĆ\ýľ„ Ÿđeoě,¤/ ‹GĂ&vY“Ęʉ:’XąžĆv$Îd˙Üft8é$YT 8YE|Ůý\ˆâ1´KŁě%ŚçěŒHčÜ÷öľxî-8é>öýwęr¨&ŽŻÇJOĂĄ.G%jWŽű ؋!âřQ@ŞĄŇđXÜi{Ž›übG °Óí‹ZĘ(Gbéöđ¸‘JL­¨;ŐŚÉ!÷T2ŞÎÔzŸy|çÍEĐéšĂ"f֔˘jDßBŃfw`Ą98MĺŠ0Jd7‡A>™eŐő]"HĺöœO ‡—˘;÷˜†9Ś{(ű|ǍéÉÂvzœŘ›ƒÍ#}5CaÉ8ďh>ą›Ľ6|ÚŃś&sâţ)ŢŁ°Ţ—nG Ż,8ěŇ-¨čjnXEŸ5bˆÚ¤QžUÂJWŽ@†4^摺ş7 8C"ŰŁ0Vs÷¤Člć{r{-˙Őů.őO—IN65f…VCޑúE7ƒżJ’‡79ż°ŻkZÎýžŹî. 㔤Cçcœ„ÎÇ˙Y…C…ý’Šp]酶ęňśćӆXút]2ďTœ€úéZ{XZ>t3s=+7n¨B´JŽ@4+ňć`M‘˙§3! Ó4ĺn¨"\”Ź…Ą˘UH+×d‘&ś¤Ă ľŞvżŠšťŇő{ ŻťzۋVĄł>HĐnŐΏKëĂ(ńW ]̅ő6¸Ć-S—.\VDŇć$•3ŕ@ůĄ.É>(ÍB›4 ,Ľ|Ż–Ó(J-š§a2ĎŞlN‘ňĆ\Ęj=ŹěÜTăöďŽDm3”îđ;Zs=ĆÚ1;˛‡—ÚŔĽONǤ_éÚő_”Wˎ›@źç+8bÉśĚĂ`”c”crZśäĚń‚‚ŔKůúTuóĆ^íŢ`˜G3]]U}؆Ařž{sFÂÔťhüĐRżt„°ëPÚŁ:ŔÎë1$ëűÓŁtî#ě~řPT^°ç*o•˝(Đ|ä |WíŁő­DŰ9ăű`Ź;Năű]@EýŁß(Â`áw[ď𦃎_ę2‡˙‡ˇNqLŤwĎĐßl&nkľ˜í|ŹĘ\ĘŞšo焇gŃńÚC\OĎ8ŇcFR¤f–Ŕž¤źÍ#f>Ć/@ˈMʰEؗîńiŹöšV{aÝLžS"ž×ÖĎľj=ĽâűöY˙oŃjş aB”÷˛ţ#ÎŻ‹´‡ă†ÓéőË9ŒżcâĎĺľÚźĐťŃ ĎNe"4U[ţ‘ŸđœŠ‘ľűυ,ąóJ$—\U‹Ë› ęxJq!(gĹ'*#&VD›PÔA—äҏuiĎĐŚ6E;p2mDŽÄÍyeŽnłEˇco× W#Ž[–4)O%„Ιl RŰŕ[ľ–Áś‰(ĺ˙0L‹0Ť^ˋäđ–,Іí'ŚÁíĂé”Î@Ěż§WŔm <…´'ޓz n ů.0‰ďő“˛Ž˘š˜Yˇâlý ŽŁÇQ‹-Z ÓTÔüČžŢÓüĂؔzĂÁ¸§WSÍÚčŽ˙ŽśĂSďł$=g€˙ƒK}śž”e•°šőŕm"aśűƒGL„ýýn˜ÖĺĎúý5Ďř‰gfpułÂó{Ýr3ćŰ,aŤc°Bd°ďĐW¸Ž-ĄŽ ź€+™gĽH3ŁRŒ ˙˘Xžĺ:`]Ę:k˛’ë `{取Ÿ‡…7’Ýő÷üÜŞt°uźy1 ŐÔŸ—7ȸVˇbŐň0ĝłR#uCšŃ!Ř!“źšŽŢ´Śq#Ą(Śę0<ą‘2ţŸç´Ó'ÇuöŰĆÁ•*K¤ĘXž\m7:b’ĄjWôbĎ–a{gśż>}ú/Ŕď2ó endstream endobj 647 0 obj << /Type /Page /Parent 761 0 R /Resources 654 0 R /Contents 655 0 R /Annots [ 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R ] /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 648 0 obj << /A << /S /URI /URI (http://www.synaptics.com/)>> /Type /Annot /Subtype /Link /Rect [ 197 410 325 424 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 649 0 obj << /Dest [ 105 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 374 656 400 670 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 650 0 obj << /Dest [ 109 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 358 597 384 611 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 651 0 obj << /Dest [ 490 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 101 92 103 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 652 0 obj << /Dest [ 126 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 101 92 103 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 653 0 obj << /Dest [ 233 0 R /FitB ] /Type /Annot /Subtype /Link /Rect [ 90 101 92 103 ] /C [ 0 0 0 ] /Border [ 0 0 1 ] /H /I >> endobj 654 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R /TT4 774 0 R /TT8 787 0 R /TT10 791 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 655 0 obj << /Length 2843 /Filter /FlateDecode >> stream H‰ĚWŮnäĆE€<őWÔS@"Ĺ*îă'4ž8€ éŸĹłzo;ˆgÉÁšâ'Žƒq=pŁHŞ‹őśă éń¨ČĽ 22Ç_0§(íxSŮÉJjp!ŁDU”ÍPm xęĹö15€pŠRč(_܆>Űé}3˝[ÝU˙ŕ Ó͐ŐbS5Śű˜x6&ŁŘiĚ#w:‘ÁБĘM„#ÝDž`1>á&żˇZwŤ!' {‹–Š“üřĚ!ÎGÇV˜kŸƒň+=Eˆy’ăšU“ÁěGŠŤű‹Ɍi2c y‘%ֈŽbŮJ(%0ž‘JXę/žpeń"‡ŁszË跆Ą˜+­îY˜ô†zÍSđ{ĹýžĎŹłœö+Q냁aň12œb0…Ŕ@÷ D.{‘uÁ –M ČÇ0sg+ćĹG= z'ĘâS‰źŔO- 2ĐĺÉĘkݗ=Nd;>ŠÁ ŠŰž/ť'űJd ˇ´ŸőoaÁmÚJçwĚâL˝VljŹ2ë` ľŒ]/Zh$‡YPtG1qTäBţéŠüoĹâű˙'ąŕ=úÓý3ąˆŠF¨ÔY,BS°HáÇKbń\vŔf ęŒĚtpLŮqß˙B%‚hÜ>áîţ"~”%mU'ź„ćň˜rćúˆ&ď{֍höť˛Ťrf oą+[Ý äC0PQˆÄm,ŰŞ;Ÿ\‰ůšŰ !‡rŘVůÖ|ť2ë÷P{¸žĐ “9+„ma;V%8U° ^:/5§2i9‚ŸR¤$Ÿu•TäÚ4‚šçÜNţ“=í0˜Ł‚UŮwC9˛Lł*^rm 6čƒÇúÉP‰ Z b0žte“—6ĆŹgýzC­ŕJא }B×WWƒŒM˜"PIţčœáé!˜‘ššâ>šË—3CůĺŹ.ŰmՊÇ$*ë qŻ‹} ń˝äđ x#:ř”âą%ôÔźÚՑÍWźoŽĺWúŽşĚYoŤćx-p¨óZÄĆÇö|%ŇĎ/Źp_5•3ÍÍ ¸pŞážő‹–xÜ\ŹÂ˜ŢĎÂlf7,x¤›i8ůÖSǚ&5 č.plRń{čY2Mc÷”!Š›źRjšhjĆ|Ůqĺ¤v˘6ďĘ|›5Ɇ˛PŠÜaËşĚÓБ<öÔŠ3"ҋîĐ@škoĽ÷ ěw„sv*0tĄzĺXžDGÂŞ^-M—â|×U ćâć᛫$|„h,:r ’\…: :ԅAxBSP*ÓđаéZz.šD™I ŔÚel6#6M¨zh\Ă ô­Ý=+~U3”ÝĆ4ĺ Ě­„ę¨,ýLAňɊďŃUTŇP˛"ä˛f˜ŠŽű?c•K°Ęőz30~ uÓÝEFĺ<QžřĆě Őtńýš`°uÖGp[řü‰•?˝Łđ ú|…É_Vľ0Ű)znľ¸We˝šž>.y6>c2ŽęšÚëÝx_“M2 DÁRŔ( .JB၊˘éÂv~Oó<őc"•ßÔđŻĎÍ=–‰*ń"ˇ¨†—÷ ę…Ç5&˜m/œOá›ńŕ“qÖĆ#;ôZWńŃP]–~9ĂËG` {~ĺŚ+LUzbn<˛ŕ9ďˆrř ăĎŽžËíŽs˛kâ D!xfm3 ą_KϚˇ=îÎq>/p™—;î捜2ovUŢäŞ<ăŞ>4‚"śeݒq‡LŠŔ‚ ’Ďސ0…>ô´Tâz>ąĎćQE`´Ă$~‚ą$Ç~¨cÜĎ)ěÂaÁĚÇ1ć5òńoľâŰő˜‹Pg(SČĆ~ÂÁwÓř‹ƒ:^°đMšň°TPFˇY/öć;ŮČĚÎ1bŇUeSÔ$Ł`‹9úźŤZ–yŒVjWŰe͉Ä1&q13—r’ű‹’ňJ`ŸŹ[M&ĎTГˆšűF|{"™…oÚś6uZ|ŤY7č°G x9äîšYűažl˘?çŽmb@6Q.mbČÎ0"›č/ŁM çl"˜ ńa ‡-^'`ďlńv‘ńĂëśĐ˙BÜż*çp€ú`ĘöĂíՉGIѰŸéëBÄĹ×°‹”j ¤ló•sTR¨B˜ěâ}U×űCy%nŠ˘2zÜëĆĄŹ âČęŮLŁ*Sľ ĆČ'ޟ|‘ÉwUŸďűŢ\<ŢR^$c ýđVbßĂEaßäĚÉ'+ł…")$ÝHŞ@Ľ~ŔĐÄ#S?j´ÉԘÇ:]×ă ďÉbŽć0Ď6Ł™3ő“MEÖ= Ń%:ŸÝMęý'2Uuö"Ţý37ŕĽhŃŰ÷âŽ|f™ ÇĐímxnoç˜b­H~Ć,v_ĺĆZÎć%F߁÷Xň—’ěĺě_Ŕě¤'ĽËآ;Ă)ŽžlH Ľ ˆ…y…sávŁŃ?ąM$–@~L(űÖemPúŃQfĂ-Ŕh56;0ž(ŸÇáyÉS˙R÷8Ý˙źpNěů~_X’ Aĺç{ Bľ,¤ęésÁ(ÝoQqBë_Ô*žÎvUýÂĂ~Ě:dOršŕźt™‚'VRPCĘ„*V2=.PLŔ)ó"bL0fŢĘZE`Wl:Ýz´…?ßéŇ,&Ĺ´Ý0ń T†%Çţú~FćçH|ŕ쐎1°8•„đ4ą‚Ů âÇ~Ż!Š–×Ű ´1ޢ¨w9hÁőΐłË>őş€˜ÄŰđŸ#ÓC OđăLťHý00˛—č8Y7‘ČŠy4ߜ=[×Ę#i‹úśîţńž\~J&ütţy˛ endstream endobj 656 0 obj << /Type /Page /Parent 762 0 R /Resources 657 0 R /Contents 658 0 R /MediaBox [ 0 0 612 792 ] /CropBox [ 0 0 612 792 ] /Rotate 0 >> endobj 657 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2 780 0 R /TT2 776 0 R >> /ExtGState << /GS1 805 0 R >> /ColorSpace << /Cs5 782 0 R >> >> endobj 658 0 obj << /Length 390 /Filter /FlateDecode >> stream H‰”’Ëjë0†éVO1K Ž'3’lKËŢ9]˘ÝĄ ă8Š MJ’RúD}ÍÎÄnéŞp0ȃćňĎ˙ŮĹ,JńŔPֆsÎ@ňĚa&¤<´ąFJ!Cy6‹ËC ýáTFpčÍâvɰ9Š%’A˝ŠžÂ7óĎ.]Ĺ“}wžíś{9ŽŇ^vŻýă}ˇWy˛ÔHŇiÉqpU#ďýşëÇ­Ť2fťqŹ)¸}WÓÍ ^zĺÍÜ0ŮĺĐďś+¸^Çqˇ÷PîĚu1 #˜”°ÎAŒ0˛CÄ#ČŚ­‡ý`Öć˘ü $ĚŃ'őŻŢ8ŤMš ^î^\•d9q(]vŁlEtq˝|tz§Ľ73ńˆA´Ę•Žę=sĺéÇ÷Ýň”ž€Ć“čŠ2xĽ JX&‰>gl˘*GŰ)Ĺƞp˙QHŠŮű=΁dŰLśfŞd:%‚ ÎՔ×TJ-ُ#Üw§"ƒ ڗůóL¸öX“˙oŔ-eôԜţ0ú†+ęBD† 0Ę[“Ľ endstream endobj 659 0 obj << /Type /Font /Subtype /TrueType /FirstChar 32 /LastChar 150 /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 0 833 0 0 667 0 0 0 611 722 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 ] /Encoding /WinAnsiEncoding /BaseFont /Arial /FontDescriptor 663 0 R >> endobj 660 0 obj << /Type /Font /Subtype /Type1 /Encoding /WinAnsiEncoding /BaseFont /Courier >> endobj 661 0 obj << /Type /Font /Subtype /Type1 /Encoding /WinAnsiEncoding /BaseFont /Courier-Oblique >> endobj 662 0 obj << /Type /Font /Subtype /TrueType /FirstChar 33 /LastChar 34 /Widths [ 979 979 ] /BaseFont /PBEALE+Wingdings /FontDescriptor 664 0 R >> endobj 663 0 obj << /Type /FontDescriptor /Ascent 905 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -665 -325 2028 1037 ] /FontName /Arial /ItalicAngle 0 /StemV 0 >> endobj 664 0 obj << /Type /FontDescriptor /Ascent 898 /CapHeight 0 /Descent -210 /Flags 4 /FontBBox [ 0 -211 1359 899 ] /FontName /PBEALE+Wingdings /ItalicAngle 0 /StemV 0 /FontFile2 665 0 R >> endobj 665 0 obj << /Filter /FlateDecode /Length 3121 /Length1 5968 >> stream H‰ĚV}PT×?÷Ţ÷ąť€,Č"uÓřÖ'„Ŕ"ń+*Xew…eL@0îj­ť ˜EA:ÔŻ8XMÁéL&$XS1­)~ŕźc1ă4ÖCÇfʤMFkúAG' fŞľNKĎ}v€iŇţŃ?úÎţŢ9÷œóÎ×˝oö€h•ĎT.ŹęŹ.ČFíÓľM‘–‹ëŮ{šdemŰ.ĺ\áŠShť mmyŽé'÷WčR€°ĺšĆ=[˙tî…@ÚnôšŤÔý´ck Ŕ,´Ă“1T¤Ď´}ŔĆíóbMťv—ŻÖŽŕúëllŽ8Ö:léaĚw­)˛ť…=+ĺa=}čŻěˆ4ŐżŸÚ|ŔqíóZšwîÂşńrÔq{Kk}Ë3ď=ś`Ć<ŒW˙o×ÍĎľ,@Ş%AznDéŰĹűQDâuč:`úŔ"„ŽRîŠĂ°Z ý"؏w/ü•ôÁ7 ÍJˆ˘=ŠŢCȋŃV‹œ1zHˇÁ_€Ăű3:@ŻŇŤ†ľă¸‡It@F=wÎÁr}öÁ+hť7ůSšúá!ÉEę"ż'Ł´ľ„çÇ8ŰŃťëý!|&¤˜hä2ú¤ÓƒF-fśvôBşiDᴖ4’fŇJŽ`ĚĘčŒÚL;i/ŐéUŠĹa)]Z*7bOAvČŁ= ՘9 Ď'˘šôsBIŠ!1ňéņČ(Ň}Z@Kpęœ^ea!Y¸'nßD–ÖËoX$Œ-‚łAlXŒ]ů0GÖ\Ű`ŻAűöă,żÇĄNŔ)ˆĂ;đ#žnÁxˆÓIEâ}-%ËɤR+9@ă<ş&ŃKä ď`}×ÉtvmR#voVyˆĽčuú3ú1ĄŸĐĎ0+Ű¢l';ÉNłě†P&ô '„ŰÂm‘ˆş1Št)CÚ,u!uËVyť|X~Y~Cžh›ł°/7ö€ ŘŐěd?t‚fěZ鼍4 Ÿđ>ĆĆ;ᴜx‰ŸŹG ‘$LšČN˛;ŃŃ÷Č[¤\Ŕ^>@úÜ"ż! 4č!•h&ÍOôWIŤéşžF_§Çč<‘ô2ýŢÁGčě1‰Ľ3{”ů˜ІmbťŮ!ÖĎŽ˛[l÷-YxJ(Ö ›ą÷kˆpw’ŠLĚ—ˆEH1q‡x@ěżƒ'zT•’Š¤K3ĽR‡t\>’ţ!;äLy.Ň|y\-7ĘmňiyDžk9k]em°śÚÜpž€L{{ßĆÓýcşY*„Ů䞆çY*z)üÝŁÉrŁľđęäj’‹;ő+xČŹP!\ƒ l4ŠQ–$ }d§pœa~8 'ĺ6r™…Ů(;)fK+ĚyŇŁě´źGËwąŇűě1&Ď'ŤÄ.ŇGKđn%UđňžŠ™wŃ<¸G “´z,gI žkCtéßdç…^ćÇqâ0{–€’!ćâY!žĽË–.^´pÁ…ó Üůyç>–“=OëRć<úĺGœłż”5+ӑ13=͞:#%9ÉfľČ’(0JŔíSýaEĎ ëBŽZVVŔ×j‘IаޠĘ?ŐGW†›2ŐӃž[§yzLOO“ؕ•°˛Ŕ­řTEߍ*ƒdcU嗼jHŃG y­! 9Ć".>Ąř˛b^E'aŧűŰbš/ěĹxń$[ŠZZo+pCܖ„bJş_m‰11ę÷Ĺ)XR°*= z}zšęĺ%č,ŰŠÓ+Ť‚>ŻÓĺ ¸uRZŤFuPWëŠů† ”itŠT—4Joş”¸űŠÖ=h‡h8?šN­‹|%¨łHˆçHË×ר^}ÍޑŹ÷ yŤ&¨[K Ô/A`Ź=^Ţîő†xśôŇ`‡á> Ýgíq2͗ՠđĽŚu(zoUp˛ŐĹďĄ-pWŹ ş°jŐ×­đ6֍0(É*Ä"šŽˇi6\Żú¸&źMŃ­ęj5Śm ăfÍÖtXˇÇu~vŔsiě×đ)ZMPué%N5ń>ĎmݞrR>ŐRŕŽŰÓĚIÇg¤Ž É)“…ú„͐ w.aŐŁ&ź"ľˆŽÔ*XIPŐiö2~Ť_Zí2tĂ+Dp˘ 8ż°f/â!fŰUE{xÔŃO§j"ă)Űţ¸ČKâČĄ}BÖóóőź<~RäRÜZŹŹŘX/)pˇéj‹]Ń+pdPćBE…8r—‹ďr× ˘¸ĐŰŤ‚ćZ¨óôŮ7m˙cŕ7`?;eöl䙎ă&ţ“ŸŔýF&űű¸í&ĘŠ˙6śŚëř|ß˙–č4ࡽĹ<ż ž6 ϧdîšąďSăţ2!˙băkiÉTX4 űß§"ĄßC| yňI`ˇ –9 Ö˛ę<Éŕ÷céiO™2HŸ<_śŮ!ƒ‘ł&;c˛S&ë3Ů÷Mö]“0Ůq“•›ŹĚdkLśÚd“›lĽÉ–›L2™đ/öË/6Š"Žăż™Ýۙgš+gšp(ÝV…pśđ@”î6hŽ„Óš”#ԒKQhĎR-Ů@â›UCцxöJůÓH¤ľ ÇÁ!ĐýҚhU´j;Î:/ ÷Sážî€pßî^áöwˇpˇ w›płÂÝ*ž‘ő˛N>-—Ę%2&keTÖȰʖ!”RZҔ\â-.2Ň<ݑbéâĽ]”~ŁŽřGGĂ8 ž˛­hHąbMšŇŻĽbŖD‘őNăŹ2ĘŘą#quč˜ Ć*GâžfłT›¸ßb÷ÔҙC_Ń2śŽĘľcbŮeĄZ;Đęz­Žju˝Ö;“Ą5éďďxŠţ!ń_Ćţ5zOĎöœnf먤Tvăv­c|Aă١łŠÚđţ ŢŕÖŰąŢřE“Ř0-ŔŢÂaî  BŤ’Ť’*„K…ŞŐ9ĎĹz×Űń‹lŘ…ŃÁTâť{›‘ÇťŢŔ œ…b†™3ě$‘YĄ@Ř`7ˆËłáYjű esÓڈy֎ŘyƒJyNe LßnɛÓj/-`7]‰\’:ĎËçýNÉ(Ţ;Ü0tEUG‰Ďąlˆ,–s‚’7,!­Ŕ;Šß›]ÜJmĽŇl¤ľšŠ?°:q8|šuLÉ"f3űIPŕż°ĹĽž€qťÄß-ßRhĽžŠR_Ľr÷_l˘Iń=Ń%rÔöýÜăë!šrôö˙ź”q˙„Ĺ cK€EóŰäÔčô›I+źŇTó3Wç€ćěJ%U8QV:zEĚ•3Áë˘ŐНľţS€f;÷Ä endstream endobj 666 0 obj << /Count 84 /First 667 0 R /Last 668 0 R >> endobj 667 0 obj << /Title (Overview) /Dest [ 765 0 R /FitB ] /Parent 666 0 R /Next 709 0 R /First 750 0 R /Last 750 0 R /Count 1 >> endobj 668 0 obj << /Title (Appendices) /Dest [ 490 0 R /FitB ] /Parent 666 0 R /Prev 669 0 R /First 670 0 R /Last 671 0 R /Count 6 >> endobj 669 0 obj << /Title (Driver API) /Dest [ 466 0 R /FitB ] /Parent 666 0 R /Prev 676 0 R /Next 668 0 R /First 677 0 R /Last 678 0 R /Count 3 >> endobj 670 0 obj << /Title (Historical TouchPad features) /Dest [ 490 0 R /FitB ] /Parent 668 0 R /Next 673 0 R /First 674 0 R /Last 675 0 R /Count 2 >> endobj 671 0 obj << /Title (References: Other literature) /Dest [ 647 0 R /FitB ] /Parent 668 0 R /Prev 672 0 R >> endobj 672 0 obj << /Title (References: Synaptics literature) /Dest [ 647 0 R /FitB ] /Parent 668 0 R /Prev 673 0 R /Next 671 0 R >> endobj 673 0 obj << /Title (Glossary and Index) /Dest [ 501 0 R /FitB ] /Parent 668 0 R /Prev 670 0 R /Next 672 0 R >> endobj 674 0 obj << /Title (Old-style mode bytes) /Dest [ 490 0 R /FitB ] /Parent 670 0 R /Next 675 0 R >> endobj 675 0 obj << /Title (Fast PS/2 mode byte access) /Dest [ 497 0 R /FitB ] /Parent 670 0 R /Prev 674 0 R >> endobj 676 0 obj << /Title (ADB Protocol) /Dest [ 428 0 R /FitB ] /Parent 666 0 R /Prev 680 0 R /Next 669 0 R /First 681 0 R /Last 682 0 R /Count 12 >> endobj 677 0 obj << /Title (API basics) /Dest [ 466 0 R /FitB ] /Parent 669 0 R /Next 679 0 R >> endobj 678 0 obj << /Title (Sample program) /Dest [ 487 0 R /FitB ] /Parent 669 0 R /Prev 679 0 R >> endobj 679 0 obj << /Title (Information available from the API) /Dest [ 477 0 R /FitB ] /Parent 669 0 R /Prev 677 0 R /Next 678 0 R >> endobj 680 0 obj << /Title (Serial Protocol) /Dest [ 358 0 R /FitB ] /Parent 666 0 R /Prev 693 0 R /Next 676 0 R /First 694 0 R /Last 695 0 R /Count 15 >> endobj 681 0 obj << /Title (Electrical interface) /Dest [ 428 0 R /FitB ] /Parent 676 0 R /Next 692 0 R >> endobj 682 0 obj << /Title (Data reporting) /Dest [ 455 0 R /FitB ] /Parent 676 0 R /Prev 683 0 R /First 684 0 R /Last 685 0 R /Count 3 >> endobj 683 0 obj << /Title (Command set) /Dest [ 434 0 R /FitB ] /Parent 676 0 R /Prev 687 0 R /Next 682 0 R /First 688 0 R /Last 689 0 R /Count 4 >> endobj 684 0 obj << /Title (Default packet format) /Dest [ 455 0 R /FitB ] /Parent 682 0 R /Next 686 0 R >> endobj 685 0 obj << /Title (Absolute packet format) /Dest [ 458 0 R /FitB ] /Parent 682 0 R /Prev 686 0 R >> endobj 686 0 obj << /Title (CDM Relative mode packet format) /Dest [ 458 0 R /FitB ] /Parent 682 0 R /Prev 684 0 R /Next 685 0 R >> endobj 687 0 obj << /Title (Power-on reset) /Dest [ 434 0 R /FitB ] /Parent 676 0 R /Prev 692 0 R /Next 683 0 R >> endobj 688 0 obj << /Title (ADB Register 0) /Dest [ 434 0 R /FitB ] /Parent 683 0 R /Next 691 0 R >> endobj 689 0 obj << /Title (ADB Register 3) /Dest [ 455 0 R /FitB ] /Parent 683 0 R /Prev 690 0 R >> endobj 690 0 obj << /Title (ADB Register 2) /Dest [ 442 0 R /FitB ] /Parent 683 0 R /Prev 691 0 R /Next 689 0 R >> endobj 691 0 obj << /Title (ADB Register 1) /Dest [ 437 0 R /FitB ] /Parent 683 0 R /Prev 688 0 R /Next 690 0 R >> endobj 692 0 obj << /Title (Byte transmission) /Dest [ 431 0 R /FitB ] /Parent 676 0 R /Prev 681 0 R /Next 687 0 R >> endobj 693 0 obj << /Title (PS/2 Protocol) /Dest [ 226 0 R /FitB ] /Parent 666 0 R /Prev 709 0 R /Next 680 0 R /First 710 0 R /Last 711 0 R /Count 17 >> endobj 694 0 obj << /Title (Electrical interface) /Dest [ 358 0 R /FitB ] /Parent 680 0 R /Next 707 0 R /First 708 0 R /Last 708 0 R /Count 1 >> endobj 695 0 obj << /Title (Data reporting) /Dest [ 419 0 R /FitB ] /Parent 680 0 R /Prev 696 0 R /First 697 0 R /Last 698 0 R /Count 2 >> endobj 696 0 obj << /Title (Command set) /Dest [ 385 0 R /FitB ] /Parent 680 0 R /Prev 699 0 R /Next 695 0 R /First 700 0 R /Last 701 0 R /Count 7 >> endobj 697 0 obj << /Title (Default packet format) /Dest [ 419 0 R /FitB ] /Parent 695 0 R /Next 698 0 R >> endobj 698 0 obj << /Title (Absolute packet format) /Dest [ 423 0 R /FitB ] /Parent 695 0 R /Prev 697 0 R >> endobj 699 0 obj << /Title (Power-on reset) /Dest [ 377 0 R /FitB ] /Parent 680 0 R /Prev 707 0 R /Next 696 0 R >> endobj 700 0 obj << /Title (Serial command timing) /Dest [ 385 0 R /FitB ] /Parent 696 0 R /Next 706 0 R >> endobj 701 0 obj << /Title (Read Resolutions command) /Dest [ 415 0 R /FitB ] /Parent 696 0 R /Prev 702 0 R >> endobj 702 0 obj << /Title (Read Serial Number command) /Dest [ 411 0 R /FitB ] /Parent 696 0 R /Prev 703 0 R /Next 701 0 R >> endobj 703 0 obj << /Title (Read Model ID command) /Dest [ 402 0 R /FitB ] /Parent 696 0 R /Prev 704 0 R /Next 702 0 R >> endobj 704 0 obj << /Title (Set TouchPad Modes command) /Dest [ 398 0 R /FitB ] /Parent 696 0 R /Prev 705 0 R /Next 703 0 R >> endobj 705 0 obj << /Title (Read TouchPad Modes command) /Dest [ 388 0 R /FitB ] /Parent 696 0 R /Prev 706 0 R /Next 704 0 R >> endobj 706 0 obj << /Title (Identify TouchPad command) /Dest [ 388 0 R /FitB ] /Parent 696 0 R /Prev 700 0 R /Next 705 0 R >> endobj 707 0 obj << /Title (Byte transmission) /Dest [ 377 0 R /FitB ] /Parent 680 0 R /Prev 694 0 R /Next 699 0 R >> endobj 708 0 obj << /Title (TTL-level Serial TouchPad) /Dest [ 372 0 R /FitB ] /Parent 694 0 R >> endobj 709 0 obj << /Title (TouchPad Features) /Dest [ 91 0 R /FitB ] /Parent 666 0 R /Prev 667 0 R /Next 693 0 R /First 727 0 R /Last 728 0 R /Count 23 >> endobj 710 0 obj << /Title (Electrical interface) /Dest [ 226 0 R /FitB ] /Parent 693 0 R /Next 722 0 R /First 726 0 R /Last 726 0 R /Count 1 >> endobj 711 0 obj << /Title (PS/2 implementations) /Dest [ 318 0 R /FitB ] /Parent 693 0 R /Prev 712 0 R /First 713 0 R /Last 714 0 R /Count 2 >> endobj 712 0 obj << /Title (Data reporting) /Dest [ 298 0 R /FitB ] /Parent 693 0 R /Prev 715 0 R /Next 711 0 R /First 716 0 R /Last 717 0 R /Count 2 >> endobj 713 0 obj << /Title (The keyboard controller) /Dest [ 318 0 R /FitB ] /Parent 711 0 R /Next 714 0 R >> endobj 714 0 obj << /Title (Sample PS/2 implementation) /Dest [ 333 0 R /FitB ] /Parent 711 0 R /Prev 713 0 R >> endobj 715 0 obj << /Title (TouchPad special command sequences) /Dest [ 270 0 R /FitB ] /Parent 693 0 R /Prev 718 0 R /Next 712 0 R /First 719 0 R /Last 720 0 R /Count 2 >> endobj 716 0 obj << /Title (Default packet format) /Dest [ 298 0 R /FitB ] /Parent 712 0 R /Next 717 0 R >> endobj 717 0 obj << /Title (Absolute packet format) /Dest [ 305 0 R /FitB ] /Parent 712 0 R /Prev 716 0 R >> endobj 718 0 obj << /Title (Command set) /Dest [ 252 0 R /FitB ] /Parent 693 0 R /Prev 721 0 R /Next 715 0 R >> endobj 719 0 obj << /Title (Information queries) /Dest [ 270 0 R /FitB ] /Parent 715 0 R /Next 720 0 R >> endobj 720 0 obj << /Title (Mode setting sequence) /Dest [ 298 0 R /FitB ] /Parent 715 0 R /Prev 719 0 R >> endobj 721 0 obj << /Title (Power-on reset) /Dest [ 242 0 R /FitB ] /Parent 693 0 R /Prev 722 0 R /Next 718 0 R >> endobj 722 0 obj << /Title (Byte transmission) /Dest [ 233 0 R /FitB ] /Parent 693 0 R /Prev 710 0 R /Next 721 0 R /First 723 0 R /Last 724 0 R /Count 3 >> endobj 723 0 obj << /Title (Output to host) /Dest [ 233 0 R /FitB ] /Parent 722 0 R /Next 725 0 R >> endobj 724 0 obj << /Title (Acknowledgement of commands) /Dest [ 242 0 R /FitB ] /Parent 722 0 R /Prev 725 0 R >> endobj 725 0 obj << /Title (Input from host) /Dest [ 236 0 R /FitB ] /Parent 722 0 R /Prev 723 0 R /Next 724 0 R >> endobj 726 0 obj << /Title (Connector pinouts) /Dest [ 229 0 R /FitB ] /Parent 710 0 R >> endobj 727 0 obj << /Title (Mouse-compatible Relative mode) /Dest [ 91 0 R /FitB ] /Parent 709 0 R /Next 745 0 R >> endobj 728 0 obj << /Title (Synaptics TouchPad model numbers) /Dest [ 213 0 R /FitB ] /Parent 709 0 R /Prev 729 0 R >> endobj 729 0 obj << /Title (Principles of operation) /Dest [ 184 0 R /FitB ] /Parent 709 0 R /Prev 730 0 R /Next 728 0 R /First 731 0 R /Last 732 0 R /Count 6 >> endobj 730 0 obj << /Title (Mode byte) /Dest [ 166 0 R /FitB ] /Parent 709 0 R /Prev 737 0 R /Next 729 0 R >> endobj 731 0 obj << /Title (Sensing finger presence) /Dest [ 184 0 R /FitB ] /Parent 729 0 R /Next 736 0 R >> endobj 732 0 obj << /Title (Host interface to TouchPad) /Dest [ 194 0 R /FitB ] /Parent 729 0 R /Prev 733 0 R >> endobj 733 0 obj << /Title (TouchPad calibration) /Dest [ 194 0 R /FitB ] /Parent 729 0 R /Prev 734 0 R /Next 732 0 R >> endobj 734 0 obj << /Title (Sensing tapping gestures) /Dest [ 188 0 R /FitB ] /Parent 729 0 R /Prev 735 0 R /Next 733 0 R >> endobj 735 0 obj << /Title (Sensing motion) /Dest [ 188 0 R /FitB ] /Parent 729 0 R /Prev 736 0 R /Next 734 0 R >> endobj 736 0 obj << /Title (Filtering position data) /Dest [ 184 0 R /FitB ] /Parent 729 0 R /Prev 731 0 R /Next 735 0 R >> endobj 737 0 obj << /Title (Information queries) /Dest [ 123 0 R /FitB ] /Parent 709 0 R /Prev 738 0 R /Next 730 0 R /First 739 0 R /Last 740 0 R /Count 6 >> endobj 738 0 obj << /Title (Absolute mode) /Dest [ 94 0 R /FitB ] /Parent 709 0 R /Prev 745 0 R /Next 737 0 R /First 746 0 R /Last 747 0 R /Count 4 >> endobj 739 0 obj << /Title (TouchPad identification) /Dest [ 123 0 R /FitB ] /Parent 737 0 R /Next 744 0 R >> endobj 740 0 obj << /Title (Reading the mode byte) /Dest [ 159 0 R /FitB ] /Parent 737 0 R /Prev 741 0 R >> endobj 741 0 obj << /Title (Serial numbers) /Dest [ 159 0 R /FitB ] /Parent 737 0 R /Prev 742 0 R /Next 740 0 R >> endobj 742 0 obj << /Title (Extended capability bits) /Dest [ 151 0 R /FitB ] /Parent 737 0 R /Prev 743 0 R /Next 741 0 R >> endobj 743 0 obj << /Title (Coordinate resolution) /Dest [ 133 0 R /FitB ] /Parent 737 0 R /Prev 744 0 R /Next 742 0 R >> endobj 744 0 obj << /Title (Model ID bits) /Dest [ 126 0 R /FitB ] /Parent 737 0 R /Prev 739 0 R /Next 743 0 R >> endobj 745 0 obj << /Title (Packet rate) /Dest [ 94 0 R /FitB ] /Parent 709 0 R /Prev 727 0 R /Next 738 0 R >> endobj 746 0 obj << /Title (Absolute mode state bits) /Dest [ 100 0 R /FitB ] /Parent 738 0 R /Next 749 0 R >> endobj 747 0 obj << /Title (Absolute mode W values) /Dest [ 109 0 R /FitB ] /Parent 738 0 R /Prev 748 0 R >> endobj 748 0 obj << /Title (Absolute mode Z values) /Dest [ 109 0 R /FitB ] /Parent 738 0 R /Prev 749 0 R /Next 747 0 R >> endobj 749 0 obj << /Title (Absolute X and Y coordinates) /Dest [ 105 0 R /FitB ] /Parent 738 0 R /Prev 746 0 R /Next 748 0 R >> endobj 750 0 obj << /Title (Table of Contents) /Dest [ 1 0 R /FitB ] /Parent 667 0 R >> endobj 751 0 obj << /Producer (Acrobat Distiller 4.05 for Windows) /Creator (Microsoft Word 9.0) /Keywords (Second Edition) /ModDate (D:20010122152755-08'00') /Subject (Reference information for TouchPad system integrators) /CreationDate (D:20010122152622) /Title (Synaptics TouchPad Interfacing Guide) /Author (Dave Gillespie) >> endobj 752 0 obj << /Type /Pages /Kids [ 765 0 R 1 0 R 57 0 R 91 0 R 94 0 R 100 0 R 105 0 R 109 0 R 118 0 R 123 0 R ] /Count 10 /Parent 753 0 R >> endobj 753 0 obj << /Type /Pages /Kids [ 752 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R ] /Count 91 >> endobj 754 0 obj << /Type /Pages /Kids [ 126 0 R 130 0 R 133 0 R 140 0 R 151 0 R 159 0 R 166 0 R 174 0 R 179 0 R 184 0 R ] /Count 10 /Parent 753 0 R >> endobj 755 0 obj << /Type /Pages /Kids [ 188 0 R 194 0 R 200 0 R 209 0 R 213 0 R 220 0 R 226 0 R 229 0 R 233 0 R 236 0 R ] /Count 10 /Parent 753 0 R >> endobj 756 0 obj << /Type /Pages /Kids [ 242 0 R 246 0 R 252 0 R 257 0 R 263 0 R 270 0 R 275 0 R 283 0 R 294 0 R 298 0 R ] /Count 10 /Parent 753 0 R >> endobj 757 0 obj << /Type /Pages /Kids [ 305 0 R 309 0 R 318 0 R 325 0 R 333 0 R 337 0 R 342 0 R 348 0 R 355 0 R 358 0 R ] /Count 10 /Parent 753 0 R >> endobj 758 0 obj << /Type /Pages /Kids [ 362 0 R 366 0 R 372 0 R 377 0 R 380 0 R 385 0 R 388 0 R 398 0 R 402 0 R 411 0 R ] /Count 10 /Parent 753 0 R >> endobj 759 0 obj << /Type /Pages /Kids [ 415 0 R 419 0 R 423 0 R 428 0 R 431 0 R 434 0 R 437 0 R 442 0 R 450 0 R 455 0 R ] /Count 10 /Parent 753 0 R >> endobj 760 0 obj << /Type /Pages /Kids [ 458 0 R 462 0 R 466 0 R 474 0 R 477 0 R 487 0 R 490 0 R 497 0 R 501 0 R 514 0 R ] /Count 10 /Parent 753 0 R >> endobj 761 0 obj << /Type /Pages /Kids [ 525 0 R 541 0 R 554 0 R 566 0 R 580 0 R 594 0 R 609 0 R 622 0 R 635 0 R 647 0 R ] /Count 10 /Parent 753 0 R >> endobj 762 0 obj << /Type /Pages /Kids [ 656 0 R ] /Count 1 /Parent 753 0 R >> endobj xref 0 763 0000000000 65535 f 0000014721 00000 n 0000015256 00000 n 0000015401 00000 n 0000015544 00000 n 0000015688 00000 n 0000015832 00000 n 0000015976 00000 n 0000016120 00000 n 0000016265 00000 n 0000016410 00000 n 0000016556 00000 n 0000016702 00000 n 0000016848 00000 n 0000016994 00000 n 0000017140 00000 n 0000017286 00000 n 0000017432 00000 n 0000017578 00000 n 0000017724 00000 n 0000017870 00000 n 0000018016 00000 n 0000018162 00000 n 0000018308 00000 n 0000018454 00000 n 0000018600 00000 n 0000018746 00000 n 0000018892 00000 n 0000019038 00000 n 0000019184 00000 n 0000019330 00000 n 0000019476 00000 n 0000019622 00000 n 0000019768 00000 n 0000019914 00000 n 0000020060 00000 n 0000020206 00000 n 0000020352 00000 n 0000020498 00000 n 0000020644 00000 n 0000020790 00000 n 0000020936 00000 n 0000021082 00000 n 0000021228 00000 n 0000021374 00000 n 0000021520 00000 n 0000021666 00000 n 0000021812 00000 n 0000021958 00000 n 0000022104 00000 n 0000022250 00000 n 0000022396 00000 n 0000022542 00000 n 0000022688 00000 n 0000022833 00000 n 0000022977 00000 n 0000023153 00000 n 0000026418 00000 n 0000026806 00000 n 0000026952 00000 n 0000027098 00000 n 0000027244 00000 n 0000027390 00000 n 0000027536 00000 n 0000027682 00000 n 0000027828 00000 n 0000027974 00000 n 0000028120 00000 n 0000028266 00000 n 0000028412 00000 n 0000028558 00000 n 0000028704 00000 n 0000028850 00000 n 0000028996 00000 n 0000029142 00000 n 0000029288 00000 n 0000029434 00000 n 0000029580 00000 n 0000029726 00000 n 0000029872 00000 n 0000030018 00000 n 0000030164 00000 n 0000030310 00000 n 0000030456 00000 n 0000030602 00000 n 0000030748 00000 n 0000030894 00000 n 0000031040 00000 n 0000031186 00000 n 0000031332 00000 n 0000031495 00000 n 0000034186 00000 n 0000034341 00000 n 0000034518 00000 n 0000038918 00000 n 0000039107 00000 n 0000039253 00000 n 0000039399 00000 n 0000039545 00000 n 0000039722 00000 n 0000043156 00000 n 0000043343 00000 n 0000043490 00000 n 0000043637 00000 n 0000043815 00000 n 0000048001 00000 n 0000048180 00000 n 0000048327 00000 n 0000048505 00000 n 0000053253 00000 n 0000053472 00000 n 0000053619 00000 n 0000053765 00000 n 0000053912 00000 n 0000054059 00000 n 0000054206 00000 n 0000054353 00000 n 0000054531 00000 n 0000058677 00000 n 0000058864 00000 n 0000059011 00000 n 0000059158 00000 n 0000059323 00000 n 0000063885 00000 n 0000064043 00000 n 0000064234 00000 n 0000067462 00000 n 0000067641 00000 n 0000067788 00000 n 0000067966 00000 n 0000073144 00000 n 0000073302 00000 n 0000073480 00000 n 0000077195 00000 n 0000077398 00000 n 0000077545 00000 n 0000077692 00000 n 0000077839 00000 n 0000077986 00000 n 0000078164 00000 n 0000081456 00000 n 0000081691 00000 n 0000081838 00000 n 0000081985 00000 n 0000082132 00000 n 0000082279 00000 n 0000082426 00000 n 0000082573 00000 n 0000082720 00000 n 0000082867 00000 n 0000083032 00000 n 0000087704 00000 n 0000087915 00000 n 0000088062 00000 n 0000088209 00000 n 0000088356 00000 n 0000088503 00000 n 0000088650 00000 n 0000088828 00000 n 0000092651 00000 n 0000092854 00000 n 0000093001 00000 n 0000093148 00000 n 0000093295 00000 n 0000093441 00000 n 0000093619 00000 n 0000096872 00000 n 0000097083 00000 n 0000097230 00000 n 0000097376 00000 n 0000097522 00000 n 0000097668 00000 n 0000097815 00000 n 0000097993 00000 n 0000101932 00000 n 0000102119 00000 n 0000102266 00000 n 0000102413 00000 n 0000102578 00000 n 0000106421 00000 n 0000106608 00000 n 0000106755 00000 n 0000106902 00000 n 0000107067 00000 n 0000111260 00000 n 0000111439 00000 n 0000111586 00000 n 0000111777 00000 n 0000115816 00000 n 0000116011 00000 n 0000116158 00000 n 0000116305 00000 n 0000116452 00000 n 0000116630 00000 n 0000121144 00000 n 0000121339 00000 n 0000121486 00000 n 0000121632 00000 n 0000121778 00000 n 0000121956 00000 n 0000125955 00000 n 0000126174 00000 n 0000126321 00000 n 0000126468 00000 n 0000126614 00000 n 0000126761 00000 n 0000126908 00000 n 0000127055 00000 n 0000127220 00000 n 0000131190 00000 n 0000131369 00000 n 0000131515 00000 n 0000131680 00000 n 0000135155 00000 n 0000135358 00000 n 0000135505 00000 n 0000135652 00000 n 0000135799 00000 n 0000135946 00000 n 0000136152 00000 n 0000140085 00000 n 0000140280 00000 n 0000140427 00000 n 0000140574 00000 n 0000140721 00000 n 0000140899 00000 n 0000142576 00000 n 0000142734 00000 n 0000142912 00000 n 0000147446 00000 n 0000147625 00000 n 0000147771 00000 n 0000147949 00000 n 0000153610 00000 n 0000153768 00000 n 0000153959 00000 n 0000157688 00000 n 0000157883 00000 n 0000158030 00000 n 0000158177 00000 n 0000158324 00000 n 0000158502 00000 n 0000164921 00000 n 0000165100 00000 n 0000165247 00000 n 0000165438 00000 n 0000168965 00000 n 0000169160 00000 n 0000169307 00000 n 0000169454 00000 n 0000169601 00000 n 0000169766 00000 n 0000172603 00000 n 0000172790 00000 n 0000172937 00000 n 0000173084 00000 n 0000173275 00000 n 0000176307 00000 n 0000176502 00000 n 0000176649 00000 n 0000176796 00000 n 0000176943 00000 n 0000177121 00000 n 0000180374 00000 n 0000180577 00000 n 0000180724 00000 n 0000180870 00000 n 0000181016 00000 n 0000181162 00000 n 0000181340 00000 n 0000184970 00000 n 0000185157 00000 n 0000185304 00000 n 0000185451 00000 n 0000185642 00000 n 0000189087 00000 n 0000189298 00000 n 0000189445 00000 n 0000189592 00000 n 0000189739 00000 n 0000189886 00000 n 0000190033 00000 n 0000190211 00000 n 0000194477 00000 n 0000194712 00000 n 0000194859 00000 n 0000195006 00000 n 0000195153 00000 n 0000195300 00000 n 0000195447 00000 n 0000195594 00000 n 0000195741 00000 n 0000195888 00000 n 0000196066 00000 n 0000201833 00000 n 0000202012 00000 n 0000202159 00000 n 0000202337 00000 n 0000207041 00000 n 0000207244 00000 n 0000207391 00000 n 0000207538 00000 n 0000207685 00000 n 0000207832 00000 n 0000208023 00000 n 0000211039 00000 n 0000211218 00000 n 0000211365 00000 n 0000211543 00000 n 0000215352 00000 n 0000215571 00000 n 0000215717 00000 n 0000215864 00000 n 0000216011 00000 n 0000216158 00000 n 0000216305 00000 n 0000216451 00000 n 0000216616 00000 n 0000223204 00000 n 0000223407 00000 n 0000223554 00000 n 0000223701 00000 n 0000223848 00000 n 0000223995 00000 n 0000224186 00000 n 0000229235 00000 n 0000229446 00000 n 0000229593 00000 n 0000229740 00000 n 0000229887 00000 n 0000230034 00000 n 0000230181 00000 n 0000230346 00000 n 0000233646 00000 n 0000233825 00000 n 0000233972 00000 n 0000234174 00000 n 0000237742 00000 n 0000237929 00000 n 0000238076 00000 n 0000238223 00000 n 0000238400 00000 n 0000242507 00000 n 0000242702 00000 n 0000242849 00000 n 0000242996 00000 n 0000243143 00000 n 0000243320 00000 n 0000247005 00000 n 0000247208 00000 n 0000247355 00000 n 0000247502 00000 n 0000247649 00000 n 0000247796 00000 n 0000247985 00000 n 0000251804 00000 n 0000251962 00000 n 0000252125 00000 n 0000254110 00000 n 0000254289 00000 n 0000254436 00000 n 0000254614 00000 n 0000259433 00000 n 0000259612 00000 n 0000259759 00000 n 0000259924 00000 n 0000263799 00000 n 0000263994 00000 n 0000264141 00000 n 0000264288 00000 n 0000264435 00000 n 0000264628 00000 n 0000270429 00000 n 0000270587 00000 n 0000270815 00000 n 0000275660 00000 n 0000275938 00000 n 0000276154 00000 n 0000276312 00000 n 0000276490 00000 n 0000281102 00000 n 0000281289 00000 n 0000281436 00000 n 0000281583 00000 n 0000281761 00000 n 0000285535 00000 n 0000285693 00000 n 0000285884 00000 n 0000290347 00000 n 0000290574 00000 n 0000290721 00000 n 0000290868 00000 n 0000291015 00000 n 0000291162 00000 n 0000291309 00000 n 0000291455 00000 n 0000291602 00000 n 0000291780 00000 n 0000295591 00000 n 0000295770 00000 n 0000295916 00000 n 0000296094 00000 n 0000300072 00000 n 0000300291 00000 n 0000300438 00000 n 0000300585 00000 n 0000300732 00000 n 0000300879 00000 n 0000301026 00000 n 0000301173 00000 n 0000301351 00000 n 0000305389 00000 n 0000305568 00000 n 0000305715 00000 n 0000305893 00000 n 0000311450 00000 n 0000311629 00000 n 0000311776 00000 n 0000311954 00000 n 0000317845 00000 n 0000318024 00000 n 0000318171 00000 n 0000318362 00000 n 0000322169 00000 n 0000322356 00000 n 0000322502 00000 n 0000322649 00000 n 0000322827 00000 n 0000328386 00000 n 0000328544 00000 n 0000328722 00000 n 0000332944 00000 n 0000333102 00000 n 0000333280 00000 n 0000337051 00000 n 0000337209 00000 n 0000337400 00000 n 0000340827 00000 n 0000341014 00000 n 0000341161 00000 n 0000341308 00000 n 0000341498 00000 n 0000346614 00000 n 0000346825 00000 n 0000346972 00000 n 0000347119 00000 n 0000347266 00000 n 0000347413 00000 n 0000347560 00000 n 0000347750 00000 n 0000352952 00000 n 0000353139 00000 n 0000353286 00000 n 0000353433 00000 n 0000353598 00000 n 0000358203 00000 n 0000358361 00000 n 0000358552 00000 n 0000362666 00000 n 0000362845 00000 n 0000362991 00000 n 0000363169 00000 n 0000367236 00000 n 0000367415 00000 n 0000367562 00000 n 0000367727 00000 n 0000371021 00000 n 0000371232 00000 n 0000371404 00000 n 0000371551 00000 n 0000371698 00000 n 0000371845 00000 n 0000371992 00000 n 0000372170 00000 n 0000375988 00000 n 0000376146 00000 n 0000376311 00000 n 0000380075 00000 n 0000380302 00000 n 0000380449 00000 n 0000380596 00000 n 0000380743 00000 n 0000380890 00000 n 0000381037 00000 n 0000381184 00000 n 0000381331 00000 n 0000381509 00000 n 0000384844 00000 n 0000385002 00000 n 0000385192 00000 n 0000387886 00000 n 0000388089 00000 n 0000388236 00000 n 0000388383 00000 n 0000388530 00000 n 0000388677 00000 n 0000388868 00000 n 0000393508 00000 n 0000393687 00000 n 0000393834 00000 n 0000394012 00000 n 0000397327 00000 n 0000397579 00000 n 0000397725 00000 n 0000397872 00000 n 0000398019 00000 n 0000398166 00000 n 0000398313 00000 n 0000398460 00000 n 0000398607 00000 n 0000398754 00000 n 0000398901 00000 n 0000399048 00000 n 0000399239 00000 n 0000402725 00000 n 0000402960 00000 n 0000403107 00000 n 0000403254 00000 n 0000403401 00000 n 0000403548 00000 n 0000403695 00000 n 0000403842 00000 n 0000403989 00000 n 0000404135 00000 n 0000404313 00000 n 0000407762 00000 n 0000408038 00000 n 0000408185 00000 n 0000408332 00000 n 0000408479 00000 n 0000408626 00000 n 0000408773 00000 n 0000408920 00000 n 0000409067 00000 n 0000409214 00000 n 0000409361 00000 n 0000409508 00000 n 0000409655 00000 n 0000409802 00000 n 0000409949 00000 n 0000410127 00000 n 0000413814 00000 n 0000414066 00000 n 0000414213 00000 n 0000414360 00000 n 0000414507 00000 n 0000414654 00000 n 0000414801 00000 n 0000414948 00000 n 0000415095 00000 n 0000415242 00000 n 0000415389 00000 n 0000415536 00000 n 0000415714 00000 n 0000419206 00000 n 0000419450 00000 n 0000419597 00000 n 0000419744 00000 n 0000419891 00000 n 0000420038 00000 n 0000420185 00000 n 0000420332 00000 n 0000420479 00000 n 0000420626 00000 n 0000420773 00000 n 0000420951 00000 n 0000424563 00000 n 0000424823 00000 n 0000424970 00000 n 0000425117 00000 n 0000425264 00000 n 0000425411 00000 n 0000425558 00000 n 0000425705 00000 n 0000425852 00000 n 0000425999 00000 n 0000426146 00000 n 0000426293 00000 n 0000426440 00000 n 0000426618 00000 n 0000430111 00000 n 0000430371 00000 n 0000430518 00000 n 0000430665 00000 n 0000430811 00000 n 0000430958 00000 n 0000431105 00000 n 0000431251 00000 n 0000431397 00000 n 0000431543 00000 n 0000431690 00000 n 0000431837 00000 n 0000431984 00000 n 0000432162 00000 n 0000435655 00000 n 0000435923 00000 n 0000436070 00000 n 0000436217 00000 n 0000436364 00000 n 0000436511 00000 n 0000436658 00000 n 0000436805 00000 n 0000436952 00000 n 0000437099 00000 n 0000437246 00000 n 0000437393 00000 n 0000437540 00000 n 0000437684 00000 n 0000437862 00000 n 0000441240 00000 n 0000441492 00000 n 0000441639 00000 n 0000441786 00000 n 0000441933 00000 n 0000442080 00000 n 0000442227 00000 n 0000442374 00000 n 0000442521 00000 n 0000442668 00000 n 0000442815 00000 n 0000442962 00000 n 0000443140 00000 n 0000446489 00000 n 0000446741 00000 n 0000446888 00000 n 0000447035 00000 n 0000447182 00000 n 0000447329 00000 n 0000447476 00000 n 0000447623 00000 n 0000447770 00000 n 0000447917 00000 n 0000448064 00000 n 0000448211 00000 n 0000448389 00000 n 0000451659 00000 n 0000451903 00000 n 0000452050 00000 n 0000452197 00000 n 0000452344 00000 n 0000452491 00000 n 0000452638 00000 n 0000452785 00000 n 0000452932 00000 n 0000453079 00000 n 0000453225 00000 n 0000453403 00000 n 0000456864 00000 n 0000457083 00000 n 0000457255 00000 n 0000457402 00000 n 0000457549 00000 n 0000457694 00000 n 0000457839 00000 n 0000457984 00000 n 0000458175 00000 n 0000461094 00000 n 0000461252 00000 n 0000461403 00000 n 0000461868 00000 n 0000462304 00000 n 0000462407 00000 n 0000462518 00000 n 0000462680 00000 n 0000462860 00000 n 0000463066 00000 n 0000466277 00000 n 0000466344 00000 n 0000466485 00000 n 0000466628 00000 n 0000466786 00000 n 0000466947 00000 n 0000467068 00000 n 0000467208 00000 n 0000467333 00000 n 0000467445 00000 n 0000467563 00000 n 0000467724 00000 n 0000467826 00000 n 0000467932 00000 n 0000468073 00000 n 0000468237 00000 n 0000468349 00000 n 0000468496 00000 n 0000468655 00000 n 0000468768 00000 n 0000468882 00000 n 0000469020 00000 n 0000469141 00000 n 0000469247 00000 n 0000469353 00000 n 0000469474 00000 n 0000469595 00000 n 0000469719 00000 n 0000469881 00000 n 0000470034 00000 n 0000470181 00000 n 0000470340 00000 n 0000470453 00000 n 0000470567 00000 n 0000470688 00000 n 0000470801 00000 n 0000470917 00000 n 0000471050 00000 n 0000471178 00000 n 0000471311 00000 n 0000471445 00000 n 0000471577 00000 n 0000471701 00000 n 0000471803 00000 n 0000471968 00000 n 0000472121 00000 n 0000472274 00000 n 0000472436 00000 n 0000472551 00000 n 0000472669 00000 n 0000472851 00000 n 0000472964 00000 n 0000473078 00000 n 0000473196 00000 n 0000473307 00000 n 0000473420 00000 n 0000473541 00000 n 0000473706 00000 n 0000473812 00000 n 0000473931 00000 n 0000474053 00000 n 0000474147 00000 n 0000474268 00000 n 0000474392 00000 n 0000474563 00000 n 0000474679 00000 n 0000474794 00000 n 0000474912 00000 n 0000475039 00000 n 0000475170 00000 n 0000475291 00000 n 0000475421 00000 n 0000475588 00000 n 0000475748 00000 n 0000475863 00000 n 0000475976 00000 n 0000476097 00000 n 0000476228 00000 n 0000476356 00000 n 0000476476 00000 n 0000476593 00000 n 0000476709 00000 n 0000476823 00000 n 0000476952 00000 n 0000477087 00000 n 0000477179 00000 n 0000477512 00000 n 0000477666 00000 n 0000477808 00000 n 0000477967 00000 n 0000478126 00000 n 0000478285 00000 n 0000478444 00000 n 0000478603 00000 n 0000478762 00000 n 0000478921 00000 n 0000479080 00000 n trailer << /Size 763 /ID[<365a89889ff20675953961862f695481><365a89889ff20675953961862f695481>] >> startxref 173 %%EOF 00420773 00000 n 0000420951 00000 n gpm-1.20.4/doc/support004070000017500001750000000000001101736502000134125ustar00niconico00gpm-1.20.4/doc/support/README010060000017500001750000000002751101736502000143540ustar00niconico00This directory contains emails from/to companies, which were asked, if they wanted to help support gpm. This also includes the XFree project, perhaps sometime we can share mouse support... gpm-1.20.4/doc/support/logitech_1010060000017500001750000000030311101736502000154260ustar00niconico00Thank you for using Logitech's Electronic Technical Support. My name is Jesse. The following information addresses your original question. You may wish to print this out and/or save this on your computer. The information you are requesting is proprietary and not publicly available. Please visit our web site for all public information on our products. http://www.logitech.com/cf/index.cfm Logitech does not currently support Linux. If you have additional technical questions regarding your product, please visit our web site at www.logitech.com and submit your question. Thank you for your interest in Logitech. Regards, Jesse Logitech Customer Support --- Original Message --- From: Nico Schottelius Received: 03/05/2002 11:42am Eastern Standard Time To: eShare - Logitech Customer Support Subject: mouse support Hello! I am the Linux gpm mouse maintainer and I would like to include some more mouses from logitech into the support. Gpm is the primary Linux mouse driver. For more information about gpm visit freshmeat.net and search gpm. I only need some protocol specifications and possibly other informations from you. Do you think we can corporate ? Thanks for you answer, Nico Schottelius -- Nico Schottelius Please send your messages pgp-signed or pgp-encrypted. If you don't know what pgp is visit www.gnupg.org. (public pgp key: ftp.schottelius.org/pub/familiy/nico/pgp-key) ------ Please do not remove your unique tracking number! ------ <<#140786-104335#>> gpm-1.20.4/doc/support/logitech_2010060000017500001750000000073751101736502000154460ustar00niconico00Thank you for using Logitech's Electronic Technical Support. My name is Peggy. The following information addresses your original question. You may wish to print this out and/or save this on your computer. Following is all the information I was able to find on Linux and Logitech mice. I hope it will help you some. At this time, LINUX is not a supported operating system for Logitech pointing devices. Do not use the software which comes with the Logitech mouse. Linux has Logitech drivers built in. Run either Linuxconf (for shell use) or XF86Config and tell it you're using a Logitech mouse. There are specific entries for serial, bus, and PS2 mice. Currently, the kernel does not support USB mice. As a demand for this operating system increases, Logitech will consider implementing support for it in the future. Please visit our web site periodically for information on product announcements and releases. Configuring 3 button support in Linux (X-Free): In LINUX, you normally have only 2 button support, but it is possible to emulate a third button by pressing the left and the right button together (chording). This is a very uncomfortable solution. So, if a customer is asking for a nice solution, tell him following: Edit the file: /usr/lib/X11/Xconfig and try the following: MouseMan "/dev/mouse" Emulate3buttons and then you have 3-button-support in LINUX Configuring 3 button support in Linux ver.1.1.59: The following information was entered in the configuration file for X11R6 found in the directory: /USR/X11R6/LIB/X11 In this directory the user will find a config file called: XF86CONFIG They need to change, or make sure the information in the "POINTER" section reads as follows: Section "Pointer" Protocol "MouseMan" Device "/DEV/MOUSE" EndSection PROTOCOL specifies the mouse protocol that your mouse uses (not the make or brand of mouse). Valid types for PROTOCOL are: BusMouse, Logitech, Microsoft, MMSeries, MouseMan, MouseSystems, PS/2 & MMHitTab DEVICE specifies the device file where the mouse can be accessed. On most Linux systems, this is /DEV/MOUSE. /DEV/MOUSE is usually a link to the appropriate serial port (such as /DEV/CUA0) for serial mice, or the appropriate BusMouse device for BusMice. Just be sure the device file listed in DEVICE exists. BaudRate and SampleRate are only for some Logitech mice. An example of these, which would be added under DEVICE line are: BaudRate 9600 SampleRate 150 If you have additional technical questions regarding your product, please visit our web site at www.logitech.com and submit your question. Thank you for your interest in Logitech. Regards, Peggy Logitech Customer Support --- Original Message --- From: Nico Schottelius Received: 03/11/2002 03:59am Eastern Standard Time To: eShare - Logitech Customer Support Subject: Re: mouse support Hello Jesse! > The information you are requesting is proprietary and not publicly available. Please visit our web site for all public information on our products. http://www.logitech.com/cf/index.cfm > Logitech does not currently support Linux. It would be nice for many logitech users to get mouse devices from logitech to work under Linux. When you start sharing information or supporting Linux, please drop me a line, so I can include the support into gpm and possibly later into X. Just one more question, why don't you release those information ? What's the problem when the information are public available ? Thanks in advance, Nico Schottelius Please send your messages pgp-signed or pgp-encrypted. If you don't know what pgp is visit www.gnupg.org. (public pgp key: ftp.schottelius.org/pub/familiy/nico/pgp-key) ------ Please do not remove your unique tracking number! ------ <<#140786-104335#>> gpm-1.20.4/doc/support/logitech_3010060000017500001750000000023131101736502000154320ustar00niconico00Thank you for using Logitech's Electronic Technical Support. My name is Donald. The following information addresses your original question. You may wish to print this out and/or save this on your computer. We do not know when or if ever Logitech will support Linux. If you have additional technical questions regarding your product, please visit our web site at www.logitech.com and submit your question. Thank you for your interest in Logitech. Regards, Donald Logitech Customer Support --- Original Message --- From: Nico Schottelius Received: 03/21/2002 12:11pm Eastern Standard Time To: eShare - Logitech Customer Support Subject: Re: mouse support thanks for the information. but I am the gpm maintainer and I know all that stuff. It would just be nice, if you tell me when logitech starts to support linux, so we can work together! Greetings, Nico Schottelius -- Nico Schottelius Please send your messages pgp-signed or pgp-encrypted. If you don't know what pgp is visit www.gnupg.org. (public pgp key: ftp.schottelius.org/pub/familiy/nico/pgp-key) ------ Please do not remove your unique tracking number! ------ <<#140786-104335#>> gpm-1.20.4/doc/support/mouse-maintainer-XFree010060000017500001750000000013711101736502000177010ustar00niconico00On Sun, Feb 17, 2002 at 10:46:48PM +0100, Nico Schottelius wrote: >Hello David! > >As I am the current maintainer of gpm I found out that partly X can handle >mouse protocols better and partly gpm. Why should we not join our work ? That sounds like a good idea. >For example the X I use cannot init ps2 correclty, if synps2 was taken before. >gpm can (1.20.0 and later). >Who is the mouse maintainer in X, who may I contact ? The maintainer was Kazutaka Yokota , although I haven't heard from him ina while. I'm also interested in the mouse driver, so if you can't get in contact with him, let me know. David -- David Dawes Release Engineer/Architect The XFree86 Project www.XFree86.org/~dawes gpm-1.20.4/doc/support/mouse-maintainer-XFree.status010060000017500001750000000001041101736502000212140ustar00niconico00Didn't get any answer from . gpm-1.20.4/doc/todo004070000017500001750000000000001101753547600126615ustar00niconico00gpm-1.20.4/doc/todo/1.20.4010060000017500001750000000000151101736502000133620ustar00niconico00- soname fix gpm-1.20.4/doc/todo/1.20.5010060000017500001750000000003061101736502000133660ustar00niconico00- seperate "drivers" from the rest - remove the unneeded typedefs - add gitversion as found in gpm2! - seperate add daemon and library stuff cleanly - split off gpm.c and gpn.c - add report success gpm-1.20.4/doc/todo/1.20.6010060000017500001750000000000551076632743500134120ustar00niconico00- remove all warnings - use -Werror -W -Wall gpm-1.20.4/doc/todo/1.99.0010060000017500001750000000000531077613005200134060ustar00niconico00- splittoff gpm.c -> finished, 20080220 gpm-1.20.4/doc/todo/1.99.1010060000017500001750000000000671077613005200134140ustar00niconico00- splittoff gpn.c and startup.c => Done by 20080222 gpm-1.20.4/doc/todo/1.99.2010060000017500001750000000000541101736502000134030ustar00niconico00- begin splittoff of mice.c => no, later gpm-1.20.4/doc/todo/1.99.3010060000017500001750000000002211101736502000134000ustar00niconico00- Fixes: Remove glibc-hacks, where possible and posix conform: processConn - begin splittoff of mice.c - check for rmev (1.19.6 or 1.17.8) gpm-1.20.4/doc/todo/1.99.4010060000017500001750000000000311101736502000134000ustar00niconico00- cleanup autoconf stuff gpm-1.20.4/doc/todo/1.99.5010060000017500001750000000000311101736502000134010ustar00niconico00- finish gpm2/doc/DESIGN gpm-1.20.4/doc/todo/1.99.6010060000017500001750000000000341101736502000134050ustar00niconico00- finish main core for gpm2 gpm-1.20.4/doc/todo/1.99.7010060000017500001750000000002261101753547600134270ustar00niconico00- first vertical prototype: have on mouse input running - Add buildtest for gpm1 and gpm2 in ~/temp/gpm, based on the tar -> fix release errors gpm-1.20.4/doc/todo/1.99.8010060000017500001750000000001741101736502000134140ustar00niconico00- freebsd release: check that gpm2 compiles and runs on fbsd - double check that the os speficih code is in gpm2/os// gpm-1.20.4/doc/todo/1.99.9010060000017500001750000000000271101736502000134120ustar00niconico00- cleanly design conf/ gpm-1.20.4/gpm2004070000017500001750000000000001101736502000117765ustar00niconico00gpm-1.20.4/gpm2/cconfig004070000017500001750000000000001062163164100134135ustar00niconico00gpm-1.20.4/gpm2/out004070000017500001750000000000001101736457000126165ustar00niconico00gpm-1.20.4/gpm2/tmp004070000017500001750000000000001101502260600125745ustar00niconico00gpm-1.20.4/install-sh010070000017500001750000000112431101736502000132120ustar00niconico00#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. # # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" tranformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 gpm-1.20.4/patches004070000017500001750000000000001101736502000125605ustar00niconico00gpm-1.20.4/patches/1.20.1004070000017500001750000000000001077613005200133055ustar00niconico00gpm-1.20.4/patches/1.20.1/README010060000017500001750000000000351076632743500142550ustar00niconico00patches applied after 1.20.1 gpm-1.20.4/patches/1.20.1/ceilf1010060000017500001750000000022351076632743500144670ustar00niconico00http://ftp.frugalware.org/pub/other/people/alex/upstart-mess/source/base/gpm/gpm-1.20.1-ceilf-gcc4.patch --- gpm-1.20.1/src/Makefile.in.orig Sat Feb 1 17:15:55 2003 +++ gpm-1.20.1/src/Makefile.in Sat Feb 1 17:23:43 2003 @@ -70,6 +70,7 @@ all: gpm lib/@SHLIB@ lib/libgpm.a $(PROG) gpm: $(GOBJ) + $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $(GOBJ) @LIBS@ $(LIBS) -lm # construct dependings of sourcefiles and link sourcefiles $(DEPFILE) dep: prog/gpm-root.c @@ -139,13 +140,14 @@ $(YACC) $(YFLAGS) $< && mv y.tab.c prog/gpm-root.c # gpm-root needs an own rule, because gpm-root.c is not in $(srcdir) -prog/gpm-root: prog/gpm-root.c +prog/gpm-root: prog/gpm-root.c lib/libgpm.so $(CC) -I. @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@.o $< - $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $@.o @LIBS@ $(LIBS) lib/libgpm.a + $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $@.o @LIBS@ $(LIBS) lib/libgpm.so -prog/mouse-test: mice.o twiddler.o synaptics.o +prog/mouse-test: prog/mouse-test.o mice.o twiddler.o synaptics.o + $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS) -lm -$(PROG): lib/libgpm.so lib/@SHLIB@ lib/libgpm.a +$(PROG): lib/libgpm.so # Subdirectory lib/ lib/libgpm.a: $(LOBJ) gpm-1.20.4/patches/1.20.1/debian004070000017500001750000000000001077613005200145275ustar00niconico00gpm-1.20.4/patches/1.20.1/debian/001_logging.patch010060000017500001750000000107721077613005200176430ustar00niconico00Index: b/src/report.c =================================================================== --- a/src/report.c 2008-02-25 06:48:59.000000000 +0200 +++ b/src/report.c 2008-02-25 06:55:31.000000000 +0200 @@ -91,30 +91,33 @@ void gpm_report(int line, char *file, in #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); vsyslog(LOG_INFO | LOG_USER, text, ap2); -#endif +#else fprintf(stderr,GPM_STRING_INFO); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); +#endif break; case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); vsyslog(LOG_DAEMON | LOG_WARNING, text, ap2); -#endif +#else fprintf(stderr,GPM_STRING_WARN); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); +#endif break; case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); -#endif +#else fprintf(stderr,GPM_STRING_ERR); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); +#endif break; case GPM_STAT_OOPS: @@ -145,20 +148,21 @@ void gpm_report(int line, char *file, in #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); vsyslog(LOG_DAEMON | LOG_WARNING, text, ap2); -#endif +#else if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_WARN); vfprintf(console,text,ap); fprintf(console,"\n"); fclose(console); } +#endif break; case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); -#endif +#else if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); vfprintf(console,text,ap); @@ -172,6 +176,7 @@ void gpm_report(int line, char *file, in fprintf(console,"\n"); fclose(console); } +#endif break; case GPM_STAT_OOPS: Index: b/src/lib/report-lib.c =================================================================== --- a/src/lib/report-lib.c 2008-02-25 06:48:59.000000000 +0200 +++ b/src/lib/report-lib.c 2008-02-25 06:55:31.000000000 +0200 @@ -27,19 +27,30 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) { char *string = NULL; + int log_level; va_list ap; va_start(ap,text); switch(stat) { - case GPM_STAT_INFO : string = GPM_TEXT_INFO ; break; - case GPM_STAT_WARN : string = GPM_TEXT_WARN ; break; - case GPM_STAT_ERR : string = GPM_TEXT_ERR ; break; - case GPM_STAT_DEBUG: string = GPM_TEXT_DEBUG; break; - case GPM_STAT_OOPS : string = GPM_TEXT_OOPS; break; + case GPM_STAT_INFO : string = GPM_TEXT_INFO ; + log_level = LOG_INFO; break; + case GPM_STAT_WARN : string = GPM_TEXT_WARN ; + log_level = LOG_WARNING; break; + case GPM_STAT_ERR : string = GPM_TEXT_ERR ; + log_level = LOG_ERR; break; + case GPM_STAT_DEBUG: string = GPM_TEXT_DEBUG; + log_level = LOG_DEBUG; break; + case GPM_STAT_OOPS : string = GPM_TEXT_OOPS; + log_level = LOG_CRIT; break; } +#ifdef HAVE_VSYSLOG + syslog(log_level, string); + vsyslog(log_level, text, ap); +#else fprintf(stderr,"%s[%s(%d)]:\n",string,file,line); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); +#endif if(stat == GPM_STAT_OOPS) exit(1); /* may a lib function call exit ???? */ } Index: b/src/lib/liblow.c =================================================================== --- a/src/lib/liblow.c 2008-02-25 06:55:45.000000000 +0200 +++ b/src/lib/liblow.c 2008-02-25 06:56:06.000000000 +0200 @@ -198,8 +198,6 @@ int Gpm_Open(Gpm_Connect *conn, int flag char* sock_name = 0; static char *consolename = NULL; - gpm_report(GPM_PR_DEBUG,"VC: %d",flag); - /*....................................... First of all, check xterm */ if ((term=(char *)getenv("TERM")) && !strncmp(term,"xterm",5)) { gpm-1.20.4/patches/1.20.1/debian/008_sun_repeat_000010060000017500001750000000022161077613005200176440ustar00niconico00Index: b/src/mice.c =================================================================== --- a/src/mice.c 2008-02-25 05:19:31.000000000 +0200 +++ b/src/mice.c 2008-02-25 05:21:00.000000000 +0200 @@ -515,6 +515,16 @@ static int M_sun(Gpm_Event *state, unsi return 0; } +static int R_sun(Gpm_Event *state, int fd) +{ + signed char buffer[3]; + + buffer[0]= (state->buttons ^ 0x07) | 0x80; + buffer[1]= state->dx; + buffer[2]= -(state->dy); + return write(fd,buffer,3); +} + static int M_msc(Gpm_Event *state, unsigned char *data) { state->buttons= (~data[0]) & 0x07; @@ -2455,7 +2465,7 @@ Gpm_Type mice[]={ {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, R_ps2}, {"sun", "For Sun (Sparc) mice.", "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, R_sun}, {"summa", "For a Summa/Genius tablet in absolute mode (906, 1212B, EasyPainter...)", "", M_summa, I_summa, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_summa}, gpm-1.20.4/patches/1.20.1/debian/030_segfault010060000017500001750000000012021077613005200167170ustar00niconico00Index: b/src/lib/liblow.c =================================================================== --- a/src/lib/liblow.c 2008-02-25 06:17:55.000000000 +0200 +++ b/src/lib/liblow.c 2008-02-25 06:18:24.000000000 +0200 @@ -386,11 +386,11 @@ int Gpm_Open(Gpm_Connect *conn, int flag /*....................................... Error: free all memory */ err: gpm_report(GPM_PR_ERR,"Oh, oh, it's an error! possibly I die! "); - do { + while(gpm_stack) { new=gpm_stack->next; free(gpm_stack); gpm_stack=new; - } while(gpm_stack); + } if (gpm_fd>=0) close(gpm_fd); if (sock_name) { unlink(sock_name); gpm-1.20.4/patches/1.20.1/debian/outdated004070000017500001750000000000001077613005200163405ustar00niconico00gpm-1.20.4/patches/1.20.1/debian/outdated/002_force_repeat_000010060000017500001750000000075771077613005200217570ustar00niconico00Index: b/src/headers/message.h =================================================================== --- a/src/headers/message.h 2008-02-17 22:39:31.000000000 +0200 +++ b/src/headers/message.h 2008-02-17 22:40:43.000000000 +0200 @@ -92,6 +92,7 @@ " -R mouse-type enter repeater mode. X should read /dev/gpmdata\n" \ " like it was a mouse-type device. Default is MouseSystems.\n" \ " You can also specify \"raw\" to relay the raw device data.\n" \ + " -F Always force repeat mode.\n" \ " -s sample-rate sets the sample rate (default %d)\n" \ " -S [commands] enable special commands (see man page)\n" \ " -t mouse-type sets mouse type (default '%s')\n" \ Index: b/src/daemon/gpm.c =================================================================== --- a/src/daemon/gpm.c 2008-02-16 16:14:40.000000000 +0200 +++ b/src/daemon/gpm.c 2008-02-17 22:40:43.000000000 +0200 @@ -330,7 +330,8 @@ static inline char *getMouseData(int fd, if((i=m_type->packetlen-howmany)) /* still to get */ do { j = read(fd,edata-i,i); /* edata is pointer just after data */ - if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep && j > 0) + if ((kd_mode!=KD_TEXT || option.force_repeat) + && fifofd != -1 && opt_rawrep && j > 0) write(fifofd, edata-i, j); i -= j; } while (i && j); @@ -445,7 +446,7 @@ static inline int processMouse(int fd, G /*....................................... we're a repeater, aren't we? */ - if (kd_mode!=KD_TEXT) { + if (kd_mode!=KD_TEXT || option.force_repeat) { if (fifofd != -1 && ! opt_rawrep) { if (m_type->absolute) { /* hof Wed Feb 3 21:43:28 MET 1999 */ /* prepare the values from a absolute device for repeater mode */ @@ -997,7 +998,7 @@ int old_main() if (ioctl(fd, KDGETMODE, &kd_mode) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_KDGETMODE); close(fd); - if(kd_mode != KD_TEXT && !option.repeater) { + if(kd_mode != KD_TEXT && !option.repeater && !option.force_repeat) { wait_text(&mouse_table[1].fd); maxfd=max(maxfd,mouse_table[1].fd); readySet=connSet; Index: b/src/gpn.c =================================================================== --- a/src/gpn.c 2008-02-17 22:39:31.000000000 +0200 +++ b/src/gpn.c 2008-02-17 22:40:43.000000000 +0200 @@ -234,7 +234,7 @@ struct Gpm_Type *find_mouse_by_name(char void cmdline(int argc, char **argv) { extern struct options option; - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TuvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:FR::s:S:t:TuvV::23"; int opt; /* initialize for the dual mouse */ @@ -262,6 +262,10 @@ void cmdline(int argc, char **argv) if (option.repeater_type == 0) option.repeater_type = "msc"; which_mouse=mouse_table+2; break; + case 'F': option.repeater++; option.force_repeat = 1; + if (option.repeater_type == 0) + option.repeater_type = "msc"; + break; case 'o': add_mouse(GPM_ADD_OPTIONS,optarg); gpm_report(GPM_PR_DEBUG,"options: %s",optarg); opt_options = optarg; break; /* GO AWAY */ Index: b/src/headers/daemon.h =================================================================== --- a/src/headers/daemon.h 2008-02-17 22:42:33.000000000 +0200 +++ b/src/headers/daemon.h 2008-02-17 22:42:56.000000000 +0200 @@ -27,6 +27,7 @@ struct options { int autodetect; /* -u [aUtodetect..'A' is not available] */ + int force_repeat; /* force click repeat */ int no_mice; /* number of mice */ int repeater; /* repeat data */ char *repeater_type; /* repeat data as which mouse type */ gpm-1.20.4/patches/1.20.1/debian/reject004070000017500001750000000000001077613005200160035ustar00niconico00gpm-1.20.4/patches/1.20.1/debian/reject/001_missing_V_option.patch010060000017500001750000000012561077613005200230140ustar00niconico00Index: b/src/gpn.c =================================================================== --- a/src/gpn.c 2008-02-25 05:18:28.000000000 +0200 +++ b/src/gpn.c 2008-02-25 05:19:23.000000000 +0200 @@ -283,6 +283,7 @@ void cmdline(int argc, char **argv) case 'u': option.autodetect = 1; break; case 'T': opt_test++; break; case 'v': printf(GPM_MESS_VERSION "\n"); exit(0); + case 'V': /* Compat code */ break; case '2': opt_three = -1; break; case '3': opt_three = 1; break; default: exit(usage("commandline")); gpm-1.20.4/patches/1.20.1/esr-manpage1010060000017500001750000000033151076632743500156040ustar00niconico00From: esr@thyrsus.com To: rubini@gnu.org Subject: problems in gpm-types.7 Date: Sat, 20 Nov 2004 23:02:13 -0500 > This is automatically generated email about problems in a man page for which you appear to be responsible. If you are not the right person or list, tell me and I will attempt to correct my database. See http://catb.org/~esr/doclifter/problems.html for details on how and why these patches were generated. Feel free to email me with any questions. Note: These patches do not change the mod date of any manual page. You may wish to do that by hand. Problems with gpm-types.7: My records indicate that you have accepted this patch, so this is just a reminder. Please try to get a release with the patch incorporated to the Fedora folks in time for Fedora Core 4. 1. Missing or garbled name section. The most common form of garbling is a missing - or extra -. Or your manual page may have been generated by a tool that doesn't emit a NAME section as it should. These problems make it impossible to lift the page to DocBook. They can also confuse some implementations of man -k. --- gpm-types.7 2003-02-16 19:50:16.000000000 -0500 +++ gpm-types.7 2003-02-16 19:51:06.000000000 -0500 @@ -1,8 +1,7 @@ .TH GPM-TYPES 7 "July 2000" .UC 4 .SH NAME -This manual page describes what pointer types (mice, tablets, -etc) are currently managed by gpm. +gpm-types \- pointer types (mice, tablets, etc.) managed by gpm. .br The information below is extracted from the texinfo file, which is the preferred source of information. ----------------------------- -- Eric S. Raymond _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/jaroslav-liblow.diff010060000017500001750000000007741076632743500173500ustar00niconico00*** liblow.old Wed Sep 27 21:59:54 2006 --- liblow.c Wed Sep 27 21:59:59 2006 *************** *** 258,263 **** --- 258,265 ---- goto err; } /* do we really need this check ? */ + if(option.consolename==NULL) goto err; + if(tty==NULL) goto err; if(strncmp(tty,option.consolename,strlen(option.consolename)-1) || !isdigit(tty[strlen(option.consolename)-1])) { gpm_report(GPM_PR_ERR,"strncmp/isdigit/option.consolename failed"); gpm-1.20.4/patches/1.20.1/luc-gpm_etouch.patch010060000017500001750000000202121076632743500173300ustar00niconico00diff -Naur gpm-1.20.1_old/doc/README.etouch gpm-1.20.1/doc/README.etouch --- gpm-1.20.1_old/doc/README.etouch Thu Jan 1 01:00:00 1970 +++ gpm-1.20.1/doc/README.etouch Tue Nov 22 10:43:06 2005 @@ -0,0 +1,52 @@ + +This file tells how to use gpm and X with a Elotouch screen with +serial interface at 9600 Baud No parity. + + CALIBRATION + ----------- + +Calibration is done in console mode using the program "elocalib" +available from http://www.dobit.com/emblin/pub/elocalib.tgz +See also elocalib --help +To start calibration at console 128x48, for screen 1024x786 +> elocalib /dev/ttyS0 -c128 -r48 -w1024 -h768 + +Touch the upper-left corner and write down the coordinates Xmin, Ymin +Touch the bottom-right corner and write down the coordinates Xmax, Ymax +Update the file gpm-calibration with this coordinates + +> cat /usr/local/etc/gpm-calibration +# EloTouch calibration coordinates Xmin Ymin Xmax Ymax +4010 80 80 4010 + + + GPM OPERATION + ------------- + +> gpm -m /dev/ttyS0 -t etouch -o clickontouch -Rsumma + + + X OPERATION + ----------- + +In order to use the touchscreen in X, you should install in your +system the "gpmsumma" module +available from http://www.annet.pl/~anowak/mtouch/gpmsumma_drv.o + or from http://www.dobit.com/emblin/pub/gpm_etouch.tgz + +/usr/lib/X11/modules/input/gpmsumma_drv.o + + +Then add the following sections to your XF86config: + +Section "InputDevice" + Identifier "EloTouch" + Driver "gpmsumma" + Option "Device" "/dev/gpmdata" + Option "SendCoreEvents" "On" +EndSection + +Section "ServerLayout" + InputDevice "EloTouch" "SendCoreEvents" + ... +EndSection diff -Naur gpm-1.20.1_old/src/headers/message.h gpm-1.20.1/src/headers/message.h --- gpm-1.20.1_old/src/headers/message.h Tue Dec 24 23:57:16 2002 +++ gpm-1.20.1/src/headers/message.h Fri Nov 18 11:47:28 2005 @@ -192,7 +192,7 @@ #define GPM_MESS_INCORRECT_COORDS "%s: %s :%i: Incorrect chord \"%s\"" #define GPM_MESS_INCORRECT_LINE "%s: %s :%i: Incorrect line:\"%s\"" #define GPM_MESS_FIRST_DEV "Use -m device -t protocol [-o options]!" - +#define GPM_MESS_ELO_CALIBRATE "%s: etouch: calibration file %s absent or invalid, using defaults" /* warnings */ #define GPM_MESS_REQUEST_ON "Request on vc %i > %i" diff -Naur gpm-1.20.1_old/src/mice.c gpm-1.20.1/src/mice.c --- gpm-1.20.1_old/src/mice.c Tue Dec 24 23:57:16 2002 +++ gpm-1.20.1/src/mice.c Tue Nov 22 10:42:22 2005 @@ -1391,6 +1391,88 @@ #undef DIF_TIME } +/* + * This decoder is copied and adapted from the above mtouch. + */ +static int elo_click_ontouch = 0; /* the bigger the smoother */ +static int M_etouch(Gpm_Event *state, unsigned char *data) +{ /* + * This is a simple decoder for the EloTouch touch screen devices. + * ELO format SmartSet UTsXXYYZZc 9600,N,8,1 + * c=checksum = 0xAA+'T'+'U'+s+X+X+Y+Y+Z+Z (XXmax=YYmax=0x0FFF=4095) + * s=status bit 0=init touch 1=stream touch 2=release + */ +#define ELO_CLICK_ONTOUCH /* ifdef then ButtonPress on first Touch + else first Move then Touch*/ + int x, y; + static int avgx=-1, avgy; /* average over time, for smooth feeling */ + static int upx, upy; /* keep track of last finger-up place */ + static struct timeval uptv, tv; /* time of last up, and down events */ + + #define REAL_TO_XCELL(x) (x * win.ws_col / 0x3FFF) + #define REAL_TO_YCELL(y) (y * win.ws_row / 0x3FFF) + + #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) + #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ + (t2.tv_usec-t1.tv_usec)/1000) + + if (data[2]&0x04) /* FINGER UP - Release */ + { upx = avgx; /* ignore this x, y */ + upy = avgy; /* store Finger UP possition */ + GET_TIME(uptv); /* set time for the next finger-down */ + tv.tv_sec = 0; /* NO DRAG */ + avgx=-1; /* FINGER IS UP */ + state->buttons = 0; + return 0; + } + + /* NOW WE HAVe FINGER DOWN */ + x = data[3] | (data[4]<<8); x&=0xfff; + y = data[5] | (data[6]<<8); x&=0xfff; + x = REALPOS_MAX * (x - gunze_calib[0])/(gunze_calib[2]-gunze_calib[0]); + y = REALPOS_MAX * (y - gunze_calib[1])/(gunze_calib[3]-gunze_calib[1]); + if (x<0) x = 0; if (x > REALPOS_MAX) x = REALPOS_MAX; + if (y<0) y = 0; if (y > REALPOS_MAX) y = REALPOS_MAX; + + if (avgx < 0) /* INITIAL TOUCH, FINGER WAS UP */ + { GET_TIME(tv); + state->buttons = 0; + if (DIF_TIME(uptv, tv) < opt_time) + { /* if Initial Touch immediate after finger UP then start DRAG */ + x=upx; y=upy; /* A:start DRAG at finger-UP position */ + if (elo_click_ontouch==0) state->buttons = GPM_B_LEFT; + } + else /* 1:MOVE to Initial Touch position */ + { upx=x; upy=y; /* store position of Initial Touch into upx, upy */ + if (elo_click_ontouch==0) tv.tv_sec=0; /* no DRAG */ + } + realposx = avgx = x; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = y; state->y = REAL_TO_YCELL(realposy); + return 0; + } /* endof INITIAL TOUCH */ + + + state->buttons = 0; /* Motion event */ + if (tv.tv_sec) /* draging or elo_click_ontouch */ + { state->buttons = GPM_B_LEFT; + if (elo_click_ontouch) + { x=avgx=upx; /* 2:BUTTON PRESS at Initial Touch position */ + y=avgy=upy; + tv.tv_sec=0; /* so next time 3:MOVE again until Finger UP*/ + } /* else B:continue DRAG to current possition */ + } + + realposx = avgx = (9*avgx + x)/10; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = (9*avgy + y)/10; state->y = REAL_TO_YCELL(realposy); + return 0; + + #undef REAL_TO_XCELL + #undef REAL_TO_YCELL + #undef GET_TIME + #undef DIF_TIME +} + + /* Support for DEC VSXXX-AA and VSXXX-GA serial mice used on */ /* DECstation 5000/xxx, DEC 3000 AXP and VAXstation 4000 */ /* workstations */ @@ -2123,6 +2205,61 @@ return type; } + +/* simple initialization for the elo touchscreen */ +static Gpm_Type *I_etouch(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + struct termios tty; + FILE *f; + char s[80]; + int i, calibok = 0; + + /* Calibration config file (copied from I_gunze, below :) */ + #define ELO_CALIBRATION_FILE SYSCONFDIR "/gpm-calibration" + /* accept a few options */ + static argv_helper optioninfo[] = { + {"clickontouch", ARGV_BOOL, u: {iptr: &elo_click_ontouch}, value: !0}, + {"", ARGV_END} + }; + parse_argv(optioninfo, argc, argv); + + /* Set speed to 9600bps (copied from I_summa, above :) */ + tcgetattr(fd, &tty); + tty.c_iflag = IGNBRK | IGNPAR; + tty.c_oflag = 0; + tty.c_lflag = 0; + tty.c_line = 0; + tty.c_cc[VTIME] = 0; + tty.c_cc[VMIN] = 1; + tty.c_cflag = B9600|CS8|CREAD|CLOCAL|HUPCL; + tcsetattr(fd, TCSAFLUSH, &tty); + + /* retrieve calibration, if not existent, use defaults (uncalib) */ + f = fopen(ELO_CALIBRATION_FILE, "r"); + if (f) { + fgets(s, 80, f); /* discard the comment */ + if (fscanf(f, "%d %d %d %d", gunze_calib, gunze_calib+1, + gunze_calib+2, gunze_calib+3) == 4) + calibok = 1; + /* Hmm... check */ + for (i=0; i<4; i++) + if ((gunze_calib[i] & 0xfff) != gunze_calib[i]) calibok = 0; + if (gunze_calib[0] == gunze_calib[2]) calibok = 0; + if (gunze_calib[1] == gunze_calib[4]) calibok = 0; + fclose(f); + } + if (!calibok) { + gpm_report(GPM_PR_ERR,GPM_MESS_ELO_CALIBRATE, option.progname, ELO_CALIBRATION_FILE); + /* "%s: etouch: calibration file %s absent or invalid, using defaults" */ + gunze_calib[0] = gunze_calib[1] = 0x010; /* 1/16 */ + gunze_calib[2] = gunze_calib[3] = 0xff0; /* 15/16 */ + } + return type; +} + + + /* Genius Wizardpad tablet -- Matt Kimball (mkimball@xmission.com) */ static Gpm_Type *I_wp(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) @@ -2239,6 +2376,9 @@ {"calr", "Calcomp UltraSlate - relative mode", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0}, + {"etouch", "EloTouch touch-screens (only button-1 events, by now)", + "", M_etouch, I_etouch, STD_FLG, + {0xFF, 0x55, 0xFF, 0x54}, 7, 1, 0, 1, NULL}, #ifdef HAVE_LINUX_INPUT_H {"evdev", "Linux Event Device", "", M_evdev, I_empty, STD_FLG, gpm-1.20.4/patches/1.20.1/lucas-03-broken_dev.patch010060000017500001750000000010201076632743500200540ustar00niconico00--- gpm-1.20.1/src/lib/liblow.c.orig 2006-03-07 12:06:59.000000000 -0300 +++ gpm-1.20.1/src/lib/liblow.c 2006-03-07 12:09:30.000000000 -0300 @@ -217,6 +217,10 @@ int Gpm_Open(Gpm_Connect *conn, int flag /* check whether we know what name the console is: what's with the lib??? */ if(checked_con == 0) { option.consolename = Gpm_get_console(); + if (!option.console) { + gpm_report(GPM_PR_ERR,"unable to open gpm console, check your /dev filesystem!\n"); + goto err; + } checked_con++; } gpm-1.20.4/patches/1.20.1/mike-destdir010060000017500001750000000007251076632743500157070ustar00niconico00Makefile.include.in utilizes DESTDIR, but it currently doesnt do anything with it :) here's a small change where the behavior is to set ROOT equal to DESTDIR only if the user hasnt specified ROOT via cmdline --- Makefile.include.in +++ Makefile.include.in @@ -7,3 +7,5 @@ ROOT = -DESTDIR = $(ROOT) +ifndef ROOT +ROOT = $(DESTDIR) +endif -mike _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/mike-gunze1010060000017500001750000000011441076632743500154560ustar00niconico00this one is from Fedora ... gunze_calib is declared as int[4], so referring to idx #4 is obviously a bad idea :) --- gpm-1.20.1/src/mice.c +++ gpm-1.20.1/src/mice.c @@ -2112,7 +2112,7 @@ for (i=0; i<4; i++) if (gunze_calib[i] & ~1023) calibok = 0; if (gunze_calib[0] == gunze_calib[2]) calibok = 0; - if (gunze_calib[1] == gunze_calib[4]) calibok = 0; + if (gunze_calib[1] == gunze_calib[3]) calibok = 0; fclose(f); } if (!calibok) { -mike _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/mike-parallel-build010060000017500001750000000042131076632743500171360ustar00niconico00if you try to build with `make -j` it'll break for two reasons ... (1) the toplevel makefile's all target depends on 'dep' and 'do-all' ... if you build this in parallel on a fast machine, 'do-all' will start executing before 'dep' has finished processing, causing the build to fail. here's the small fix for that (i indented the 'done' to match the rest of the shell code): --- Makefile.in +++ Makefile.in @@ -25,3 +25,3 @@ -all: dep do-all +all: do-all @@ -61,3 +61,3 @@ # do-all goes to all subdirectories and does all -do-%: +do-%: dep @target=`echo $@ | $(SED) -e 's/^do-//'`; \ @@ -69,3 +69,3 @@ fi; \ -done + done (2) the doc subdir's all target depends on $(MANPAGES). the $(MANPAGES) rule executes a for loop on all the $(MANPAGES). the problem is that make will fork 5 children (1 per manpge) and try to execute the $(MANPAGES) target and each child will stomp the work of the others. the fix is to put all the manpages under one target ('gpm.man') and have all depend on that instead of $(MANPAGES). also, i moved the 'all' to the top so that way it's the default target when you run just `make`. --- doc/Makefile.in +++ doc/Makefile.in @@ -32,6 +32,8 @@ MANPAGES = gpm.8 mev.1 gpm-root.1 gpm-types.7 mouse-test.1 +all: $(srcdir)/gpm.info gpm.man + # HTML (texi2html) %.html: %.texinfo if [ $(TEXI2HTML) != "no" ]; then $(TEXI2HTML) $< ;fi @@ -55,13 +57,13 @@ $(AWK) -f $(srcdir)/mktxt $< > $@ # MAN (-) -$(MANPAGES): doc.gpm $(srcdir)/manpager +gpm.man: doc.gpm $(srcdir)/manpager $(AWK) -f $(srcdir)/manpager doc.gpm for i in gpm-root.1 gpm-types.7 gpm.8 mev.1 mouse-test.1; do \ expand $$i | sed s/^'[ ]*'//g > $$i.new; \ mv $$i.new $$i; \ done; - + touch gpm.man # DVI # This rule is somewhat a rewrite of texi2dvi. I like make more than sh :-) @@ -97,8 +99,6 @@ # Main portion -all: $(srcdir)/gpm.info $(MANPAGES) - # why gpmdoc.ps and gpm.ps?? # there is no gpm.ps in my tree and no rule to generate gpm.ps. gpmdoc.ps: gpm.ps -mike _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/mike-sed1010060000017500001750000000011141076632743500150760ustar00niconico00our ppc64 team hit a snag with gpm and linux headers based on 2.6 kernel: http://bugs.gentoo.org/show_bug.cgi?id=66222 simple fix is to change the second '*' glob to a '+': - $(SED) 's/^\(.*\)\.o\([ :]*\)/\1.o \1.lo\2/g' >> $(DEPFILE) ; done + $(SED) 's/^\(.*\)\.o\([ :]+\)/\1.o \1.lo\2/g' >> $(DEPFILE) ; done this hasnt caused any known regressions on any other arch that has tested gpm in Gentoo (alpha/amd64/arm/hppa/ia64/mips/ppc/ppc64/sparc/x86) -mike _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/mike-serialconabort010060000017500001750000000026011076632743500172530ustar00niconico00here's a patch which detects & aborts if gpm is run on a serial console --- src/headers/message.h +++ src/headers/message.h @@ -125,2 +125,3 @@ #define GPM_MESS_OPEN_CON "Opening console failed." +#define GPM_MESS_OPEN_SERIALCON "We seem to be on a serial console." #define GPM_MESS_READ_FIRST "Error in read()ing first: %s" --- ./src/gpm.c.org Sat Feb 23 16:42:23 2002 +++ ./src/gpm.c Tue Mar 12 00:20:19 2002 @@ -38,2 +38,3 @@ #include /* VT_GETSTATE */ +#include /* for serial console check */ #include /* KDGETMODE */ @@ -178,8 +154,21 @@ static inline int open_console(const int mode) { int fd; - - if ((fd=open(option.consolename, mode)) < 0) - gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON); + struct stat sb; + int maj, twelve=12; + struct serial_struct si; + + fd = open(option.consolename, mode); + if (fd != -1) { + fstat(fd, &sb); + maj = major(sb.st_rdev); + if (maj != 4 && (maj < 136 || maj > 143)) { + if (ioctl (fd, TIOCLINUX, &twelve) < 0) { + if (si.line > 0) + gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_SERIALCON); + } + } return fd; + } else + gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON); } -mike _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/mike-setgid1010060000017500001750000000013271076632743500156100ustar00niconico00here's a small patch to make sure setgid/setuid actually worked --- src/prog/gpm-root.y +++ src/prog/gpm-root.y @@ -433,9 +433,10 @@ /*====================================================================*/ void f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + if (setgid(pass->pw_gid) < 0 || + initgroups(pass->pw_name, pass->pw_gid) < 0 || + setuid(pass->pw_uid) < 0) + exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); -mike _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/nico-consolename1010060000017500001750000000020031076632743500166270ustar00niconico00well, I noticed that my vim caught a segfault in the linux console everytime it called Gpm_Open() a second time. I've tracked down this problem to the initialization of the option variable in Gpm_Open(). It's initialized to NULL everytime Gpm_Open() is called, but to the value of Gpm_get_console() only the first time. Also this variable is declared extern but included from a header file, too. It works for me now, with the patch below. Nico Huber PS. I'm not subscribed to this list, so please CC me when replying. --- liblow.c.orig 2005-01-28 05:18:35.000000000 +0100 +++ liblow.c 2005-01-28 05:19:58.000000000 +0100 @@ -193,5 +193,4 @@ char *term = NULL; int i; - extern struct options option; static int checked_con = 0; struct sockaddr_un addr; @@ -200,6 +199,4 @@ char* sock_name = 0; - option.consolename = NULL; - gpm_report(GPM_PR_DEBUG,"VC: %d",flag); _______________________________________________ gpm mailing list gpm@lists.linux.it http://lists.linux.it/listinfo/gpm gpm-1.20.4/patches/1.20.1/rodney-wheel-patch-1.99.2.1.txt010060000017500001750000000137441077613005200205310ustar00niconico00diff -aurp gpm-1.99.2.1-orig/src/daemon/processmouse.c gpm-1.99.2.1/src/daemon/processmouse.c --- gpm-1.99.2.1-orig/src/daemon/processmouse.c 2008-02-23 06:05:03.000000000 +1100 +++ gpm-1.99.2.1/src/daemon/processmouse.c 2008-03-14 21:30:32.000000000 +1100 @@ -159,7 +159,11 @@ int processMouse(int fd, Gpm_Event *even /* up and down, up and down, ... who does a do..while(0) loop ??? and then makes a break into it... argh ! */ - if (!event->dx && !event->dy && (event->buttons==oldB)) + /* rodney 13/mar/2008 wheel movement similar to mouse movement + * must also be excluded from time (click) processing */ + if (!event->dx && !event->dy + && !event->wdx && !event->wdy + && (event->buttons==oldB) ) do { /* so to break */ static long awaketime; /* diff -aurp gpm-1.99.2.1-orig/src/headers/daemon.h gpm-1.99.2.1/src/headers/daemon.h --- gpm-1.99.2.1-orig/src/headers/daemon.h 2008-02-23 06:05:03.000000000 +1100 +++ gpm-1.99.2.1/src/headers/daemon.h 2008-03-14 21:36:17.000000000 +1100 @@ -60,8 +60,10 @@ typedef struct Gpm_Type { char *name; char *desc; /* a descriptive line */ char *synonyms; /* extra names (the XFree name etc) as a list */ + /* mouse specific event handler: */ int (*fun)(Gpm_Event *state, unsigned char *data); + /* mouse specific initialisation function: */ struct Gpm_Type *(*init)(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv); diff -aurp gpm-1.99.2.1-orig/src/headers/gpm.h gpm-1.99.2.1/src/headers/gpm.h --- gpm-1.99.2.1-orig/src/headers/gpm.h 2008-02-23 06:05:03.000000000 +1100 +++ gpm-1.99.2.1/src/headers/gpm.h 2008-03-14 21:32:49.000000000 +1100 @@ -70,6 +70,17 @@ extern "C" { #define GPM_NODE_FIFO _PATH_DEV "gpmdata" /*....................................... Cfg buttons */ +/* Each button has one bit in the 16 bit buttons field. + * Mouse movement and wheel movement are not associated with a button + * i.e. buttons=GPM_B_NONE in these cases + * (except for ms3 mouse, for reasons unknown?) + * The middle button if pressed down (or clicked) is independent of + * the wheel "device" which it happens to be associated with + * The use of GPM_B_UP/DOWN with ms3 is unclear. Maybe the wheel + * could be rolled forward then backward + * and this would generate a 'click' event on 'button 5' GPM_B_UP, + * but really the expected behaviour of wheel is movement, typically + * used for jump scrolling or for jumping between fields on a form. */ #define GPM_B_DOWN 32 #define GPM_B_UP 16 @@ -124,10 +135,17 @@ enum Gpm_Margin {GPM_TOP=1, GPM_BOT=2, G typedef struct Gpm_Event { unsigned char buttons, modifiers; /* try to be a multiple of 4 */ unsigned short vc; - short dx, dy, x, y; + short dx, dy, x, y; /* displacement x,y for this event, and absolute x,y */ enum Gpm_Etype type; + /* clicks e.g. double click are determined by time-based processing */ int clicks; enum Gpm_Margin margin; + /* wdx/y: displacement of wheels in this event. Absolute values are not + * required, because wheel movement is typically used for scrolling + * or selecting fields, not for cursor positioning. The application + * can determine when the end of file or form is reached, and not + * go any further. + * A single mouse will use wdy, "vertical scroll" wheel. */ short wdx, wdy; } Gpm_Event; diff -aurp gpm-1.99.2.1-orig/src/lib/liblow.c gpm-1.99.2.1/src/lib/liblow.c --- gpm-1.99.2.1-orig/src/lib/liblow.c 2008-02-23 06:05:03.000000000 +1100 +++ gpm-1.99.2.1/src/lib/liblow.c 2008-03-14 21:44:12.000000000 +1100 @@ -198,7 +198,7 @@ int Gpm_Open(Gpm_Connect *conn, int flag char* sock_name = 0; static char *consolename = NULL; - gpm_report(GPM_PR_DEBUG,"VC: %d",flag); + // gpm_report(GPM_PR_DEBUG,"VC: %d",flag); /*....................................... First of all, check xterm */ diff -aurp gpm-1.99.2.1-orig/src/mice.c gpm-1.99.2.1/src/mice.c --- gpm-1.99.2.1-orig/src/mice.c 2008-02-23 06:05:03.000000000 +1100 +++ gpm-1.99.2.1/src/mice.c 2008-03-14 21:39:42.000000000 +1100 @@ -552,9 +552,10 @@ static int R_imps2(Gpm_Event *state, int (dy > 0 ? 0x20 : 0); buffer[1] = dx & 0xFF; buffer[2] = (-dy) & 0xFF; - buffer[3] = - (state->buttons & GPM_B_UP ? -1 : 0) + - (state->buttons & GPM_B_DOWN ? 1 : 0); + if (state->wdy > 0) buffer[3] = 0xff; + if (state->wdy < 0) buffer[3] = 0x01; + if (state->wdx > 0) buffer[3] = 0xfe; + if (state->wdx < 0) buffer[3] = 0x02; return write(fd,buffer,4); @@ -651,20 +652,25 @@ static int M_imps2(Gpm_Event *state, un state->dy = (data[0] & 0x20) ? -(data[2] - 256) : -data[2]; /* The wheels.. */ - switch (data[3] & 0x0f) { - case 0x0e: state->wdx = +1; break; - case 0x02: state->wdx = -1; break; - case 0x0f: state->wdy = +1; break; - case 0x01: state->wdy = -1; break; + unsigned char wheel = data[3] & 0x0f; + if (wheel > 0) { + // use the event type GPM_MOVE rather than GPM_DOWN for wheel movement + // to avoid single/double/triple click processing: + switch (wheel) { + /* rodney 13/mar/2008 + * The use of GPM_B_UP / GPM_B_DOWN is very unclear; + * only mouse type ms3 uses these + * For this mouse, we only support the relative movement + * i.e. no button is set (same as mouse movement), wdy changes +/- + * according to wheel movement (+ for rolling away from user) + * wdx (horizontal scroll) is for a second wheel. They do exist! */ + case 0x0f: state->wdy = +1; break; + case 0x01: state->wdy = -1; break; + case 0x0e: state->wdx = +1; break; + case 0x02: state->wdx = -1; break; + } } - - /* old code: - - did it signed: - state->buttons |= (data[3]<0) * GPM_B_UP + (data[3]>0) * GPM_B_DOWN; - - and unsigned: - state->buttons |= (data[3]>127) * GPM_B_UP + (data[3]<127) * GPM_B_DOWN; - */ - + return 0; } gpm-1.20.4/patches/1.20.1/samuel-liblow-patch-gpm-1.20.3010060000017500001750000000016471077613005200204670ustar00niconico00--- gpm-1.20.3~pre3/src/lib/liblow.c.orig 2008-03-21 19:48:29.000000000 +0000 +++ gpm-1.20.3~pre3/src/lib/liblow.c 2008-03-21 19:49:00.000000000 +0000 @@ -249,7 +249,7 @@ gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); memcpy(tty, consolename, strlen(consolename)-1); sprintf(&tty[strlen(consolename) - 1], "%i", flag); - } else { /* use your current vc */ + } else if (flag==0) { /* use your current vc */ if (isatty(0)) tty = ttyname(0); /* stdin */ if (!tty && isatty(1)) tty = ttyname(1); /* stdout */ if (!tty && isatty(2)) tty = ttyname(2); /* stderr */ @@ -259,7 +259,8 @@ } conn->vc=atoi(&tty[strlen(consolename)-1]); - } + } else /* a default handler -- use console */ + tty=strdup(consolename); if (gpm_consolefd == -1) if ((gpm_consolefd=open(tty,O_WRONLY)) < 0) { gpm-1.20.4/patches/1.20.1/thomas-0001-Avoid-reusing-of-va_list.patch010060000017500001750000000116101076632743500230430ustar00niconico00From 1d829d74e667262300a942b70ae0965578c86854 Mon Sep 17 00:00:00 2001 From: Tomas Janousek Date: Wed, 25 Jul 2007 11:33:40 +0200 Subject: [PATCH] Avoid reusing of va_list This fixes https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=246219 (gpm uses variable argument lists incorrectly) Signed-off-by: Tomas Janousek --- src/report.c | 33 +++++++++++++++++++++++---------- 1 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/report.c b/src/report.c index 9bfb9d9..80be414 100644 --- a/src/report.c +++ b/src/report.c @@ -72,9 +72,16 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) { FILE *console = NULL; - va_list ap; + va_list ap, ap3; +#ifdef HAVE_VSYSLOG + va_list ap2; +#endif va_start(ap,text); + va_copy(ap3, ap); +#ifdef HAVE_VSYSLOG + va_copy(ap2, ap); +#endif switch(option.run_status) { /******************** STARTUP *****************/ @@ -83,7 +90,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_INFO: #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); - vsyslog(LOG_INFO | LOG_USER, text, ap); + vsyslog(LOG_INFO | LOG_USER, text, ap2); #endif fprintf(stderr,GPM_STRING_INFO); vfprintf(stderr,text,ap); @@ -93,7 +100,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); - vsyslog(LOG_DAEMON | LOG_WARNING, text, ap); + vsyslog(LOG_DAEMON | LOG_WARNING, text, ap2); #endif fprintf(stderr,GPM_STRING_WARN); vfprintf(stderr,text,ap); @@ -103,7 +110,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #endif fprintf(stderr,GPM_STRING_ERR); vfprintf(stderr,text,ap); @@ -113,7 +120,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_OOPS: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #endif fprintf(stderr,GPM_STRING_OOPS); vfprintf(stderr,text,ap); @@ -130,14 +137,14 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_INFO: #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); - vsyslog(LOG_INFO | LOG_USER, text, ap); + vsyslog(LOG_INFO | LOG_USER, text, ap2); #endif break; case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); - vsyslog(LOG_DAEMON | LOG_WARNING, text, ap); + vsyslog(LOG_DAEMON | LOG_WARNING, text, ap2); #endif if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_WARN); @@ -150,7 +157,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #endif if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); @@ -161,7 +168,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) if((console = fopen(option.consolename,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); - vfprintf(console,text,ap); + vfprintf(console,text,ap3); fprintf(console,"\n"); fclose(console); } @@ -170,7 +177,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) case GPM_STAT_OOPS: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS); - vsyslog(LOG_DAEMON | LOG_ERR, text, ap); + vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #endif fprintf(stderr,GPM_STRING_OOPS); vfprintf(stderr,text,ap); @@ -208,6 +215,12 @@ void gpm_report(int line, char *file, int stat, char *text, ... ) break; } /* switch for current modus */ + + va_end(ap); + va_end(ap3); +#ifdef HAVE_VSYSLOG + va_end(ap2); +#endif } /* gpm_report */ -- 1.5.2.2 gpm-1.20.4/patches/1.20.1/thomas-0002-Replace-OPEN_MAX-with-sysconf-_SC_OPEN_MAX.patch010060000017500001750000000034611076632743500255360ustar00niconico00From 8d9d39bf4733590730170644d39e11a1e754795b Mon Sep 17 00:00:00 2001 From: Tomas Janousek Date: Wed, 25 Jul 2007 11:38:27 +0200 Subject: [PATCH] Replace OPEN_MAX with sysconf(_SC_OPEN_MAX) The OPEN_MAX constant was removed in Linux 2.6.23 (commit 77293034696e3e0b6c8b8fc1f96be091104b3d2b) and sysconf is the POSIX way to do it. Signed-off-by: Tomas Janousek --- src/prog/gpm-root.y | 4 +++- src/special.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/prog/gpm-root.y b/src/prog/gpm-root.y index 2be902f..7910ce6 100644 --- a/src/prog/gpm-root.y +++ b/src/prog/gpm-root.y @@ -526,7 +526,9 @@ int f_bgcmd(int mode, DrawItem *self, int uid) open("/dev/null",O_RDONLY); /* stdin */ open(consolename,O_WRONLY); /* stdout */ dup(1); /* stderr */ - for (i=3;iarg,(char *)NULL); exit(1); /* shouldn't happen */ default: return 0; diff --git a/src/special.c b/src/special.c index 7fad664..ecb2d16 100644 --- a/src/special.c +++ b/src/special.c @@ -157,7 +157,9 @@ int processSpecial(Gpm_Event *event) open(GPM_NULL_DEV,O_RDONLY); /* stdin */ open(option.consolename,O_WRONLY); /* stdout */ dup(1); /* stderr */ - for (i=3;i˙Š:lş6n“ƒ’ś—„]hŞ6§>DZě5ŹjÖČť|4÷Űov Ä$Ç%g!Űě|óÍ|łłăS(ŇB*@e¨)ƒ1S,“<ńÉTH—-ŕŞ..(Oč8a@Äjޒá4UŠ%<—­4›X֐ţ`1OX‹‹0É#S*‘—Kˆs! H¸`Ëź†˙¸|î_C#€ëŠÔ•ó„+ËúÄ2čB!ccí2Jc˜0§*œBcJ#ĨŒ/8M LEœđP–V2KsÉ0 Tv˲Žq)ĂL0q}sPHĆf˜] Y. ĆĚ´Ź„Q‰âŇ Šcś„šb˛eu\۲>Š(cKËr]-!k…¨›O~ůŽ9öŮ|ä¤ă‘Ž×Ćwâ[ÍfsŹb4€tČóḁ÷Ćńhęgű7Ŕ%Ѝâ!ŞQ0Ídťq9Ÿ. ˙isr!škSOłćžŽsĽR!{ĐhDTŃ[rŻ€Ź|bĂé)´mDž>B•1Ňź6ŽxýܢŰ%ÚŰGĎxáŚ#Ţ}„'{řŔî–eă žů ţ0|/ŰĐëm^ŽŕňËpôűčĎ/śA#ÁrĘXůüeŢÇůő÷Ď:éG”.Ĺś0›ŠFŤ^Iِ|"pĂ)ÍěĆž"‚ľz÷ŢÚ:°1xĽĄÝˇíî]ńş3C<ĐůU:ˇ*ťýőţ˝­Ě˝Zˆ‰1•gfrKÍJs}=Đ\ÚGśŐ\›’ę,aœÇˇÁžŘ5q`óťďť†G+˘˙› F9?uͲ]ĺ1 ßkU̶܌Ť‹ţMšĽUWŸtŸsÎĎŻ.ěc{ăč=ďřupůŠ YřÇmďíG$ńłŽŚáž:zŰňD+ŹnÂg\"–(ÚŘ5ĄŽçŸ8ŕůÇvwW`Oď:˝‚żÉęŒtUžaLÚbÜ[m/ăâ˙Ç7qŠĂqŠjœ`+gÓwˌ+ֈ#=œ@ÓŢ#@ˇđp4Ζĺ°_ЌSě"=ă…ú@ŕ‡3ÔcźnžM›1T–Tű˜Cfš}o`"륁š;tp¤Ď‹­¨Á>*vŽĄé{o||â’&¸)ćĚLđŰťŢz;/_k˛búTŹN*wBîhcIc¨Ö5<{5jCfŠLq(Wec1ŹIbƒ ínél§@DTsörŞ!™ůZ80ÍĹ܁łoÇ8CžÝœúW—Îv€˙§€Đ$˜{ř x$ ů˙P™ůSŠGS×ăŠ˙`PŸÉşŁeM’t‰űŃɄ‹ ,šš>m‰ÖbŒćI.uAĘj>ŠÉK65¨ oŞeýÉlM™S gpm-1.20.4/patches/done/applied/MS3-PATCH-ANDREW.gz010060000017500001750000000027270760216311400177750ustar00niconico00‹Kx<MS3-PATCH-ANDREW­WmsÚFţýŠO' #ˆÄŠ!v“ŘąK'N2‰;éL&ĂşŽÖ ՝ Şăţö>wHˆý! čn÷١g÷Žw }ÜŁ31˘Ŕ÷đďÄ4ľƒ^ťÓëźź †ßöąóV†)} §ŠÖ"’š˘y–jŃsŽé\iR"ᤧ‚fL‡SŇ)ŢEâiRÓKěΧ"$5…i,ł4ö >(wĺŘlÍÓěJQšQ’ę–ăźťň*U…Zg&Xkˇżĺ7',Ž™KŘ1%8Ľ‰uáTŒ$KJ–3ĐÄ8W„•Xu(3Á´Č¨ŽňŮ,Í´L&V î‰Čő ljE*Ľą\ŔMl9FgňZŹŇťSj˝DPů,BxJĺBő§I—[Ž”nĚůš˜ó€Ďâáëk‘hoş.‡h–É$”@u‰e#Š3–ĽEâ"ŇLÁđz&–ęŞR€˜K=ľŽžżżžţůŢÚ.Nß}zKŁ\k¤ čĘ#= żM9ő4sbsVD đe@˘Ä"3D ŁBéŘÄ7–…6RWeÉđbš€ ‘D2j RS$˜BÔ(4QđX¸(8ŃIʅĺĆFî<Ł˘ČT¤yÍĐ(A …Ň‚÷Œ‘B¨†"œiöšó…“żđÇ.ÝŘ]*•ą$z¤4Đ<6•8˘FťOŁL°Ťţ–`°%ŘÜ%8^,~„ŘŢÜBź]’ćbhNY21„˘ąšH=S-Ôb$Rh] ŢśĄjŠ29™jS ĹŹ ‘ 6Á)ŁkZ+2ŹGŠ?ˆ ˸)f\Đ? Ť–i˘L~ń<–¤c&#^ELÂqó€ŢŠ…áă5@˘ÂQŹ(Űu„Ăš*…dşm ˜'#éëRşę”öŚt,9{ ßܒ÷7äťnżT°ü3ň{äw‹ÓšGG՗ýŐôr­4Ę)˜Ď†ŃžĂ0CĎ8˝Âŕérőü9¸Ć°Ýh—3×íoŔ;ąpÝ;¸`Žšv˙űŰoöŘű&^ˆľ‘g ůđäK5r}ŘA.ł7ćŽÓ¸ą)5^bŕŒ?wż`VÝŕ P˝nűv߈ó…GźŔł]1ÂçŤÉy×_Žâ`ŻoRޖĹxóúě˛,éşjŕ÷ďSźœžžyíVŠJą}żâ‡ÁůďĽÉu‹P\roÓ˘?žWŃî[Ĺö2=öl‰d,őĐęő =ÁŻîbĎÜţ*ÁmS (=Ś˙üʼnßßĘ|Ýn™Űpfż´Sě°S|ßN`íťíëvşËp*ŢÍ3ŠE}Ě=hx]{ Cá‹á(›——ƒk–အˇˆřŞ pĚEđ0ĹqR+‡|9†Ş; t¸cź[҂訝ćŞéhßô‹k¨ÁđÔ{FŔ?ôń‰%pȲŕŸż-/?řťńĄéŠ…żń~ëQ)˝kĎBÝěĄ÷ö<Úťa–ŞCy=l°$‹\jR§Š÷˛jÚ%ŕ{ކO{ł§…Gƒá,™ytňńfČÇËÓáٛso9Ŕ@מ‡ťhü(;VůH„śĄ#Ú;‰ůińVč‹2¸N˜\Ë\ŘŤÄÝS-ŸŐžÔĚŻľđĚ,áMzîžoĺč'Ůů™`lÜR gpm-1.20.4/patches/done/applied/OPEN_MAX.gz010060000017500001750000000037770760216311400170340ustar00niconico00‹Kx<OPEN_MAX˝WűSŰHţý]žÚ;[˛~ĘŔÂH؁rd+ˇE ŇؚCšŃjF<6ľűˇ_dcůÁ÷ˉ$U™éÇ×Ý_÷4§šHÁ‚›¸€Ÿ 0Ç œ~Ёç8ŽqEU‘s뒨8€˝Y–Z$J?LYngšÄfęŔ8Ś {¤9ŹgĄ8”a,”ÂóBÚ"ŸĄĄ˘L€ů[JX^ĎăâFp˙‹ŔiŽÁ넟”ŢÁńˇô†`9řŐlL5ěˆK; ĺ‹T4•vDÁütr~őŁ&˜žëŮ}ßîvmˇi€öôôôdŻÁƒ'Śb¸žÜ\žŔ"Ď÷üő(zƒÁfžôFs3›é’‡uÔŰý8ďȖö2؞­‚?pńÄçIŞ×ŻLŇŔî ěAĎî͓´‘ܡ3ôNľ"CĘ%Svˆf"B’ÄB*řćzŰÁ÷׌ąƒ.ë˜ŔźD™){nVŽO´gcŁýԝzŽ7Ö¤mŻbé~7pŃ$ĂBévW"Đ!äôˇ‚JľfýGYĺk?F…šŽG+şë|ŻÄ0Ó2ĚŮ=ą+•ÎŞ\'œ1ëžńNZĽĄźÖôď Íƒśąó?Ŕ“ gsçgQľaŘ[Ą}áň˙ ŽŕëđŽň0Ć6~ÓyĆ2škÚ[w"˘Přżľ0JüΒ„X׊¨B0Ôk×úą€3˙đîËŮńyŁ‘Ó8ÝčžçÚ˛Č2jĆ'ňČř ڌ“$y™^s8\<%‰*Ҍ%ZH'µݑíWC’č[l@˜%ě>lg’” 1H‰ł‹.››îŠ6Qô…fâ>ĄŠm ZÄ"ţ‰ć6á/ ŚĽvŮŠTÂHň‚Łî=#ˆĄáœÝłœŕŒˆŕĚX⁠Ŕa5ŃźeY5ä8CŮŹ#32’ŘáÎÍţŒ6ݸ~š8:óŽŃjľjj5 ŹQU_WÇĹĺׯ–ßĂC°ü^ť-üw‡‡üń0)pÚS8íř ~D󜋵3Ü :ÉIŞĎ[Ëó„Ľ éŁ…kâ xƕ7đXťďťmׇVßk{˝€D>°°œŹ°‹•DžG“ý†Œ éőΊą4OńvÉŤşdž4Z]˜ˆœž† ž Ľkv­č#în°Ű1Zss‰Ŕ’3M‘,˝ĂǏߥäŮ|,j­ď:Â)â•'F °˛úwˆ×Ł1 ŃDR}őj-a0WĄŕSóîúĂÝBş9Örl fîď[nłĹ7j\ł‡ĽUąŠŃúĂhĐŮĹ]e÷)şy$IAIp´9MGœBZId2öŎĺíRÍ]AĽŒH‰<\ßwŒ42>Äl]WL2ńuş;)ĺwK5ܖžŹV`˙ó—óóqŠÎʜܢ 8=;?ŃÇ\Š„Nu‘ JƒYÚśžśđwřx9šťš:ťŸ˙Ň,m!*ĆĄˇ&ŻÔ‹ŁĺoŻVä5ϗňQ‘™.Ţmű*yDŠĺ­y:ąÉöý1Ű{%7°VŤ a"$5YEŢ5ѕĆin(ĚýŃg&^żg2n´ĺ?VŘhĎŠŇ6+ć45eęzL•AhŔą(’r†Ć^ ľJ3Ž•!ŚyĐoűľ4żh§:ůĂŔ?ÖëÎ_XˆÖ——ę;gӲɪѯă €_DĚâ #Íj…S>yA;[W(Ÿ„{ě]6‹ŕKVvŁžšm=¤ôëSš"弥Ľ_jwţœ폙ÁDŽ"XPO,Ôč"ňb`<¸â–!Ýâ)ŽAíÇ_ĄĂ(_Sä•ö/c‚ŁS_MÇ× ƒ¨ôoőÖRnwwÎЋ€VÔK‚öűqs Ô +č pÍ÷ý@ż˝”,ŇĆ|‘Úô;ÖĂřžiačgpm-1.20.4/patches/done/applied/VSXXX-AA-patch.gz010060000017500001750000000034270760216311400200720ustar00niconico00‹|;Ý<VSXXX-AA-patchľWmoŰ6ţ<ýŠƒlv,9˛œÄЃlI7-6oă­ÉŠ"`$Úć,‰šHŮNłţ÷’_wč6L0¨ŢďĺyČóÇŇuxĂsBƒŒép zĘ4°(Rʈƒ– Š,“š†_Żonnźós¨×Ś2œńȊpVkK#ÇN^žC"B…âÜ?ŔE˙Œes– Y(XČ|Ś4ÓBŚŞ¸: X(řďŽăyŕ4ŤWxׂĄüř΄ #NS˛~IŜçJčc¸ŒXŞf.\É€ŚÓôţÓŐ4؋{ qćň,RA+›´&ke1Žxy&|6GvóJŤé8“,ńÚ­ŔoůŢ\-—KĄŽIʉńź"ĎËyX`sŽĎ)_xc6֚-Zu_ĺážÉf+ܘŰřŠ9óţNëŤŔ÷Aڇ˝ƒ tZ~uAӌNłŮÜm˝Ô>đü~Ď?ěľŸiŸ×îž{M{o~ه R ƒťI‘~äőË,šëĎ9~Ů3łÜ(RÇ$íë"ř.Ţžž˝ôřä ö÷ŕşÄŇ ŚÜ+ź)ž ÄĆv2EŁ{űdŐJ¸Á!úťqÉVÇÄp~semßTRćť˝J›…xU&rĄ5O1~{ßďîˇŰ†?°\™ŻžĎxő„îgąH‹Ľf“–Ě'•‰D"|FWe’ĹœœEč)‡,—Z†2•ńĽBŠ%ĹڋPć9W™L#‘Ně[¸ÓŒˆ°Lk;&Śfu ăc1’ç¤i §š… "Čc;ŔQ¤JLRŒ7œ˛ö"ŚYĂi>čÇÝMp?Ůtw0…PÁ]mĄzHä=88ĆZŢ ­ Ăü*bč.ƒ1Fß]h#Tef^\Q„[ –ꁴ;ĽÜƒćÖ˝f 7>mío]]h<¤ń€Ćm}R~-°úđ­÷VŤńcżĄńŕÇÁKü4 q8xIÚ× ŠWz7_2’öh*ňJšŇžý’ŃhŰőƒ=Ň4u2 $šŢx‰œó+šťÝ!vť-†Î°^ h×CÝ+čޜĹW¤ńX3ĎJÚç[×ZĺK¤‘2ü|ZfŽś´L§ËşÔZ‚HB#Ç`ĚH‹$Á1ÂBŒ…!Ďt‰ŠÚE ‘#sTEš$ӆžÜľW5\éôZ›3•L|‹’xl6ŐYŹäçL4JĂíEDć”-Üç”Î9K6Ő <1E‰YőÎ¸:%ę •ë™\đĎ /łŐjżmŔ˝X†…Y šGfĆEÚÍŻnŮP‘ŹAY„+˘Œ!ß[ s7Uţşkś•U6Š“Tćś-X%w]ˆƒ§t[b9u”1a*ľ—ĹŤń2qóyHÚCŇŇÄĐ˙$5 ЁżÍěíĽwąOŽ÷Éń>9ާĽűd´OÚýŇqYäzşľôgĆ[YvźĄoů™óš0˛˜Ţ œŔcę"ǢIJDR¸Â_˙Č뗢<Ďą6fęYYüĽď{ţ˛=îA*KÁúŘ@ ÂýűžĐMÓ PbsËB'˛ËT‚;Ź”' Bh1áôš+^Z‘ˆÂÜąHŽ6„ęh1\AFdf yBTăâÝ44ľÁJ˛EgŘPźďŹż N ăďýß`:ş'Ń'ëëٶ߀ď­tűôŔ+ˇtśuücŁc%ŁT>‘NÎą€)řřň }-Ą LZHm۝l6{‹ĘÔÝBDX“SěO>#1ĺb2ŐĽő‘݀úČĂ ëboąî#M{0zČřź˝łí^ÝŘGUŸŕ”ŐU\#L—dćÚب¸đâȌmĆ1›¨Ć‰•Ľďb uŚ˝ďpŸ;=]÷$ xŹţ l[5]E5ú+Ť&ĄlÓéq*żUĽwRĂ=˝°‚"Ĺł€Ĺâ#ŻNˆLŒžJՄkmú3–Ň1°6ľăBSĽ>D1ŸJÎânT›Í(EŢt,á &řŰs›"íîĄ)BtŽÜŚUňŠĂ~˙áô‘´kKŒ!ŐFx˘Š„‰î%Vˇć:›^ÖPjpgÄ]ʟ˝żş>†?áztq÷úÇËmń×Łż<6ů^RÖËçc˙“ ‡T[[ |§kTEĆČ?¤ç濇ý˙ ”:ÜIĚüÖ_Ӛť•vB wĂ*Ťóa˙§—öá狋ÍК_ß Ę†‰Ąuž„fóž`H˝š[{gîpUőżo…ŃWő੧́‰ÍĹ*ÇҜ7W-•ŮŁvVˆ ›ŘʇQg!tŸ„ŕ8Çy˛ xgpm-1.20.4/patches/done/applied/andreas_mohr_1.gz010060000017500001750000000113410760216311400204320ustar00niconico00‹Kx<andreas_mohr_1Í[í[ŰH’˙Œ˙ŠĎlòąd;€Yf °ěAÂČÍŢM2~dŠmë%­Ôź,űˇßŻş%YvlňrűáƲşťJŐő^ŐĎŠ•%oiĎZVŰÚożÜštnĹŘDŰ+ĂíPÜW§j­VkÔÖoÂŁwŽ$ę’ÝXťƒ^ŸěNÇŞ5›ÍgPn];’ŢˆŃ>u:ƒŢţŔę1œ];:˘Ö˗ć.5Ő÷ŃQ~¤×Q8ö'Y"čeĄ[ÜŐ¨FžŸJ7N8ŘRň˘V9Vkm%3jIƒ´ƒhRüLĽ#ł´¸sw*¨ nŽĎŽkÍěŇ 2/GFüďGLúĄÄ"Ą8J¤…&eŠ pce E÷!%~z[ó։ëýéńÉĺé*[ő誐ôčÖM&´|l˛^şÝAł| iŚEłKäŇô*˘ą-úfŃ0§”ńNRrB$xńW(…đ|%jsx 9)݋ 0Ë5Š3URq'' 7Ke„…qřŽŁśÁ´ÖÍT@îţKĽ”Fš4N&Ą)ɈϣƸíˇ)×q7N)ÍbfłŃŽ5ŸCóŐX蚡˘1oégVq[×YĚ4Óě¸|ޅslÔÍf˘çŃLHHł<ĽŠsâ(ˆ˘[‚†D °ÓVß홖EM}ažłrĽÔđ„Ž§˝,ńÉbj˝4:ś)băŘĆQ›÷C(oŻCň@ÁO8ž>;źRqü| ç$’ۈ\7KLŠą;ˆ2Ě ~֌ů5mĹ9e ˙V`ĘOkÍ*Šôűp€ťYŕŃ| €sjČi”MŚ4J2ěÁ {gNŠUäËAhËÓb8 F˛‚ľœ5lĐ?_ŕ‡P+Ľ:+¤Íb6WŘŽSčťQzťél›Ľm}Këˇ)ě2€ ÓüIÎX‚i9ľ4Égńž”@W@M՚_‡a3čŇáâCŻß˝}s~öáýůŰ3LąvXö¤ž°v@Ďa• T#JćToď@“ę4()ŤČ’&śŐňDhÁˆŮHŠr ž)•Š›řąTŞcRř“Š„"'ÂË\(ö’˛ÎĆNŒÝ4X]ÁUť§۸RťEĄ(çÚ(œŕ9đĂÂa=UťuÜŰ0ÂÎ&‚u'Ľƒ–Qk~Čý H=qî|Î@ }r$¨íFíěÖŕ=żá§˝Âç* ýOŤôÝ[R쀚fšÝ4źzĆúXÉęôLzł2˝=WŚ—Ň{С˝—Ăč*ěrŞĂ°Ö"žîîłÔŐ7 ˙élŚL]r›ˆS*Œˆ*fňSăňříŐńŮéľAŰ˙˘2iyŠŻěWĄiÝţő×üňëŇ0,WŰöfśçŘ7p}1ťŽé‹Ů•Ô˛Űô{ĎňźşÂň^žőh–ďŠěrŻČ.Ňl$}v˝Ç4ĄĘEâ,‰\áR‘ŔK)UdĹžđĂ쁝H ‹¨ÂÝ9A&łŘs¤€í†rúÄaäŢd `řŤˇˆ3tíN#)Eŕ#‡ü3GžŁt1Ҏ’É/ľć—a>‚üާWL ű2&NHwęÄ9`ÁŽ7‹ރ%ëř[Ě­[1ˇu…t-bHŒlkćwşĎ ­Źdvg`÷ŠČşťŚeSS_XhOĘRvސť||lo|úŘŢĄÇZ‹hy4VfĚzÝ8¨5—&1ˇ˜˘'ŻŞ"Ťëáş^ZŽ~|Ş/ăUëW‹UĹ#>n3î͸e]Ç)žXË{žřvĆ+¨ŽŰš_Ës}ĺ›ěÂ7˝}wrzqţöôđ°OôH1˛N9ŚúGŠ˙Ő+:jŻľÖÎŰt)ÂlđÓƒüÇééŐaŒhîüŃ^?Łäşž;iňŹG_™^ĺÔĘôJadăosa´ [u/്"iÁ5ËęšűČČpą::’˙ÔHG~ˆŹĚŘŃ^7đGęWöXÎçCi„ąź‚,ŰÓ ńKŻŢż;3¨ÄWbi9#8΂ŕŤŢŸœ^ÁŐť˛•íUƒĹˇ˘`%Q$Űn‰­ˆŰm¸y՛ýÔ8{÷ꯎůő޸žżž6rBBŢÃéZysŃżQ=˜`wôÔÄ:•P[—H&”2XŢ!Đ/(ƒ†ZŽ2]ĨŠËęv͗pY¸ě)-ŘŮnýß?Ű;˙5wśQE#ÎäyŸĚBQ:ű.Ę G:‹¤YÇS=e’6rCâR‰śéžŤĽłx6ź™Ç‚łŘ‘ŕ5vŇTxmbššőâťČ1ľB[BŰ!/ń ž›AŇč™ 4Űß&WŐtë g(ّh>˘\,peaęOB$ ü{×ţtöĐß3_r]>ň'Ț“ źÎŔ`:X½ŽĹîuŘŢYÂw[3Ěsƒaę˙C4˜Ó;Ţ圸’ G‚/ëšFĄ*¸8Ă=a;Ţ=&Y˜zyU?§4ΆĄDĐDČÄwBIŹÄ˙UŠK¨íhtXR—T÷‘×4—˙ďäăCő$~ŠT…'!ŰČ ü\Ŕ,ľ8‰\‘Śj{Kâ-¸Ę—ĎÎĹÄéĎŞě•ôöUá܇ôtxS ÇÔűăhěчpĺôâýŔť&Î=¨5j9ĆÇ⇆™ ů™­_œäžIa°ňLQjrŤ\„ŠĘ˝îŔŢŁËÓ˛ö÷÷ą]âl˘ř<(ĆC˜ŰĚ•MŚÚx*Pźâl´ŕoŒ™×\FFą…ϢŁ-}rɤ2Éŕ*Ľ?ŔÉ@Ň2ůŰ>X€ň*pә7^¨%&5*đ˙ŕţŔśńöĂŅą Ělm4P[Ţ Sá"@đłň;˜ĄŐétš‹%Pwą„ďŒ^büb÷;FŢ.)ú%Vˇ*÷'śČö×}hIm?fĄššAhŸ ‘nCîŞ×Š\a07)AvŚÚ{ąjy9ŞţÖJΚĂpu5ďW(ú˙k"œLĽ‹NĄJečf 'ŤşHĺ]OG56M/é>JnSŢ9#Úy>ü†›Âo¸)ü†Hż!w­@-gaťƒÎ^% Űë™V‚ÖW-hxś, ÉʓńLė˙ FďGmaĄZDĄiŃՉ2Ň=:öËnÎ_ŸB|ďĹ,şc ŸĚ¨Ôć˙”Ö@—™KZ!áXnWůŽČžltô…X Őŕ˜É26ŐşlÇSáx"I9>%ʛ5śžşfY]ŁĘZĺPvÉę úö ŰyÖĄŹEPÔĹÜěô;•ăI[OÚe)3ČtŞz–3I–&Tj •’Ńď˝OjJe6Ž{+$\óAaŚÓčÁa~P„*•PĂ4šK}P•€`>4tTÍc˙óčKr˘ľUťű`ƒÎWÓę@†—(lżBŘÜČW!Ď0*¸Š,c3ˆJuÎm,“‘8TÂÍę3ÒőńFĎŹS=łŞ ˝˙Ź‚ä`+§Öťťr4ÚíŤĆ˘žhĹŘŮ.#ÇŇO–b“m:Ó˝PG¤ęDT΃,51¤lo[ Ęi"‡bÉ!˝!ýŘDüż‰IY ečóœUƙ{Ë÷ Ϙ—s4mjëcXĺ[ˇľfşQ@ţ‚NˆrÂg°ćâˆŮăÍą(7P…MżXS… J9SEĆĘľĽţ, ¤ (U0oSžüjČÎąşC“P@WÎI&úď҅BŻÇý})ŚŮdâ§SNľž2>şř˝óé]˛D5PíęŒSť,,×ůrłÖÜ*ęžu}'™¸fތŘĆÍÂąJÖvŇßykd÷˜ƒÝž [řęšHůś‹: 7OŠEjÇÄ[&8n)Dő Í@˜‡€kt;\é¨!éŽáGŚäćőů›‹×ŃS9/˜rÜ?qbSÖے.#*•ľ—šĆśšŚ_éĄ0¸tâĄ>r<ěh×ÇŻ\ OH6ßĘ˝BłŇť7ٜƺ™ C†gŤŤśџ:öĂNůő1D–˘ú3OůŤřa2ŠLmŮüu&óÍô……Ľ˛WËÓ77Ôül…˝Xńţüě/ź„őŤoíą+čCfv˙yő⍞ßŔO­jĽŽTX[ÚéÎď*>eŐŠź¨î€ ú…:ĆśB›Şëąq˝ŢOžŢţňúË󓓋Ó|}ď`‰*úç!í•(*HŕbţŒőô+< rŔż×-›+´j™­—U |Ó&'ɅĘC™baٌ+ąŻĘËýň0G'śČ5DĘ/Ő°Ůӽ˳ Ў=Ď.ŐĐ[~ ‰řő’ ¤Ź=ü­řń_DŻ˘„_âFČ.Qwë$ŘWŽW'‚f~8柎šôĂîçW\re¨ŁˆÉ˘´ÎĂ>Ű \"Á…ČošäŻ^ŻB͕ݜD†"Şú뛯BXŸ%N<őů4Ść´î[ŽúŐÝľŹ`řŠÇďaÁ“™Gzü&…ÁPŢů"žđ‹ˆtË…˙ň`WżŠX[Ÿ‹„ś§ ôůTyüxÂMřmŢTF9ř„ň™Â;Pš?ńŰ誯ç‡9œzˆ;wĄ<ŕď8 ś5ŚÚ˙˝á°I2gpm-1.20.4/patches/done/applied/andreas_mohr_2.gz010060000017500001750000000023320760216311400204330ustar00niconico00‹Kx<andreas_mohr_2ĽXďo›Hýl˙ŁÜ)jă_€“ćę\N‘Žé)ş4‰.ꇪMŃÖ ˥ъ˙ývÁذ;k›\,Ĺ2űć13ď- ŒF#X$ˑ=śßßM˛Ô›ˆŸcŻ÷)ŽŕÖc68ÎĚrfÎ 8–e÷ƒA#bŃg§vŸGđ‘ţŰűxvr<›Z2Ěé_\ŔČ9žƒř }ř%ˆź0÷)üNÓ4ŠÇ4ĺQ1_„Őßä2R˝y{G“&6  ŰŘűŤżîŽî.%r°A˛`I¸)˝yŤRžd“„¤dФ%Ď˝ˆ­Ď&nÝ>ÜŢ\A(žIŔÖçPů[œ $t¤÷>{‰HÂ/[ľňž&ŕLÁąg–5łŚŰPƒkN¤|ÓiCŰO…ŐˇÔ˘#"ƚ]Ÿ0ⲗ„6~Ă×8ŢŻ ĄůŃź8š‹<ŃÂ2%œ2šfe…¨ż î2–ënFýƒaÝ˙!Y¸w2Şg„UTŮNžÁ'ĺł_'2äďËËťsKśgňýžĺç?ç*"-źgpm-1.20.4/patches/done/applied/andreas_mohr_3.gz010060000017500001750000000040710760216311400204360ustar00niconico00‹Kx<andreas_mohr_3ĽWkOIýŒĹÍH;că~Ŕ$c4+łŕÉ"‘„ NFŤ,BEwŮŽĽťŤŐU XČ˙}Ď­ę—ěŹvŕv=îăÜsŞĺ’úyö‘ViÜ Fż ~>uŔ, TŇŘ$ňaňÝvŤßďż~yďwҧŔMh<™NŽŚG‡4G­nˇű’÷Žň„~“ˇ4Ňčít<œNřî¸5›Q2<콼Ž˙˜ÍZTţ\IKv-IŒd&ŹŇ ݋(—”Xó°– 2*YE’bíöĺ˝L,)S‹‰t˛’$‰„f÷"{ edŖÚFJš§OýpŰP‹Zý™˛2Śţ }sG#+ť˝nuËőÝĺÚT+2KyJĘŽÉŔÜŔY“ ca…ĘˆŰH†˘ĹZâßÄĘ$„¨%䙲ŠĽ0y&áa‰Ü(Ü'a­îH;ż7†m‚ą!ŤéVâCÍÁA LؐYË(˘@ÇąHBÖ­´ľĽˇ8-3Ńaďâ>šqאÎ$­d‚D$Vě_,ŔŤL|Ěbëˆ?…BĆPţjĎdœŽŸÄJn;ĎŃŞŻ‹ÜęqDmH,-â8dŚtHz ƒnŢ.V“LœxËÇ:”­~)éßšą´R÷Ňš­SÖëфöLĒU<ŹU°főžË,ͰëâĹ2ʊ%Ö9`: -uyQ4\‚î˙eC;ŃdR8ˇŇ>HýM§–Vů§lŤĆ9ŁB™A2LAhÂń`@őšøßḚ̈¤üŃŕmRm†0Ŕ™4Ó+¸@1Ö÷fÂńTĿς喍Çů{čEb,`÷RG‘~p„wyA+­CGĘC””Žű˝X'2iRv@3 ZŤŐ¤Ś˝Ý-Vě*ă"hÉÖd„ź3řîëČ Q >ű%ˆĚśŞŸżŐ‹BpŠL…áŢ]°˙ ’ş,‡…ŠĐ5źČpłHˁ„q\ÓT$›G€3EčŸQ^ĹHtŔćÎ#ěúR-5͖¸űtĘűhfšŰ&ƒů’ՁŽî mÎyC%J#ŮŁÎ]ڞeŽ@ŕTÍš—…ôŠçbRóZdŤ<ćbܤr-Ťćô˙fD… ë4ʌŁÇŰE GúxÝŕcd×:_­ Ŕ™PŽvÝTş‚Z!6”hËČŞ&°Ů=\H`ăě1“˧.h‹M*Íś‘p@„ĄňęKűM*ľÜfâa[&h<ŘĺÍô<ŸźëŽŔóÉ/˝ŃĄăyÁ¸űZŰ%°˛UŞ†Ćž=rÚĘGe›üýęŐář­6ÜZtć|ŹéüőŰŤgěţ,œ*ĄÄŽ(‹Gç1Eč˝—ÄÇ śłŤÂ–œm6äŐŞh…9gEĘš,VŒY0Iô$ä‹wŝćRÖ׏źĺ§O‰tč‹Čh_nŃĺJěŞ@ŤŹrfŹžBâ1­őœÉzĚ éÝsîŻ4ť}ZI ˘ľ'-ey$mâ%E1W}_Řuß Ubp2¨G[Kj;ĘôJv폶hŇÖń´\#,v …ÍžU'#w}k¸ĽČ#[ŒQ¨ƒ#\?+ŤčűP6%Ąiť˘vńéýÍÇO‹óÓš›™şŻƒř:b=W˙Jăj•‰”a9Ô Y¸iOqN[î`ĎÚb-áwž 5zŠ-čRÉěšo­K$œ–Ń –đ:ŻbPw9W". ^žšMŻ×‹ÔmŔő˘Ęćq+|ib7YŔĹ{<ŠŤďçôjcďxĺFôÇÓáx:>z}DŻŻíNçŁwÓŃQ=ůrÄ~:?؇żűČŽČęˆ^ĺi„1­Źša.˘žďo:-Gw‘Iw5A&¨ÄOiĆfy`1çúq'v°ć9gß7Č7‚|^sŞY˝ýŃľăxsi|í¤@-ƛTÁ4×k—™Žż]ÚLßŮĚ~˙ Őo†÷–¨Ö°Ů숙\ÓŻôÄdp˙ÎćżÝ,ţy9ďš§łůW˙p5˙ǗůÇÓyŻ<óˇ“/gĹÖɇˋęüĹâÄ?žœžÎ/Ч'|`ˆ Áˆ%7°Ž’´8˙PÜ>˝řrľ˜ö_˙Â\ŹÝĄŤĚ.j“ÝÓÔËp T<ěÔ]š)ľŐ\ń<˙ş„KA:gpm-1.20.4/patches/done/applied/diff_synaptics_12.gz010060000017500001750000000463360760216311400210730ustar00niconico00‹Q¨h=diff_synaptics_12ě=kWŰH˛ŸÉŻh ' 䛜zƒź\ ^Ȑƒ”|ďPŢäŽLÇ’Ž@j?ĐŞĂ~ôĄËčđQşů^ˆă{ďˇâ˙\ůSš ™Xw”´d‹*šđÜGŇ$÷З€Z6J‡ą ą§!ď‹Mç|\Űż÷H‰c*U‰ĘŐűš93—‚ńycčiŠŁ3΄eŁnÂů3” ąiD‡ččpň$ŽďߢAZ 3 Ă9ˆŇĽwÔ ;÷€x>đ:đ1ô%Ş’3.Zč8'É ÁšY7ŽëD Ĺ6'2°Áży,:^h 3˛Đ6ĐOd}jš@)qĐP‡/ş÷ÉÄœů^:4ł‚rÁgčIhÁF€!„:(PT•{'¤i„Đ NĹěÜXv•[ƒîâ˜Yh7.˘ŠNÉ}CúZíaűÔx¸`ćţLHqěÜQDĐj1ŠHá}„vó(ľJÎý{Í(xLóçăؒŃ<`šł‚ęhȑQěţ~ű{i NZÍi’”VdÍRœ_‡¨uفęؔ|!Së4 {–şVÝrl˜áŘFhpMă‡.ŔTŘbxm›ĂŠ-p„ľ°[ƒńDŕ]ůÓeý9a’ą7ZIuARű{rvýN ĚĺŮéہŮ;9U´ŁöPk( ƒ‹~€´×ƒÁĹű4€t_ěÄ ×}óő5@§ąÔ“‹ŸĎł@Œ—ä]ďÍ@ŇR@xŇ0Œ˘đŇď]š ×ńĹĺ93Ň-ö•÷ŕSÜç˛ŇęÝĹĎKZ)b(çČqždË-Eđ*9Ôáf­a4k{\‡ľcšżŠÖ7Á§7[ąO—„ĐäŇľÇ4,Ł(śśä——*÷ŸM(Ăť—ä€hccƒđFI›DŇ.—ů,˛‹ő¤mŠl‚˛x-ćř˜‡ď,wNC,qgłxěę Čűł““w˝4 S’Ęr%I@Ţ\\_Ţć°t˝ÂÖk ˆ^a*ČĹy/5hz4řůB€\ĽŐ^y{Ůëe€4=23ؒ6çhŽ}ČœŽ˙ œu-NÎ' ÎóH—âl,ŕósq6?čß"ăȄ)}ҍ´Mxޤ.‚"WşŰ› ąŽ„łžĂÉďY89œ\ĐHWÂŮü˛7Ť0b"ĎŐ[Ńoa\ěĽĚKž}KÚB)ˆœuÚ@ť>xîIGHÁĂ6ˇęF[f`Z˙ľß6ÚľNĘa)×A×ޕsžs*ČFž÷ŠŘœĆŞÂŹ˘Ę˜ĎĄÉĂĺqazofXҠʁ)˜6ů˜%‹|čfؘFXI-řĺNM^z]4 0]G śÇލ#°ńć ď\ŠÖřˢ2ýœją.ƙŞĘ/Ć)tA;ÁŐâӆ§ "/ž…,ŽćŠ+ٟ„ő óY°ź€yĤ¸ü䐼@łÖ×ëë4Ő\đ?Ô¸ţ2¨?žAńpťT¸6…Xs8‹W˛ţŒFŞ=ąSoízW9´łW3:ľZƊ“Z݈Ÿ7DÎ`MObwŒ đđŠ~ž%˝QŃĽ 38­yä› ¨ŠQƒS đYY5¸Ż|…ŕžň‚űĘWî+_!¸‚÷üŞşŒžIŘ÷¨ę”Ň´s„őE&&zĽ3Ń˝/`Â<ŇqÖł8'ĽEXWÄŮř55éOĺsҊ‚) Géǔ×=ôXWĹYOă\/U)ŔŮHăń˛Öóřl~ČÎ:édÎVçzédÎö‡”^eŊhŘÚ V?VH 5&ăԎĺj8ëE8ľr_ g٧VîŤálfĚPž6%lŽlÍřiŇůxb°)¸Ź>7hŽL1S?Wp "]†łžg‘.ٙ+DœD=ýş‹g‡ôčůőťwFá ~6ĐAč"ا'žü y]ŁÝT“qEŰńF>Ö&ýŕ­˛ďńú¨˛q@<&ě|B~…A€ą˛RJ@Łyŕąýb=bRrv"v/TYÄŐŠCÄUW֍?Ÿüs9Ň ŹÝĚŽĄؘúől‹öÇf:6ç4˝x›zÇżixĺűĹe›hžœ’FľÍ…ŐěVK#Źçą˘—Ü"nt‚ęԚ0”íDPĽŤůÍ{ÇsČýnGnľ(âUdyśŘäúę5yďŰsLÁřŤa߲ÉIŕĎ`”úŽ?S0›Ś´ĘĆœj"+}Š7,ČI‡•m ŞĆÜzxŽÓşńçą„Dřš.‹™5ڤŢşÜmýn2<_[ĆZ`ídűěďk7 ŹsëŽń ęËÉGŤ0­:¨ó^Ş )$ĆşVo4 Rďě¤Ů¨váżÝjƒ/Ëfż9]3ńŰüɚî€>DŕĽq[erŞUőU{–ą×l¤˛Ă/Ę/NriţĽSŸ‘ů0O_°{Úáiƒkn+öšmcŻŸTÎ ô~˜ÇG}~÷ÎOzb?ôCˇš´PÂ×NDŔ9ˆó>™vŠ}Ňľ‡Z­›j×%$˝ýZśë]]™ƒˇ—×§oIí—\ťÍÍzďz˝žJŻžj×"|˛Ľ^eł;TŰ5‹ÚĽÎŠ!ŸľFJ.¤pŃąÓi˝Zzö4•R—pú0ž&žÉO”ę›dô.Ń ešd’„€^ěľ3Söciů,žçJ'¸˝k˝™œÜíx?Ó0J=ÉjňŕžÇ |żŁŚ'Ę vQ€ÉüWŚ/GÄő‡Ň<‡~` ‘î׌ŽZwZ—ŮJęÁ˝cG“ç÷`iŔŞ˝Đú‹vŹťŠ”ňÐéͧlCuŘ˝šětŇR(w˜âÎJ¸Łd˝LŐc\ž9ď)dGéŔ#–Ń*P§łŠŮťŁ‚ƒÂ7´S,…ˆ*—3u"“‹áPd…MDąMmŸˆ|<-çaĘ\ňťWă‹SBá~ŰeRMÁmęápo™x(Ü4…qĂۘ‹%Će€`*(ý 0ZVćänK¨ĺéŕŸH—*Ÿa.ěxŐ⌊’ŢzMľľŸß:'ńl=…Ëř"ߞłÄÓý GXY›Ľ%„Zę^vI¨]VϟţŔ.€› ˆŽ~wץÎÚ cŻł—™ÎŇFͰ°ĽŸĂbůp‚†Ż&Yéű#V ˛\&X4ůľAź &X8AŚÚl+?k´‘ř~ĄŐůzx”°"AçEFšLľşzĆ+[ü€V:Nđ͙nĆç<Ń[/Dkš`‹Z쀖ÝĹ#ĽähˆA<_œüŔ3%SôčbăxˇŐ1şě¤ôLMŞ$j„‹FřQĆG!k…‰ŻűÁUAŮ ´ťu…eÄŤ ŘâŐÎÄwmƒÜSâQž#ó–RvsĐđv_ŒjŘĽBUJ-ąŤ¸\źCdˆK(ě¸ě,ҤO`Śs ]¨˘”6ŘGœŚÚs’ëÜŇőF˜‡ĎہAĽŔŢŇ"ĐŇhXU.˜ř˝ěö›˜áżŤ ęź{ˇšb|Úç)—Â)DšŻ÷0ÔęV=%ŒĽˇ B^âƒŮEÖH|ú„•şdÝľ,ńQČ!%ąň;ĎOÇ÷ž‰ú3źOň{ƘYĽăĽŸ6eËń-'1Ę­řj<~˙‘oß&x_d˜d ƒ”ţĽyvţćÂ(ĹŤK߇䄝Ň<([ ÁßJlĹŠtP’‡ËJĺ2πɊXCr† DH ďZ}ő=nęyăSćŔäőRßŰŐďíŽ ‰˝|ЁqňĄĘ*b†î­őO?ĐžŔő Ář 3*Ľe Pü¨Ţ­pvżK†(ňŤÄ9 ů)ýJĂ9 ĽsÜř4°œč`n ł>vŽŽ’s[‹]šSg1˛Ô‡ąš5ĘB䟇—p9şňľŮ †ŕśw§SUé2¸LLÝŚÓŃGńbmş­j}ôŔ~’…”YeIGyBŮjég–]ÂOó˙z\Œ6¨‹„YGď^_-ś€Áű >CľéĚĽÇSű 9‡ÁĄÖÇ/ÉBÂŹ€NŽ$vžŞŃ ŹXŔČϐś?P­§=?ož>˘ĚŐ äúâłăË(ť)Ö'ŁÜ;r°˜ŒĆ}†_ˇÜ)ŻÜ,éŽRäבa7 Ž”Ťű“~QúŤ'NýOúh˙wYd  ˇ¸%ŽĄKĺ›Gf­Ż™icŃ.ä‡űń–ƒbą ŘÂËë˜l _ĎM[7Č ‰+ rŽ5~)r„P>d$˜ˆ…pńJĐŮΏŇʕĎ+&Ĺ"˜…dKÁbä–Ë<řŹ× ~ÄŤăĎę Ç.i/|Ż5}uĹI!Ś:™aĽRćŤPíNÖÔX6Š-RzĂ/§ńÄíőN(śę‹?'€BË[EĹ~í'ž'•kSGśĚŢr_‘ٰOâN=)wBÔkSŐk­=ő†–o č÷ĎŹłâkŃgŞ^:Nüš‹ˇĆąHîFâś'<2ĘSvƒ˛źW9" ,éŽVZűĆ~GŮƒ^Eš:ĂÄԋŘv8đ-;vgťQ#eŃK=Ü+ w(ő9ĆŹođ#ÉlI/\H`çUś”*[„ŘůQ^™ňI–ńńäłp{Ěëó\™ĘÚĚ\÷9ēpŔZ藯Č˙m%̓Oqă˛h-Úĺôš‹Óa_Ńç/>¤•5ŮýC¨Jý˘\Ů ’eöŮكŃě(˘ C Q‡%ﻑ/N|őŽKź"PLę–ÜqĚbĺ‹]ű.÷ óŸŘbj…ˇU~ő‘(&˛ëő…+BOîˆWÁ!‰Ç"lJ§ÉÖý°c]¤Âńąż> Y)W•Ÿ•ZZ3Őż-íŰâ ňÍŻ¤EĆËbĘ{wË ;l )ť„ë%" Ż IYZ¤^žŢ ńG\*ŤłŒň›óĄ*ž3†âđ )¨s7ž5ȢŚI[Đ˝ 'E¤Ę̇l -Đëüe řNt>Ö@źgE ô L%ˇ‡1Ýí Züę=ͅ Zě2= ÝĺZü&–,’äžxŔ•˝ƒăYnĚéóLŰy3'1;Yß.?z†ň7o,`iç™,%Ţ&Çő´Üź€ŁQĚ  Éžx„›Ůg‡Ęˆ¤-K7Ś'ôf>ÎRÚÄËšeý< łÍŤ_ϏúƒłcŽ ďďĆƘý{ßÚŐ6’4ü™üŠ6{’X`IśÁ†$s˜@vsNn/˝źłYŽÁrâgŒÍZ&Á;ÉşŞúR-ľä dö™œ™¤îVwuUuUu] 4lÚK& pU<÷œ1I[fšŢŹ`ťÔT§ĹĆëĆ*ć Ľôm[O1áśÓČMĘímźđ¤Jó‘ŠÉĽ–8˝+ž…D5w˲žíúysöÉ9řß,ď2yŐđóţ;˜Šçqé‡ń;&Ď XâfWŠűť‹îŰW3éŻ÷”ÖˆHžšŠ—cŽuÔШ{ÎŐÎŁ :>őą¨\\ „.•‚ď=ţ/püŚś8N~­ŠPLá„Ćt‰‰Tz žy$q¸“î%]KbŞáĎcŞ>ŃŁ@ĽuĆ ¨lôaźCĹň$!Ř/]•ŒkÖôŻFŚ’ÍŽÄTU”^hźţ`’_B%_ěɗ4d NÎŻ0ťŽj“ÖXÚDJŻc¤,Ş#.‡Ýó¤ŽÄ”jh°%E%¸Tœ{$&ś°ýUë'ľ˛WÍńc¤Ÿ3&ÖßĐ΃Şm]CäÁƒOU“\]J]Úý+{%*c•ŒĄFňŘż×Ö˙9ŃĚpW<Ł/ŠP#Čü_)vżĘKsn|iÍÎwĎN$/6çĎذ*‹zL2˜´ĽŽÔţŰ!Ť4óăËה,ElJÉŮ?œˆ­|ç*™@.ń%ťÎ/’Ĺ=ČůˇýŁ×ľuEÎŻ ‡d'áz°çßŐ\„Q@žqĺ‚|NŽĎș ‰ňIŢ7Ěa>/Ëű™'Î{¤yß0ËIňP"¨ş°ěËóŢš,+ÄßÂl´(ďOQ>YœUî%!ř|xmĐŻzčô‰ˆ%ăz ŇŽMĽŚŠ"6!čmw@yŞ`塎Ŕžĺßřr5ŚX‰YM…)V`ʧYŹĆ, ÄÜD…1œVOkÓ#ť)2›bm55fłx&›ßU“ÉíŇ7SeĘńĂUnďĚŐ Âců€)!gWKݐ8äţßQĚQސŰIŽŽ'#1†ĹÁę([9ĹJpÓyĹ*dW.X@!óËüu*źĘt˛ -‹Jń jtÓf÷Ąź^rq&Ĺi*@ýiąW‰~ ="yP}֊ Ÿľ';>˛ŐK>&ŕMjŠNĽş#é:Ÿ“áP  Gž%r”ń(Ÿş“ŕąŞŞ˜tĄ&Ę`JăaJxKɇ”Ä\9”Ńńě,R}‰%%[,Tp‘tányB%Ăë D'8n7•S‡3äęŽäŔŕ)Iޗkş:Ť ŇťĂsČdîŸ˛ű‡îZiÉókÇXpĄľ'-éąëé 'WŰď'çÓt˝Ž§%ű_@ŽŽsĺŮý‰Ęt%âB]6řÍWR ˘ţl_)žEő @KUPš¸”gĘüPR8–[!—jň٧äsŚčŤŃâŁsöł\H[ň‹čŃl\‹ľŇ X0…ʨ¨ ƒŞ=’`ýŤ.ĎuąŻÓÖ8ƒ¨‚“๩ŽŃ]=|×;Ęđ†Ń†+Jf*ꈧ]­Ýo7řŮřúo=ľ*˛eŐ%YśŠ°hB­^ŁölMŚŐrE9Q|ŁyJżę>čÓRłƒ™o,\ňAłŠ=űŐՔđ‚o{|9‹ÁĚ{1^]UČVÁp?Š0:ű‹DÍ!xůÚŞ¨uq ~2ŔUĄŞŸ13[Ů1ńVm{:§:T/Ü0°‘¤Źd„Ŕˇ)Ş*ŰÔ ĆŘ ę˝â-ţ´+ÂîÔ$–}Ňż)“önPŹz€Ômć—ý}`c@eÂäť"ëí?ĎeSp-A‚Băru-€ČÜNU)2m-IšÎe4–‰čËâŞ˜ńKŇŤ¨Vƒ!ŤNHÄň¸Ę<‹ŕ0äZľR6ď÷T„%o,bž„}iČj,żą‚0^tBZËť… ąD˙7œQăśfÄ+ řćä=ÇćÄ<>çôˇÂĽas9‰Ą7>5„}Ę؄’ŒŃ| Ľˆ†FíŽčËNëŚZ*´^Cڌřˆěëuq{™ßiP˘°ÄöߊÂŐô VŞ2¸Ŕ RR´Œ .<ÜJeťŕіCHC|K>e@ÉBÄĂž0ŸM–~!đó'řH ¨mŹQŃúyVO68ŮóŒhˆ˘ŢXËn"ěšóˆ§Çë슿⇀×}ށ­pFľ‰Ŕ;:†ĐÖ¨ÜŮ%;¤ ™(MŒ7ř´_ŔńţXÄ­:-˘šľ#´6/GW|Łřt“öVԄp×ä€ú$ Ôk‚3ę Ÿh3Ë]”ŃžŠĎ“1dP*Ůg)(Ëń/ew˘úޔp‘€ń“D|ĎňëŻňIQГ-űp˜ ňËţ¤’—§ó°Ś.5>×وx[#p‚ &“p…É1ä_XÝ6…´Óî(_ĽĂYĐđ–CÉĚułZAŞń0JŠ­ý™`Ü]4ÓĄAčS¤tVĄnG.Pđńq]=Ýłđ§ęĂ#źN‘(AÎ"/äÇ/“ .ޓĖ^V¨Ă›XułËJ>÷ƤÔ|HŔ”8MˆëĐr‹Ç˛ܚ“3%˙ŚĆÎv-j†ŚćË­“Ç#çĽ)dÓľňç2We,}íy*_{tyş¸,hąŢ„HľYĐá}Č*Ró.#`)‚ěšL=.ăčy ÖĐFˇ=źo s9I˝áýŢ8âu:éĽŘşŸÎÓ3K8/0ćÁŹI:Ži[4Űfś¸=8ŐůŒ”ą3(´Ö;RŞcăń™ŇƒÂ‹7˙8_HŽĺ=䣰%y^ćwe›ł™şA##&DÂ*ďŕ=‰î˜gÉôs’hĄLŐ¤՝%v$œ÷މärŁAzD 1ş5Ź‹ç˜ÝIâvM˜ŸýŞ#6ă+roŞŔ: Ŕ^? Ÿ¸n7IA­"jőěPľ Űpż!ÜFĚPϚüęB…Őń’B(h­y }ä‰dćă†Q ~b`BěJ&lúšĆś)jҙŚfé˙jćČ~‚T\čˆůŮI÷Ďč÷Ąääúz×OĚLHŁzâ“ć{ˆ^”ŐoÖˇşÎžˆ-ˇklťśœŽ­÷AŸ‰Ý‚œťí:¸ąOH€üć7ÄşŽ‚ Âö†Œç|Íl~jӟاéő@Îč'ˆIż.ţkˇw˝{ż'z3řűl ĄhŃ A´h„53ŸÂ$ 7ţXÖşíYYŒŸC‚źńç˛÷JžŐŃ爨oü˝Ě]‘Č…t v0d‡@ƒĄŁüćGź{´~ۄŮÎyKäŘڑä¸cĚ67ÜܥœA˝ŸđZçÔ Ž>38™;W3hĽ†aHa‡qđ­p …0j ."˜L*‘ˆďŁČőUÎ|ÇňäœůúÔ÷&G—§ž§x]°ˇFl-ƒb›EÉÖs"ŔćÝࣟśA!îNÔlĂ ŇqÔĺEŮČK]™ď•*} ‚1‘Ĺ úá*I§ča­şŽÍW`‰uaňĹ#+ШéŘPţľu$íĹQ‡Ľ\qEŤœ˙’ŠŠLĄDĺ7‹j<)˝4`ccšéäz:é*ëĐ^śşĘA+^EŰ5 .Źşxu暏úożöÚpó‘I З.L>9ť^ţÖŤęŢЧODŽÂw€÷§Œ@ţv˙ĺŤbŻgŁË4ŢĽý˘QAdúź‹)4Í׃=-öSŔ˜ąĚAÎ:^ŹiRYAĺŢô&ăËÔjáG:¨ŮD!Ť™ýäü[˘!ŚM(ąię”HŚźŻĂieřűž8ĘZQ“^/BezĆ-´ŒŔćßË}?\ăôbů=ż˛žu|łąţŒS䇟u‘Íç÷ƒ†^ćÇMÉü[‘ľ4ŰŔ/Á.ă—q ę…psr5%[¸D@‡Ţ8I0pe`Éęâ Jw˜ŽőSŕď*ÍXt7ţ¸R¸ “ÜSR‡„ބP|Nďs˘vQť°{-—˛ÜW7qYřjJÝźż|ńČN…]žäř6÷_đ8/b2?܁Ĺm9FŹÍő‰XËń)žQҚ‰żZۑ\ď!´W÷šb÷ ˛äŸKdš`e!R…P3ÄLšN%ƒN“‹K¨S˘‡ƒzŠČť$÷<#áLAĹ{*‡ÍšŐ`ú 4 íh¤ÁŞ,DáĂîLţÍ-HîE6:&bt\¸Ĺ<Ź—Y8ďiüGŤ‡{EY\šäO,´_Íty/CŃ3ßôMö‰ëčIMľKКżÔĘ‘ţ{’ăW<)á9ĎźŰˍ†kКsß-{ř‚˝”čŽ"`łá\ }7‰f^´k4˘ZÔhnçäd\/ú*ٞ˘PyôQ#•Ç )]Ó4Ťœ“ËÂě6Áđ†‘ĽcĹńÚuţᝈň|÷,¤€ŞźW ‡Q%ÓLݢM O]Ę6 Buěx’`ů&ÓŁ~O;•áŁZÉĘ7ĹČÂÎeíŮaŤ¨Ö˜x’ŸřžVXŘâţ揿ľĽŮ"{I}&c<܎ZľhťĺÎło„  ƒ$'_0ô‹bŮB[9”ŃŁĺ1'-CáE=ŘÍq§¨œŘĘXT\1lutp¨¨Ńr(äg3pş5ěéŚ3alˆ\t—ăĂ.¨>žaQ4dBę*DÔňźś÷‰×cnmr;`j ŻZ–Ę O} Ž…¸Eů!í‚\<.ö&Ý,™ĄvՊ•Š 'Úi´%íŘZŹž…˘ B÷ý]­ĐťľMĐx›fցş8H‰ď°Ć_yÖČBĚ nőş=ˇLœ›ŸÎ_QűłfžŞ€™Ňéd,)âşčĹ,÷Ŕ§ňݘĺ'TU!vBŠěDíŹmBj|CĐÜţÂý¨Ň’ÄŃäŐ4ÇÔ̰ę[ÉSLšŕ)˙`”?Jƒšo•ˆ†y 1ĎÝ×z‡}LĂćKła•UŘ7ŹT§ŤU¨Üҝ'ň'ôB ŞvŽôUsF›€†‡šNA!őťÉ ?UŮń3ôđ ȌƒC”ćˆŁäłm—‰ÄeçsŮÇŞ° -¸|ž…? L$ü‰ňĘĆŹyfœŤKŢU'W˝ëjç†Ěn –Ş$$rŤh0ľ7Ő; aéAIQ57bĘ7+(Ád°÷u&Ŕ…m}_oڄâŢ6í˝Ż÷Őedy=A_GŘŘ`mn:§Ť/DŐ[€i0Ÿ¸‘œT&řŰĚŠˆíňi×棌šě˛ů×CĽ%‡nĚڃh_ů/‹‹LŠ uövśkq1_ˆ˙&OiŠ{’Ÿ‹óaҝĐüíxĐZžüWxWt™’ť,Ń7~ŤęŞXÁ„¨ˆęŸórP˜ĐůHĆ-ÉGěô]Žsă;-ÔżÁP°ug§‘sȰçľ‘JRÖťş¸TË9…¨A}z×ȎR6&ăOÚűĺžV–$Œw$ šÍňßŰXđƒţCŚ[0f‰Á䚿´Ă÷{öŮĆtük2âäđ§—Ó‰-!uٝt/¨Ĺó/ĹŐ´f}úWĂá)”¸†"őżDĄţšm˝sÅE#ŇŃĺD6čWŢ5Ůťvüăgo^??xq$ÖÝO×kôEÓH‘6Ĺ>ăpÉPEŕo5%řˇ›ü7Y=-ż†q=PáźNo $›ĆhFÇ_ířw2/ľCŠîˇĂF1ÖŚ8ŞŞĐŐ˙GŞŘšh‡5UěÜš(Ae!žQęá/Ő1‡QUÜ4(Mäz°ő_ދu9Ž śW›Ŕj’QlywŇť:iŤP†8܉%ě´ ~óüsşęü{5án€Gť˘x}‰kü‚?żŻă†ëď–j{7Ϣ}>– ˜#pIä*çH*EłťŢ×ď^žÔfWfkŤyŚw‰7 l‚XűćĹhš€HđíęĎIŃÍ7Dˇ×›Ô‘=—ĄÚ‹šx ˆ¸Śł؝To`#i•xOR ´Őűi€‡‡îÖčSw8€Ť3a3XăŠ6Ĺ:M2üŇĄ GűŻŽ5Hźťöâőó7ľuĚ@9P™ôq؆žÓa!Ş?ŠIÜ ’äšóJhQqĐbĚó fdĺ [‚_j9ůđťŔ3?kj„p˝ŐvńY™`g Ÿă ˇ8•ŤŃĐy/ˇĄ˙'ˆźQoô5GaŁG‘Šžź}Çň^”^Řú%%h×ó;Ąľi~˘iJ­¤msŻŹ‰Ź"ÇŽEuýőčy?ÔLä% ”Cźűîĺ˙í;ĚUĆËÁLKů-ŠŰ ˙€ó\ö˝ě[B~tju$:m/ƃŠô_Ž)ÁKY.ˇžC“{śęÄŁ°Ř˙łŇWԐzgdý”Wف;‘c–ŘÖĘ3ޤäď]œǓŽŐ~‹2ˇ“śʍ?&çŠA/™,ťŕ’=<ôčţĆęʧÉ(%W 9"€éÁ)ÖqŹbë:Lϕţ^´:ąŽ‹>˜\|‹9$q‚¸ßŤßďýsD Vƒ9ŇĐÝ˙K4âO#ő­{Ęň‹ŘŔŒ ’ĺĘIlÉY×áézŕ&ě…h Ě÷ľČm¨Š6^Ÿ‚ťŕ˘5.lëŠ~D6—YžÁĚi0IŇS¸,—`Ÿ˘jÜ0í1č]> l‡™í0Ëwř˜`=měa#—QĽşš'úşŚ”`ƒr­VŰĄ¸üuš>J“sôlˆÂ0ř{ oUüî”@jî H­ŠG8ƞb(Ű;ľ8 CšCv'=Ä^ĚOÔe–łnٚTág0CŘćMxĽ„Ó\v‰m–ă˜ŘeIډ}~<žé=Ď;ŕUÝi2g>É[đZ[çÓWˆeSXX9C‚‹ľŰó‰űŘ×óޖ˝ůAœBĺŘԒyŒpWť>… ÍOî÷ Ů*ˆ >Śj:×ăľ NÇÝ]Ÿ×Đh<Úá.Í -‡ě8Ą—â'ąţ$]ťbýőx‘Aáé¤;˜îúŐ/—–[ĎľçkŽžyŁ8prpŞŇN€,ë;PWV /t /;Bďú>xbŚ..8ňde˛ZN[úKÍzԿƿ…˙[šóÔźňŘjËZŻףf ŒŁ9ţŽo÷őËĆ%Ÿ÷>.Ŕxůň´{–Ž€›páyvŃŰőŒJ/OĎ/zËü!Ę“™wŮúĺăčj–&sy€d“Gü.Çűܸ”Ąpů‘‡Ir9gdh˛üČMí}´[82Ë6šüřčšF>ťăs眏”ěH°Ű-Zţ|ăÑG~ ěě;=ys|\ţńŽ^ FâœLéô_1$5ĽÁžÍexzăgŒ/„öEG˝)ŽbŠ7E*ćÎ/@2×ÎvĂőůQ –[[RrJÔĂÍ}Ő}u6›&‘j•ołPŤüŰTüŇ`Ž’[ɝSú_ ;qÖaç&“\ťľ úĄÚi×â04Îč_ëŘľ4™ şCÔćPźý^M‡v挰sŕďĄÇ9řÔ;qۓŤsŠĹI{ú‰&ÜL?é÷R Ňím R›ÄwÉŽ•Oî4˙INW›˘¨qƒ7QƒŁŞ˛˙6 C§•Ů>x?^Ha:őĆ ŞĽ` ”çDfQ™É…(ń?WŁ_Ĺ/Qëýž%ˇŽDÓFČŃôś'čŌŧé‡+ kňČyý¸LΆť*‡jŇMɄ‹śÜ 42 o‡mŰaç}€Z`U3lÖâfIJRßd|¸ócǏFـMJ¸ fa–ˆţOTMź=ŽO˙ń<żO_˝98Œ ĘĹž­ŚŇ8aöř˛ˆ+–vA‰PLJJvÎŽóy.ňĆP§YňŐxľŻÖ•5[ąŸýáPŒ1“*ořađIôj¤kŝ%@A8śäMpńœ¨I“ihŃó­‡Ęł„×q›­gÔŁŽŮ š‡'ű'ďŽOß@÷ćŽí%‚%BۢÁÇ䍊ÓÍÂOçă#)DôlV/jHî"Qc;veX)ƒ2I䅹=*\‚ßrş´̋„îÖ飭+ÎMŤ˝Ä‚”’)üގgvübŁ3c„á‘S>8Ť‰HńR•_řlď'H%+h¸:sŠ ĚˆBÄžÜ Š ~]÷Vm‡Ş™W|’J†  fgÜ=˙ŐD-÷ĆĆ=擛>_•ěG/0ľ.ů“VĺC`€G‡Ç‡Żtľ`Ís A…ČĽʼnŸŽŔ9 ŻIqՀl˜sl$ ď‡ńßkâĂxŠ?­×Îjrü€W%ÖhZ۝­M –ƒNť×0źŢƒTa¨’ÖčS…‚ٍí]"„äş‹ľA5¨˙ěՁ¨Ş\Č))†çH\OŔNƒÁĐDęIW6T{oŞ@îßIŞJž%ö˘…&U}yüsP‡ňGHˇ,{á É9Íd˙Őۗ‡§Gű'‡đ„ˆ&˙ŸÎ˙ŒóČŹR8‘4<™ęďŕ 4‘”2ńŠxäžä30ę…\łîł™ě;ÓáěKŢĄKťHşW˛…n`Œ¤.Qă? `qŇ t´ÝĽŔ[=ŐŻNZc ŮŕI¸'›ňŻÍMÁT2„\­‰Ôń4ŤĘ5<}ş<݆~äłÇŸÄ{ʆ4híFM2˛Œ˘{çŒ ’Ëđœ;><ůů'‡xc‰2#‘ü9™bEg]e¨qňÓäXßćŞ_Ęşö冼ÔĂC9üź<Ô€Ż˜şë|űŽÖY)['r ľĄbkjÉłdI™çʕ"žlDÁŕćĺk.U“.’Ž*œCGÍ.]zŽŠÔyp] P!~…&é4‘śƒ ŐÚfÓWí˘÷O2<Łor滑ŚKXÜeąYŤxĄV…Z5jŐ*kesÔŒUág–ąœEüQOSzłBUÓszśřœˇ6§ŻŠf董lâݜsŻDÖ4QŁ{|ŞviځŠÎKÜě™9xjWüńbĹč˜‚MĺT˘j›ëťëşöĘzŕăÓ>ւ‡ŽG(:󳕜DüíŕđŻ/žžžźy÷ě/o÷jâĚ ZŃđYą×t(V=W>¨”8}lĘuîőçĹU껜Y˘P';ŻěA"'Ś`̧„äx›ęÚýTĎ-§Ż!nc[VŸŰüCĽűTşMą˙Cž ôS–ŸÄ¸ř w •@­ú éô9ŮÁ°=%´şŒuÜ[EWtYĽ`OéQ"łşˆ\cš‚hńLm“ĺ”rřr^™ÓYžŠęš=d` (Ÿ [Ň|QUÖo¤Ű‰jqܜō6TvX-–.ŸÉów& çˆD‡ ‰ŕ[…ń݇{ňĹŰĄÄ#Ŕź/)A–)şEYlɘ*EG4Ůә ;cć0}´Fs˔ö ĺťJĺżiK#|?T†˘ a§z–‚cá"Ě`m@ý(؆[<8 0ËÜőÝěBp‹,̊9 \7ASľĘzP}Ř}X{x&˙?@’ÇɕŠi|¤p„=”s}H‡¤5ÚkSýżĄ*rkǗ˜ ˇ#s!¨SÔ(ΠEţvżŠ ţpTëńJœÇéäßé4Áz/˛ČOÉĎ+î9pU;sgV¨TŞŃÜŞ0Ż÷žDĄkÔˇKŠÇ"ÁCBůVĹşĆĐ0y›a‰WŒ Jť1"k,ET=v..ů1œŃT \oĺ€r1fy8ß]%NZ(ŞŃß(bľMÉ ś;œŐŢ2'(ŇŢVg ™ƒYĚgĄs{ňŽ˙łŒc-ťgk6˛Ćyˆa!Ĺřš_đý´†OĄeĆTɌSŤńč]żMô(ćWů,ŰZŹa<§áR“b6ţ§É*”ŤŸ"ó“˘ôďÂ] ěe^2żE~y?ÍpĘ,e˘^ńŞw¤xՌ\˙<|TýJăÎŽ°#/¤XŠĹ…!DŽbu°ßü˜ťáZízqpřúäĹóp¸;ţ2Ń{mqؑջŠĚ#¸J7† *ČNŮ˝ź„Œ¤3fóϑőÂUn=ež\6,ßŔž5@§ ;f-Ţ ŰŽ#ă7ŘɌƑŰەˇÖCVßk‡?B¸›Ýaˆwŕ‰‘ĄÜ"†˙¤Œ:S´*|dđ“ył-ÉÜf‰t.]V ąś+a‡éœA!„ĂťÁƒxrŰVýGÓĺe֗e\d1ƒĄ7œuš{üXDŰĘëM;hZ¤"—8ď[ÉmľsŕNԒ4w2ÚKůóËZŘy‚,ځ;ـ‚łđ›íƒýˇýŰ9ôßĘi܉ľGˇÍ™ُpԚłar0ťWbÎ9č 6Kţ´ÄVéžKSËłýˇű?żxůâä…+¸ü8g([Ť,Ŕ3#ş-´ě‰H#žšSk#’ÄÚĚë7G‡MŻöůĂ ‰‡˘ż3ŽäOcáĺ?‹AůPĘËwš‘ä;͸ɤkćşó4T2„"8Ž(bŻÚĂPÍđË÷™&CˆW“=7ٚxA75AŮ éďÓO%¸7nBÖé˙íŤöâÉ|OЎCĽŸq,7˝AЎîx…Ô^ĽrB_q]Ű1ĄĆÁé˙?'°Üă“ÖoNoöß sĆN ˛ą( sw88?ƒRtTTeŁĐž´W@Żw@Ě[鏖Z¸2ľ“óÖŚĂ ‹÷6Xe'ćĚďo“ą| ›3?5 U27—Tn\˒Ŕ,‡WÓőU[=n‡a-now˛EŃOÖÝěŁÉ3KĎŮD„ÄrAĹ>ÜĽË{„•ő2ÎvůŽŢƒĎšĄřăđ˃ĂsWpá\Ď{"ÔěĐă_ĎâýN (QҝjO6yŘŐmsÎ+´ě(žs—8zEĚđůÁŐ)¤}χźRV=âçÜéń“ž¤éw>đË÷Ťőe‡}!€ntćçç9ńmrZţgýf ¸X‘nK ű43}T˝ÄŇ>qŚU],ďeú\Ű4ąŞ!]yíHĚŃObş"Ëôœĺz6r=›ŢžŚ$ů’Ăiał8i*Šî˜ů›ŤKžÚ–żÁ*ŔŢ7Ÿt¸ě`Îg ŹA6ó=/`ˇ°qČb3“)éÖĚw3pýňÄśĹŔ<‰XâéSŃPëNŘŠĹ{őűGŹF;b5ňY‘‚V$˘éčF¤t#jÂ΋T)M•’U)eů^ҖcĆR?噴CżâóŸbd¨ekfęÔ;>‚2’`^ŕŐEÄXRW7śZ’Zč6§đ/ş–TšŘ5újÜŹi”Źi„Ťi<Ťi4rďXISN“Éd<ąőem]cńÔnĄŽ1ĺ1ęKá¤ô‘x*öüj2IĐÍC>Tő@:M ÂNËViúŃ@ř#CЏ”; ŽđşŚ˘@hfDËmóBÉ2aĄÄĘ%á]žńׅlhVř†É"™7L: eŔ9R†UiĂ[r?:;ŹŇęííG閔îJéĆÜîYq]vVĚĘ^ş§\ŃV‰˛ÝZč|*=Ůř†z n;ÂÄÇÝŻ„`ËżaąPÂ+éx™ /Ë(üK4St€.§ÚÇšóÇkŮ[vÄú UŤçhŘéDžčœŮ,Šúß7ß ßžůĐs¨YôĄ˜Ţďäޡ|ʙ#â÷Ů& XŠŒţš”­(s˝ň2„:ňżţ˝Jĺ~:j&M:K4B›jŹ~*2yFd7X"ĂÖA(XoëŽaQ×(׾‘ůjť¨k#׾™˙Ş˘źL×ćT§¨ŞˆęâEŠJÁ<ę 4j˛ŘÖ ň‹E}6úžď€Ć"ěŐ^ĆxMS‘‘έ 7żŚtQ2ÇIůc[ !-–ŚůpujœC+Óä˛œC™sˆsąS1ż‰šƒŃaˆeTźŘń˜˙bî„dMĘɝYKÎIą*‹%OKŻ7G…cçŠěőlj:˙DýƒŒóÇ,qźśËŕü#7<ĺ§îmSláŮť"ĹŽ~:űŐŐv›b—şjKĘLjÉŃş#Ąírš;(ž`YBŃŃŽŢzÎi2÷..˝.$źz:‰ 5…‚î%ňíBâíüoćťßžTuŐŐ=Źj†Ž˘‰¤Yň’ˇy3Ü*Đźt‚‡¸Ł{L :ǁÓMCâwkÂLÖu*lD‘ÔÓŁc`wŤóŤÉ)›BŮŇymzwíšAhí›üS{ŞneĘŰç żY0…M }Iavę~Ú|tAĐgç]ę˙ˇłYdÚüâë&´UŐča2ú0ýh.Ň c^člŠ<~!Ş(–:Z|ŰČóÍ`+ţĚb`x;› ›ę’žŚçÝKjÄĆÝh(žGýÁUK–uB Ÿ}ěʍŚ<“ńt|>‚§x¨źżŰľHĘŰÖ×0eťÁkŕ8źůđC8éڝ ‘ŃÖźOE°…mK!ÚŮf–°ťßŃMÂĐš;*yj°çmęŰÔâÖŢ}Ľćóś%65͔şH9‚WYZDZP˛9CJ;o™KËn_W“šl nE‡Ü>J! *}܀:ˆŢ‡p%—Iç‰, c ˛Ŕ#9ĹaťÖˆăL„ďÍ1đe–Ć’b‰ĚÁ”E@g÷ý* ˆxËŁÔ-LlAŹ*']¤˘LGˇ„Q~ŞíVŰÉ­ƒvôńĽqÎÇ Ľ\Œ1Ý!ÁjÜŸ?ĘE@ö_*žŹ"ôǃz&‰ż QŚčntý۲/YŹpö ˇ))ŠcŢ ´=QôӐÇQlĽśoľ:ŁĎdƒÖ7óŐ^ôĘłĽH6ç5ԁZŽ čŰŚ„ś‘˙=‚Ú…Ů)NŸÓËśF†5O§Ýóp5J‘ŠZXě"—h ŠŹ^u‡ĂVý†đČ:řˆží‹tłß7an›‚t8ŁŕU\02°źlE¨.Óď­B/™°ýHSŘ@Ş+đo/éw݆ÓbŤĽ”|ĄĆ6WŮDz,Žúŕđůţť—'Ëô:9:Ü…"”ł†w#Źá¤&*_RvXč Ť•ŠHĘńŸšEf’ÂĘ€äm˘hŽbÇq‡˛Š… r"OÍ%6ç0 ?[„Їv;tŘbšWŠůY&3œü9˝źĘ9Ľź˜7Ńˋźˇ= őp篊ďś[ľF#l9|wřŰq2ĽV–`‚óᜋpĺęse! g}™ś[YšYߛ+ؕ""`Qţ%jIjŸ^’ÜpqEšä*ĂnÍ1Ťn”၌g6Uešéň ÄÂŮiĽěřźú_ t5„gpm-1.20.4/patches/done/applied/diff_synaptics_3rd-final?.tar.gz010060000017500001750000000225620760216311400233070ustar00niconico00‹BÉÉ<diff_synaptics_3rd-final?.tarěq}Î^żkýh˝9˝šeô z5–m;{÷˕hëšůśď™|ŒAžíâ݇ë۟°í°öďˇţęë;ăV´ňíy쎣żU˙A.şB˙ťýnĎ4á˝Ńƒ˙Ń˙żK˙ŻĎOĎޞˇőňďÜŘ1ťŕwĚě‚>Œzć>h /5N0>(ŕI›sÔÝÄ Ă&źoŕŻC2ôÜq6üŘőĐ×őY<Z7äăŘ |âÍ*X0'đ_ÄĚçlîŽ?ąĹ\˘ößóŮžĂp‘c6 >Ă+fßŰŽßfěvęFŠŃf áFÇ<äQ´9‹¸šąű™ł˝Yëč>ąŁĆ}ëíZŤÖşňˆł ˇc€lgĹ}űÎă΁ăFôČšŮţŠ˜ŸąŠ #ÄîŒcS­Íqfs;´g†ˆŘrꎧ íü$WLzł鐨Ř"âa[’ űÎCŕƒŁřËŮîÁ" x<ŚU…ĺkS&ťŔ?×Z{AČŔ ĆśWk2{<B ´Lƒ%-NCał{L@žœŰ@ź‡f•FEÖz˜tD4LĎ –ˆÇöè֢EřČoů0…ěż>ŰނżŹ5 ĄĹnĆ!tÂ.w+6‡]H@\rÝcú‹;÷ˆô™#—1g0%'Xúm‰éšƒ{߼ĺހđ~Rmo^ěJ”łaŐCý/Éü„+˜3†śăŽĽ$DMZ_hOmčJȘ\ÂY $÷1”ĄĎƒÖ˛Íä˜ďmoĆXł”ĐăBâŰDĘH–9˝&l@m­ń§#šŤ5ž^đPą˛‚Wk|…ä1źZc­äĄdn.@E"Œm+QŹ5”,‚˙ň˔‡rşÔŠkřš)Ŕ˘áë’˙Ó3ŕ§0{(Ą–‹¸oÉ5vhâŮ÷â-žś>hš@jl‹G ǔ˛Š€c>­ŘžGŮÁó$Ř403V҅ÚZŐšGŚsƒ:[÷‡Xč~" †Ń?jÄÚô1Fě ŸÄ[ö2Gě­ë8°Żoׯ;b×îý4Ž5vđĄw˝ť7+žŚ_öGěĂ<ýb0bg°ŐŚ_ Gě6¸ż÷Đf‚1ň‚ÉäϐsrĐF^—vÖg ŕđáaĆĹü#šÄöBdC]{°Ď–łŔÉřX–‚~ÁFh‰ŚrÉՆ€äŹ´¤ ˘k0Aĺ˘ĎŐvucTŰLţFšđ€l1žâ2‘PcjŁĹ–ˆ‘GŹ6V5 ćä ‘W!Łö60NKB)‹ ś'çZGŸluhß[ŕ|*çA2؆aÂajţؕa׌ôż6T^Œ0\pᜀ\­;0ŸŔŚ ş„úÄ „1j;C LâäŘ$PŇFĄG0™H7ÎAo­ĺˆ˛ô×ę dMăłâ)l^ÓŔË „ëÇ)ůM ¤+˘ś<ŇÓě4 ŘjLpH i‚’ĄÖ’gŠĹLí(z™ž’řľËÔúł–ŠľŃ2ľžZ&†ż#ô‹,`-U ?˙ç…fŘÉ5Nőh˘ô ąŘbz80S(ÚěCÄA¸ĐhSˇÁ–őţS1 ÎY**gkcą\ŻĆ‡m!4ÔÜăŕl@Pe9ÜłWĽŽÁ´zŔžűx Űoźä0Ua5„Иľy<›bÚĆ’˛đH0ýžƒËk“/ It„ć†^Ż5]RšŽňÄB óf–ˆ÷Ö;żdâD”Š u¤čú[:ąC€igÂK]n…ND˘ět/lĎ[‰ Ę„.]VCěh[Ń'Ľ4đÓĆs‹-D[´Ÿ=°•ş|ĂŞƒuÉąWô‹şđœłâ"ġî˝ŰĄó=ű™hĐ+yě´ Ł‰˘ť'8)@ľÍ& ĎŁ!p˘ÁɄŽ€‚f`…_ČČýϰćŹŔ“íÍŔăGVć N]´zYj{“Ćůi´ď\ύWhő0ŻanľÄ8ąŽNŻ8‹th>›”ŐCLćDΗ0aäĹjąĹˆ€qŽë KšjKŇúCš•­ĐÎ36çáP´Ůĺ$Q*é!m…MJťŚ¨É\đąh Eň 8ŒHő6ÎTa1sU•lřÍyw°Ńú”ĐHí’>˙š ňpög°¤÷\Ršˇä¸¨¸ššJliŇ^M]kל¤)ůË$ăHĐďANś[Â$ř™ĎŔˆí`Jj+LĆś2i))¤œáĂ,Üvš6ťĐśƒœz˝ƒČŠ&˘$üvJkFIŠQOˆM01ˇÍČÄEŸtŇjÇŻÄń8öřWÉuťZ°3NÂĽ6îW"˙.ńÜâq$<ɔąŢ&m ,~z3ëfogœ2_ř|~yË YŠ`9ú´Ç&9 aíiB‡Šâ °Ĺ<ŠŽBóT4FÚłtaG#ňqšÉ™e%/ę+\‹îŰV¸ Ű-fě“ůšŕűŞŽHfx<•p°Č ǸË6S2¸ć.,İł;Ěţ č“-bvĽRž"m!RMáŕĚěUnĆĺ 0z*SĘŇ ŚAš& ÖňĄŻ5FŘĘÍĄH˙'Fl’„˝ABC#q`ű)ůKyˆS,"i6"ĚsŁĽĚôQOóŮ<Îĺ" w=|ĽNm1Ě DęP¨‚ š7F÷T™ĺf†VLӂ‰“픃/ äĐÇXşÁď‹'RA.9@Ixňf„ą1XĚéžN532Ă˙ůY…—$œŠŘ„–E*ďŚpl+E çsĚDJ‹ĆOŮTbŚĂqƒQÇEŘc/Ş‹“×(ë-XÝfoř=Řá褌ŢÇȤВŹ3‚ÔGe¢rŁ’zmĘ$fţ}ó‘óüŰţˆý€w9“ Ođœëy"ö"Ź5BY.Ë$Gň‰óÔş&œs'iÉBKÉ#šŻ:ęźKŚąĽ<|óŸçßüĄú]ąa˙Š*Ŕőő?h3UýŸŃœŃ5ÍţęţŢúżŞâ?-íqžôŻ3ę%…AiŔŰéB ŁŢ Uh6Y~QÎyŸąsÚZeý…6r˘-Ég/]65ć„N`1žŤ§<Ú¤Đăű´Ţ™SXäŢLąmuÉH¨ 9ŹI”B…#ľV‚ wX‡śIż [ąęűš;‰3#`ísĚ'ň4:‘ŮńV˛@ŠÖŘj¤[űSn6j;HĐŔ†p ëNˆY¸š¤ÝtBĄ/„ Ut§ąÉ)č~ žS! ú‚6„›T1b'N|zYJ˝QéxîŞţťMY ł‚XĘ2~¨8ót@ŞĆŔH„ëłşb[Ý×űŻLĽ`(ŤÔ;ĂşA(ĂApë)li:ě'tY_çŠKř j’‘DIÍ2€`AÎ>:A#˜ÓžĽ mö-Ş4 ŕva="ÄÔŠ/˛ÚTIzեʨŇĚ Ů8đAR59žŠp “Œr›"FęrŘŃÁďĎâé€ZHÜ&3§ +…hŐ¨@/đuę# žŮ&ÓÝlŞ„î‰én3U%¤?Ť™ŽčOώb‹¸˘A,˙ŮĺKŞĹôŁXČ!cŰ“Íq´BPI„”Ęa—j:†ŞŚCŽ Ӛ‡Á˜G‘5LËąc ŔĐ(c›Vx+â@Ľ§˘2Pnm÷¤ľ°ęŮ—ŰAY°=P@:~ŞËŚß+;ýžăďił÷ĎWŰřżöçM˜źnؖ”Ž„ESr˘^‹RŠFńú’RÝTč´Ě%ĺ]Đ+ž’"Ą`GQęq4l}Rąď\ě-ÎvŐí…eC4Ýœ:Uävţă‡×eyýZ뻅@L€X7ż^žż˝|•ŒÜxpd‡ąŢŸ^Ÿž˝É“šxóáć'śäćüęÖ:;˝=M4˛ ×çŻÎ/>?KŔ XnßÝÜä§Üȓűćí 70á˙^ňöÛŰKëâňęőůuŌŽĎßżťžM“c0Q_ŁÎ>żţ•Ůż `׌Ť؊N!íć×o~'í—,đÁYÚ°)9ünÁ˛? Ř$„ 8)ô$Tqx„"Ó0zMŁG˘x2ťGa!–đĘâĽ<ń9ÄÍféř›|DϝšĐíŃX@¤Žó*SŁ˘#/šĄDŞ6˜6É^[ŮŤŇŞCńÖ%ĚÄBÜ4ŐɈڲ2CŔŸˆş‘A]Uřp 3˘v'⨋űŽ.ȤÝםzü"ĘĚť-ŚPK*§Ćö\œb!`azUă°š†KĘŔ‹ŸÎkqV6½Z0} MĹŻ3qřF琄PnëyŤ¸ę"EnšÚŰp%O÷ôÚéÓ§2œ˘ÍL ~´š}):şŽU-ša%žn žŁ*|Ýuř2sF-Đ—ł„Jqr‰Bœ&Q3Sˆňj=ňäLÚI3ÔĐńÓșdRb_-曌qőgŽ‘9sý*&=…\؁´žb ˘RöÎŰŽa4ˇ.°ÜćAúćíű`ՙ1Z;$‘›8ŠŽ¸.eˇĹń?†żV˙&“vÉ8Ui\5΍+*4Ç%ÄłĽ|VĄ0ŸVnMŤď'ěúňőOˇÖůŮësňkĹ!ŮěznŹ˘ěTe§ŐŒŢŠs gA$Ěń2Ć8–J$ă-ć˜¨Đ6ž\ÂŰ՜‹h ”fşw™á{$˘¤n÷ ˘ť˝Žžń…ušE ¸ ŹSą`H$ 4ĺŃEG<ĆBӄş%ŞŠg…ijńfä‘JwAľ‘Ó€aŁ”üĄüÄXÜj“šţ‹x0[Lsڝš~R+ż››á%앨Ęďąc“}yžÎÂ>>6Jűa”ič"ĘĄ,ÜHŁ- \sQ6e菠ĚńŇqŁxs^"t/…Š8şçą–Ętʤ՚€Đaĺ…ŘąBŕĎ ĐY”$éąFŻÓĹßJ]vľťşŰD‡ľ@mޝMӘrÔÖôÖ>lAŃ4e‹P€Ű)JŢů,ÇTËҔ-d()Ő§ƒ0u-A΢Äç¤Á/ŔÂȑwhčX!ołj9°ź*–y–eD•Á\ĘrŞ*<ϢîfˆşkU:‘¨%Š)2Ҏj—3/‹EˇN¨Ýz”)'0#“•^ÜÓTfëěÖĄ”jSnźŞ+œJ^Vîˆ)d×RĹ!´V‰ĘQŸ-ZŠźĂ•—E&ÍXŹ ćEڜ˘XVUď+CVŃúg` ,w°Ę‰[S*,/DÚ‹x¸})âęÛ7ÍJ9?BWÁ>>’ë„L˙ˆî!:}}‘|-;^D”O gÂY*¸ÉI˝'zö–ż˜?Ů9ÎĹvꡄ;] PR¨ĽĽX%î;ůŚkŕhHyăUzţ'ňË>ŽŢ]'ÝđŢ1ÝĘEĎQtƒWű­÷Q0i`öˆIÝNÓ0‰Kč4gnWlÂ)ÂŹĂî'f¨ÂĐ5<-ZHôžÂu .ږíşń°ÖÔg#x=ۍGxXIPôë‰ŃÉlÄe7J´K ‡Ń=źŘvűMł'%:;“šěÔýh:C(yˇ÷÷÷ŠľDŔpߋäѨŽ|{ÇÇ6‰ąź$O§ČŰĽŰźŘsę.ǖ¸\*/=Aƒ—ňcŠŕMśäTŒÉ>nÇúؖŃ=•MžŽy§téŘöĐÜPEœ:S÷ŹEćđ Đ Ä.(Y‘dţ°›ú‚ń] H^9§zŚšgĹ  ˇ§—<9¤K\Š>ňľ<ĎHTDaěsŕ:e Áö^ĎgÖ9†l%7%ĄÇâsůKMąšRéj˘xtŻě:üóç˛g[qäůsu_mĎU°˝Ä ŐŮᅲÉ¡ikSŻ"mń6DzĄqŤŠŻ˘ŔďXČ@‚es?śĺŤ™}BŹrŠÄ–)‡=řŻ$¤ŚŮdO IÍ0EĎr#$l'Zş\—‘-> °1ŢÇ@ëGF™/AÓZ˝9ż¸•fĄOńýPŮ&Ý3;l=,§XáĹěä~J(Ž Łf?ŕ÷ňH™§c4q•[3R¤—pă*;­ŠĘ~ ź ­ŕ X-cŁZ/uđ>0 îޞjZ˛ëŐŮ˓âQ˝ţEp.-XâR{B’M"uoˆ.G´čąëÇRôR+nĽBľRMfËâ'ě–ú$ôZŘI$$éú^Ś|k*u ’ŔÍ.‚Îş´˜Q˙Ř~ЛlëĺĂń×`XĽ0ŹŽ•WxÔ ÝďŠÂ[ @ţWčČ$wY¨ęӍĘď'÷űĺEĂęţĽ˝(áś/ŽóQ8+KS´‡+YčĆÄv7Ōň­ `)W¨Äůž‹Î1.]äŢcRŐőXŻ$ž&nŠn‘Ť*śœ†;ɊyÂ4ĹM˝…œ°˝‚pż,|ŮKźľÇšd1ęPYĆżţEiXe^BĘĘuýK-e&K5]ľÓ†?Ź42Ő_ÖćGÍÁ!ČÉ÷ˆŽŘ‘ó 8afCŤşńűŒř‡śÄ*#ôŒű¨’żAhÎą#šüQ,vǰpłĚ9Ęob\‘€P‘-źłéTXŹd;qZöŮ;ʐh¤DXrk|–ô˝(gâűąŔXwž•ů˙ŰŢąöśq#?Kż‚VŕtלäŐŽdËvěŔÍă`\›q‚ÜA„ľ%ĽjlI•œÄž$˙ý8žvš+ĺŃ~´(ZW$‡äĚp8Î Uuđ,3ćŕ!yp‘N }B?dqJ˜rh’HiîEĽ‹‘ÇpáĐćŰ!٠τĺ–ěĘmtöE¤Â^EŘ);îmáđ1 &Ž#§ú”5i=žzĆ|z"ZWŔpäĄ2ÔTĄÜ˛ź: ¨"Ž—ňŕN$ĘŃėˆžńĺ;z ¤ËTjf~,‹Ĺ_ó°PBƒßa˘ú˜'C +.Ůęf{…‚ śRë;Ťő](B<řV´ě†ľ’*Ł& NçČŔ3ŕ٘Î1X6ô„ő*ë™EÇ7œ–CĽ3(GÚ[*ZĐÓ4ŽŽZ'”•MQß7*>݉RWą¸#lQ|‡;QCš–Č dÁÉ1ŻgWR€Ha˛€Hq)cĐř:}ŁÂËaĂŰŮp>N.‡ÖAC z Sőaxń䴕Tü žI UĽpšĘĺŕ×îeIźTÓwŃIť g,đ âBßúÉŠhÄŸސ:ĎܰNŽ×X]ĘÍéw+ˆŒĐĂZ”üý‘áCEL¨đ!˘b%a˛MÂ$ČŽ š@˛DPŹ^Ďôí?J™T‡óŢW!G’÷ů|z!Ɲ¸ŁdJĆ~7٘QyYĂ<ĂÁqpd>Šj˜•Üć+š­>ÇÇůšu”ĺ¸cÎ.Ô¸,§‡0Űî+ŔH–Ŕ`=ŚŽ˙*Óćrą]€îJëÎkĚ ßŢ]rsNÓT”ŠD!R魙Ńd4Dśo‚˙5ŚŽâ(A ŐWPá g,]yŃŢaŽ0’óëú„ZţgGęŤd‰Ŕaů4~ij&(ş'EßŮŞPJŽœäŤŮ ŐÁ˘T‰sQ‘#í„îˇpţťjňĚóZWÚâ“ÄľäSr¨œ ŚjżšbîI°)nR× Z0śŠŽhĺ!¸Č36éŹr`ľ…-QdäUD;”cšesáú.oče#)§˛<íÖNƒÚaíâSľ˛ëěd@ěäw…#ŻľÄ Ĺzv˝Rz‘^gÍŻ˘Uň Ô$ía”;ú~w:rhK0ťđԉQˆŇQ},Ą§ŃĚ?WyŠ06Đl¸/“ÍÉńW ŢMBíŽN"°P‹qB#ZŠ'##äťjúfÚš~Ź™Q?_ió¨~ĽĽcľvńWö{úS‚ $đ g7{?–ˆ$…9ࠌRÁ‹ÔyÆ}xĚČo›{Ľx ?ÚŇmŐž8l†„ĄĄaŃĆĄ;.7¨żŹ‚çm>ŁĄU´1¸•B5ť`8 ŇůŔńš=Z Ś”’.ĚťR˜cƒËöT˝Ęýk ŠĐśŒĎ´éŔŽ:Ňy^ńTŽčŘÁ~o'Ӑki÷—íú‹ĄI8ťĺ¸ ŠČnÜd ZĘű™ÝN×⌳ t5 OcТÁŔóqb ŰÍdđš…ćtęÎgÂÂÔ.aÔurşNoűN)#É$&EÇFÖĚśUŃĚOŸôšcť_襒ĺŇ$ŽóÓÔwźŮ­Ůnw˘í5%Ŕ5›eŚŔՋ,Ä _Œ˘Şš!+šşhBŕl‰ífÜŮ߉Ű΃¤ŰĄśNĎçŘŠ9ŒGHÎű-ÂýšírűŠă‚6Š Ľ ś§TĆăѧ>UlřÜt¤jˆĽŘšrŚĄKú-%Ĺcp}9iŰeă o?ŠŰ~RŽîÁł 4CŠ˘.ÝfĎŚŽ>Tł˘yĄ‚OŇٜĽŞ­šů'ʃä¸Ä„_횓ÖQÂl Ă:­÷AŹ Ń;d[‚÷č–O˛ä@zŒ›ŠC%diqŠIđĐ/6ĽVZź†b÷oéŐ$1‰) IN˝KbˇjöňUhxŹÉ łŇU˜h4 r†4ü#_ t¤™ŕ¸LNi-H0ŒĹKžp-˛EŁÉ:ÔFdłŻŰoĹ #L`˙bÖ.fěűŞgă…fô (đA–<ë,eXeÄŤžŢ„UÎşQ+3Č3*t°ÜĹ —/šFŠV>[=X8Ë1 .…1y|5ËU…ľűł‘Ł7œˆ$¤ĺłDË {`Rž^˛ĹŔquĆ˙˛Üˇ˝›ů÷Œ5[ ؆óąjEŚz/ĐpFI ýśš­VœyKĆl‹ Ř +½eŸŽ­W-Ĺžˇz|ޑŽD˛Ü"ĂĐńwú:xĆ?2$#H …ńźhFtöM¸;–R5ó[3dóZŕ6ĘŔŮ-aŁ í­8F´ˇŃő‰ĐN62ŮcĘçéľMĺ‰đĄň†’ÇŒ?ßMŢîEŽäÂ.ݍ"ŢÓcŔÜLĐ *ŠŽ]4˝Ÿ~~BUŻpp”K=xHű,#3Fą)˝ŹĄ¸ÇŚm}ŞßkwhŚműÁĹl.wQÉ?w7ŕT^ŰÜ|”üźĹ˙iËOÂĂÄn΄uŚŠŇYAť a/›ŻžR ő%b‰0şŇgΧ“jŃiîYş:ńŽgđ*p ˆîžCŤRf:'´ĂxŻÄxŸă7ŇŇćÂňʚ Jš`‹2v’MÁ{ţ™ńŹöWă@’vŕú2Â-m­Š¨"Šđɉ(ű×éŸRtœ‹VČł<ˆh–ŸBf8Š3íĎ˙ZÜűĺěĺ™Ăp?:-†ˇ7ýK2uk łtň”#¤)<ń‰˙?î)Äw0ÝsíwT’¨-Ź#J'敼ŤĎŚ ą_oĆe9=5źÖjđšő=ąźv)ź˙™Diűő¸,ŐŠ‚ˇçŔÔΠú݌ęŇ#ůŰ­ţËę'Ş7mxűšńÁ­Âü˝vzSŁ~K6Oź9Qżďř„&ĂýôU°Đ€˙>ĂľŔƒ]’aGÚŚi# |ˆĺ&Łbó­3 Xcţ•Î/R4ăŁ_ŹYRRIł<Ŕ ĆyŽ@´ĂŰi ľ6Ś+Fs1şˇŕ2b `’ż—óŽľ2rVËŐkdŹń ZҲçCĄ—)hâĹŠąx öŽ ˘/,qĚ đ°o šq‘ú=î) v×­:ţUWđ†+ŠUżÁć+RŃgFÇň”„‰ŰmC›ĎŃÚ Ç‰7e>\‘$ ű^Ňč`´o%Λ‘81%ň‹“Hib]ďMPŻŻ őÖ*I@śŔ?äVłľ)ĚžŽŃ&fÎî”!ĐŞ<ÎŞśó…ńTᑠ#ÉwËşÜßÖŻVÜ;ieˇ/M„ŒŃn;â>g)8Şţ3ďô!ËÝßÔGůűQźŃűI;i%-YތăýÖúýęýxůC˛@X ržŢˆ§Ă '˘šw؊ĺú‰ďK!ťĐn×ňZĘxţŁ™ˆ(9ŒÚ‡íóüÚ̔ Śëš@ěé7?^źz’ŠBž8Ś"WńÜşPę]o™]eťëšˆĘŽEé:š˜*ź+xűâ* ”SĆ@x(ž3"ÄU!ó"ÝŢ1ŚVJ/Ůu’EörO•B ;÷cŚF"kÔťšÄ=ˇĆv7—™1SĂ$ZĚôWÁv–ÉšhŐُ‹Žç•U!j´‰“Ú;‰dĽśň\éb†Ň>îo|‡lZÁ롸'Ę=¸‹ILű°}ćęÁ#דéĪ懗ˆ BHáK.(ńäČ˙ž—çrĎŰ÷H}zúË9”gc{š˜iy:{ÜéĽÍĺ„*'đq¤Ú˘#Ă—šúgĺć¤J¨AÎ ŠÁudY>­#&Ô2ŰËԈ\ź.7c; ŰłÚzŤ÷JŞĐ0yĹ/_büP7—˝Ĺ€“ĄNĄM•e]*zEĹ /“íŽßĂ7Űë7ÚÖßú[ëoý­żőˇţÖßú[+~˙SÁśÁ gpm-1.20.4/patches/done/applied/diff_synaptics_c_7.gz010060000017500001750000000327630760216311400213200ustar00niconico00‹oń÷<diff_synaptics_c_7Ĺ}iWI˛čgü+Ňôi[B%YĽ hťÜÍź<ŔˇďźB*AĽ’FU2flŢoąäZ‹$°gŽgÜ†ŞŹČČČČČŘ2˛^Ż‹g׳iřl^Nž%ˇq0OŁaŇâh8Ű:_ĆâżŕŻh‰ŚżßŢŰ÷÷DŤŮl=ŞŐjÂjiŘiíwúÜđ/ő^Çë‰ý÷/y$vv„ü3-“°!ţ¸c1_Śi_‰ô:cř!\ˆ ĽßŃŐu*ÂŃU艾ůNĂ8Ëš˜-lhŁŮM,ŇE'“ ‘ÎÄÍuNô' q|Ęôŕ7L:›?ťdf1ő)>…á<ĄOZş\ÄđmCˆÓhœ:ř^`0{T7Đfóp؈xś˜“É-7j<Ş­m"ă_Ŕű4d"Ńh4HgI"’áb6™ &ˆ=ŕŚăĐ- †×áŰzšŕˇĺđzŒD%řÓŰOU{ÜçŔşM"ރĎ!~MˇČmO$Dą[‘\‹†Ÿđĺ|śH4ÝýŽç7E ˙ie&ü&šLÄ%LiˆÍĂ “¨ČˇFҡňqf@ G›Ě§Ń§đ&J—ÂQ,fËx¤ ]EŸ ŻgđQ"fc1ž-6Äčş›/„g_˘(.ŕçy0üŚ8%q,`ʢđW4 &’Ą˜nž ů:›×"‹Űْ‘LŻšé~Ač31™oĹa8 G ŕ…FJ  Ň0ErźŞ`mŕoü>qří;h5$ZŮŔlßI+“íűheÓdťą`GĂkjvé 7źţH Ző“ۆ7‘_ˆá,GWË´üÇ2Ą~2Ł44Îq¸H,ƍUQ„ÍŸÖ-ӎžgń. ˇaFXd°Ö˜KDv&ř4š°´Rýnßó}Qów›řŻ^Ťuq8™Ěn¤Di$Ű2Z4ÎBˇ~Ś)đč(LĂ!É*XOÉ|§A}č•řHâÝПžLç–çŘ(FčÓ)"=†9IÂEýAcŹř2b„Kz ÝŒĎ-@&NŚ#"L’‹Ôú˜j:KRxó9\0OęÍBy%Áĺ$|ĆřO‚fX ˝Ł­.`Tč%¸œ-yŁż¤0FBQ8 ă(GÄJČËó¤\üĽ‘x5 ť`ĎC0S\g 5‘¨@+8P4ŐĘŻ>ËĹVÓ|ńN “¤&Xí ăeLtNˆoôÎDFcřžj>`xƒŇ܈č>{|AÜŐęďzť˘Öę÷q?@ćúiÂVŠł“ß~żýv,ôŸćĐt‹‹wď3ďŠEÇ´xůîââݡ´č?ŞŠŢ^~€Fo]žiqôŮ6„‡nqzüú˘ EǴ๸Mađx|6 HŻŢ˝=>ƒú•‘˙ŚG[5žűcÍGŞŮÎ)őaޡÝNRŰoá$ľýžÔÎîůçَ\rŔM¤.Mg$đňŹ8ä ¸bĘ}0ŕĺ4b0υ@ŔF3Řb4űÂĘOa­BƒWL<;XgąTčůÖ,ě@Č ŽgŔ Ú xGB€ł° ›<Á/iŠ#‰í#üB%ŠGË!€b|!ę¨#˝W ~ŒbXĹŇ ŘÚn$Ý4DI¸ÝćÁz2 B4Ýݎ×ÂůŢő˝VŸ&\":ždń!4ę´Ô°ÖÝéÓ’˛’¤ľš41 圁;/wřP6ů‘Ť–ď'ßÍčÇ%+éŮNŹ~hˇ‚ň kKkHZ\˘T*ň,žî°Ö< ?ƒRĹĘ3é LéÉŃHhbß{.“Ůd™"—ŽŔl"…IÚ邔ľE8œ]ĹŃżÂ{BŽŇ§‰Úl÷*ÇILy-ô(ĘŠ ŁŞÔ*ĽÎ%uÁ$oA 'ř&ß*¨PPŹ"ĺ–ôYşŰ1†Al´dҡŹńÔ6Oó;ÇSűAăfĆsXŮQ” HYVŘŞţžŃAQ™&)Ľ¤Lq3ię-AĽ•ˆ”óhşDaŠyTŘŁ8ďČ1\i?Năç–:BţAę?5ŠĐD yŇ*cڧĆÖý°¨7ýtü§A#žhňO žçyŞ”ß<(ĺkP6ŹńdXJݚĎ1HH˜*ŕĎF—ű4~ü,űŮr‚’[>“w6†â‰k :<⎠ˆ,ÓŮ `fŐ¤ž™ą]ÉĆňr>Ď`‹X–ĎĹ}9†Ţ<ąÉ˛@ů.łE~՝ŒaŇ%ڌg)jđ źOɛßY9_ĚŇŮԍĚ4d# ‡´ÍbŇÁű˰D"Ö~ÄXâ5c[ř‡ˇĆî&äžĚî ’ŕWmHß,ŔŒöëa€Kí&, Í?h5͐›ë[\ď„Vz ě t-€"óI0 6°s˛ńáIs2ÇÁr’–o)ҲJ•uq;‡žĐ…@ęč)íěý¸=‘k,ÖÍâđFžó/ě?HȤ)„w_@h­ik;JĂiCœ¤r7s´„‰Ńą@aŸ HFJ˘?FZO) ÄaźœŠŻŹľő{žZŰŢŽç÷Ľš~šÍ;ř˙x<8d\đńQxšź*x~FÜuĄô*őŚ€fWW“p€Ž‡Á ď_˛|ŕjkxV r?ŢŤ=° ^Dş¸“tŕ°x†’tąŚ@@’—ˆôĂĐ,ŚAňéŰď$4~g~GňçƒGő;ÂéťvgÔÎ RJčä?s%âϏ°^żę•]°ä@ökŢVô„x;“ÔwˇĘ‡…­ňŚ 'ŢDŁ̃3ƒřrY§ŮAS°ăw=ż+™ěŤhzůĽhőE&V:›Ă.\‰ĎÁdß!ŮjŤé@†Ü¤şŽČÇřKłÚÂŕĂ<;5śLyÝüśŒ’ć–]Ż›—ц>°Í|ő.ˆôşäƒ‡Ń­tŤ‘ŒCQŕ”$:ŰÉýFş{Ŕ^=×|i ƋŮÔz'PȰdĄ9ö}ŒĹtÚž6÷Oâ4źv|>3b×¨08żWęWXŠŻ˜}鎕‡$‡‘‘ófŘ,ęܒ&dZ-BŚÓ˛|ź˜wŕŸÁü€ąłC˙臲’ŸŐ-Á`ó؎|6'I!ŠŃjMîPÎ/ĚPŽz(„xťK+ĽŰőúzĄlű7ś™,âŻ_ŸŹđ†ÜŠźNKÚvx*2ÓÚnk@â=Ŕ–ŕŚ/OĆ ç@–ˇ&5Ćr…ëdŰsa–+ZK˜Řus/߉vů˘×‚4 †řĄďDÁÚÎ.K—ýż2O‹CEn°œẤ̾v'†XŞËQłNoזžŰˇ°•} CšXťÝ:ÓÖŕNtW3.ց4­sm%H˜)ËBPťN–ŘR3Q§ŽIŃ }+ן-W<ä”ě>Ůüčt]W“ű ý"Œ%–y˜kAśĘą|(Čś ˛śž–śLބ–ľő´\ Ň/DzdŕkAśĘą|(Č<-;ÂTŃfÍÁz Ž–â,›\‡EZ¤śZłĽ@7égAŇ´}ČV$Ó¸ćF Ű3’‚,JtJ˛€°$ 'zg6|im [ЍÓb+ˇ˝- ńdfœş#"×h+#Œ{¤׺͖ç÷Œ0ž‚ 8Űc€Ú›˝1çöÎŇÖ6žůF#ŘŢn™Ě9a\ŇÚ%ń!XŠHý`"]ž şM¤>‘qßgŠŁ‰Lł­ěĚúçßR@Ĺpä>jűß ™RíĆiZ(ë~-SžĘœľČO+Ắ,óËŽŠ|Şs-HŐÚxÖÉV<Ľšfš)-vŮC+sď•a:„3šy Éi›Ÿ]׺),jź•Ý‹ŕ@kěתbcLefÂuÄŽš `Č2Ľ#0šb6“ˆ<Ͳ÷í‡ÓSŻÔý–% ś.k{wGĽ{{hău[&žŒ–[gƒiĎŘ΢_ľłE˙ŚRĘЁĺ/U ä a›Ěôz1eł`˘Ÿ‘#Ŕ‡‰)Nޤ#•3Öş­!ŮÝÍ#ybÇâö@ ˘ôů 1˛č­Ş;dZ#<1Řş äKă$Œ˜1iéS>ÚůĹÉo˘Ő肝>YĘťcś“œ//ßDqDláƒ--üݞ'Ú­F~ě7Zä şc˙u00„Űá'Ëň›W'Ł ƒypM˘ôÖĄó.ŘÍ8ŒÝŽCgh ›Í mJ bJŹžĐ\a?0Dabư˘Iů ,Ć—ˇi(Qíő)iľŮsP˝!vĺ`AÍúüřř›ÁĘ~‹Žá?đT;ƒÚĄĽD‘×ăŇóŰ^h1UqqÂ:Š .m‚hĽ&ź/sĽŕťeâŒ>QQSÖ4 AŹjw&)šľÔŽ˝ˆýč?_Ńę&بHöJŒ@š -–5=^Ć˝nGŇIŽý jM*IwóÁkc} ž‘JđÍémi4 ÂĄ!úFľÝóö`¨ťm•[%ÇznrŰ6(̊‰S6ľÍÚe˛lLˇËÄNôŁp^.ŇeA & ŕ¨”łÇËÄ=Ěôd=Hç‚çâ:ŸÔŐl˛×K2ŸĐKœ’=ŹĐ¤.ÂÉ$׳˜˘á5şců NHç,tŤâšęúč-ěDŮíË$Küűăţ`o5!Ç:ZN9IPҍÂÖş\^]Qž8´Łś/eˆ"Ü*›w‚Q"*é"ú“*C)9‹qŁÎ0éeŒ&ŠrŃL{Žóf§Á§“OUć0őĚ`0#՘Ü(FTŁ1†Ń˘DŒ˘ńł"SApÓë€e4ŹČĎĚźüóĄks}žE#‘‚M蘿%ß­¨Ř"XJßG5Rpî)+L=řm>†žwˆŁÂ*ŕ@‰in‹óĘŕ8°/ă$şâ (ź—X­Cňbň˘Ă˙ŠŁA 'ġçŒAý…ĘŹx"~{˙fđ’"?ÖœąâŠ^Ř_L)Öąâ‹7'GG§ÇŒLLeN‡Óyĺ‰$ߓ˘Ą{IôŻp6śÉ]­Šç0ÄęWé~/˘A­&óŹOĐ/wÜ3Ścpţ4s›äM˝_Ľ—&WŠÉűÂô}3+żŻŕ ߟ ŽŽ_~řÍŰţűâü6ž'­}qęvÂ)9?ďżÇŰ^a/UPYʇ'§XŠˆrĐFŤ ŘŚWŕRSŇ?Ő˙„řš3úňs˝Hˇáo‹ÖkúŻŔˇÔ€L™Ÿű#ţ;Ü6đ%ٍÍíWńtüT싧ő§ nf[ŠýZ]ŠVşMśądol<É5vůŰLËť•|­kťý⩟nőOj‹ĎőăY;ť'ň@9“ô‰°Rr‹¤Ú9υřކvb34ź,mhçHCĂt-Ô,=y"ç§7-› ëłĚWř٨ź[)ZF_<őӭ犏%ßVĘ٧ĆyúĺÖôS)l˙˘Óm6×Ěw/ŕqłIlź˙T<­ViĽÝ1¤:ýŚŇ<Œƒičą6ŽBáűś†1„M ŹŁŰxŔ–ś”đl1ÁŽ!œ=2tjýn[*‰ńʁeŒÂŚEAŰË(Ľ Nđt…pq (nv9°t`ĺ´m‰Ú#!ĹŠ—ąíOěK2ť—Úźpšźís­cŞ<$ńĘęv˛fëś=Ť_9™ý-¤=żŁĚݐ+Hť%ĄČyśĽC%yYQŚľ4ÄgĂŞ›çŠăŠ–ĚĺZ[”–›;¨Ů×öÚĂí‚w¤ţƒRš6bú{ă†fm’‚SZ1çŽNĐÍ8‰dŔ%%{Œ—˜k™ĚX]fŠ2¸dČmÖş‘gáÔ!⼠|= &č´źÁ6ëěč٨Ň_Ţ2H%’ĽH]ßR^ ĺšxŁÓ›hxiŻĎ0Ŕtc^ćPjTłœr~M„0_E+Ü SIá–ú6Ź×StdPlŠŃš2cŇITXW7!‹Ĺî­Ĺb7´V(*%öÜ !ZÝݝVSTYu+3ű¸•Ľ—´üEÔ7Xw *¨eXfŚXé˛ĹÍëĎłíĽbQňAíg-g—UÓp‚YŐĽˆŔčî…I힘|xoáńľ°í“çâ˙U Ţâ›ţ´ŞÔkV?îԖN‰˘óĹlŞÁ@‚ń0cƒíJő&šˆ;üéçNؘŽ÷XVˆ|ziĚg™ÍĎÖ1&Äl㙠ĘS ćô9ŸÄź™ńiJÉŻźŇe&;wé!;ÓšQśhˇA@ÜiÁ'á ×8­u(Óo•ň&­ xIŔđ¤Q8\ŚŃçP5I<+ŸŸóÍ´Ăçü8•W~ié,šŰáx.­oTŚ0[1…Hľaé]Ě$rĚyCŐΆ”ۍË•âÔ4ů ÚŁqÔUk?Š´}IťxŸ[$5K mË2j˝Qô9TěH ¨í}Uńí[Ń"ylw v˙W†RĐŇĹŽÎí61Ď_ŮůÝŰŇě&ďĹq4Hn˛ű!!¸3>ľWÉ&‡DVrą‚$žĽ‚jbxb ˛•ÜD)lŞEňĎUz/kŇ­6ŠZJřŇŤžÔŸ‚h•ř7džb‹öőSĚ*q2\÷a8+gUz§ś$+~sŸcžĺ¨.Šňn×v˘ýSšnԛ|Gg”Îrż~”ç,׍|‘ďĽ(+xm7Żß}8ťř˝¨őĆîH'Âcٔč}Ĺłkí¸[lßn˜z§`cßĘHmyÔ ŃÎ'goЏTZś6Ёî:/@ž'7肧6.öšxœ{x°Ž ¤ ÚĘUĐ`9伴ϹdÁ™}4ÜtĆpƒóż˝=|qňŠŔöÝЌÂƒtú5"SđřŔ†e4Ţt´Ž˘đË>5DD`ƒŕ8Y… N•ŠżŞNuDŠźm,Ň+ĎÎ0ňĽi>@ç˛w߇fmK"YłäŞ3<űŠ0g ,~ł ‘ŠúĎÂŽ‹ă„ Żč”:Ń'0ôňČŮţ›ň;%9îČ1°çˇ˝˝ś¨ůÍöž×íXő"ŒyȖR%É[Fy”čœĂF҆ꕴŒ¤Fă8`…ą’6 –XSĘtúĹúż) X_Pü‘`mČőŒ64k?Ň Źý@3°ö3ĐöՑqľYÜśŽ˛ÖěŘ­yXżÍ¸ žÇˆăeˇ&|`ľŮ4\WŚĚĆ6Zí‡Řh$}îxŽß;đ\@ŕyM¨Ť°D2ćÍn×$ó -ťyEđ{eĚťž2ć]ˇcŢ$ŚÉŢ(ć]_óŽ˙űcŢőő1ďM÷ľšľŻŐ6Úׄ&˜5V^•ÇŃë˙ć8z}Ł8z}ƒ8şj“m\GŻoGŻoG/ëvu˝ž:Žžş6Ž^ß4Ž^ß4Ž^ß4Ž^FMăčő‡ĹŃsÝnGŻă˙îGŻ˙¨8z]…ťęϤ惔˛ś:˘÷2­6T˛˛n,ă1×Î;ÁŞôJ“E‹pˆúXC”›?ŐHů˜q`˜ľBT uڌ,Ĺ'uŢŚŃALf´Ťbš”ˆ"ą *ôbęőQŒúkeN2ŐÎĄCڞ’Ö)ÉU$@t!ćŒś °~-Ś9ŤÚ?Tą*^N/9$,™5PNR†ă)ŁIc]@Ťx$hą¤?R(W֒JLľÔŠ,BŠínUYweęŠň*¸˜Hr°ďŤEbĺ?@!,G0bśTő'>ŸŽűÓó‚3 ‡8,­łňä$< ‘UÓ~ĘĽ ÍkŔEń2Ě+´Í 6ÝR;vŠ*5>Á€'jĹQü‰C*iČl[ẎUCa]ćVŽ‘Uq9p*/%\ÁŃÄţ9HŠuQaÖt Ĺy:×y$†~ÄĐ/¤Žŕ1łHłŃěš^Zzc3:&§Ś Ëynp{—Á˛j‹­éîؚř–­rŤîWŢ|­ţÇ0Ľœq %ÉAŚmŘHɟ­ Eq”Âl€š%Kf!o˛ ”Ń-X‘śŚ*—ä>žľ×T]š‚aČNpb<ÍŔŇV+҇ÂĚŇĎ4Šż0Iăŧ~ó•ď&ęĺęÉ-=Њ*g ůM.Îŕ7÷ěbŒx˘ŞąRᎍaÉşŞ ÁřLöéÜ5Y˜$™‹=6Ju–Š)‚­*)–(fô¸!Ÿ(ď’€k•ĹŸƒE„Tâ°Ă ô *oCœ‡ĄU~HV#ĺ8|îó`óυó9‘7ßÔĘÉôˆŤ0Ś:Ú ůĺŒfK*DŠ’GşBĘx>=É?—ař/ΙÇâ>ł¸NŐ×Đz%b`ŹĘ ŔÎqKB ˇš`˘ÁI` M^Řč™PA^$žUď-Xƒpş ӛ‹Ÿ/¤“ŒĐëP˝ßÇ2œßżEĄńŻ‚NX獿š=¤Ô–ËŠ_@ˇńŤŘöĂ{Z/[kđ%-ňFSţŹŻ§ËľHŤĘ­F…"÷k‘Q.ţď@Ç*S€ŇŚEĄâš!nú”Ź˘3%4b”HĹ]“‰}Nv]›jƅ)”‹aEÚ É4 şnĺö°Ő~^LĚJ'&ÍĚW^PuX„U!ňý~×kuľtÚKԔvw S>žI-ăAÚgíÇjŸľďÖ>ĺ`~˜JéjCϊŇňšEážĎ%Š÷˚uúĄd㯭ŰřkrĎĺ쾛됫L+RŮ!Ëm7 Ťšˇ/ţ›óh7ž€]ç–ÓlńTʂ‘’ë(¤Ą÷!Öħ\Sx&ďdżˆVˇńˆE}§Ţę4™ŠĄ}ŇkfażÓĆĂY~Ť‹˙ÚE•3ś”Ě"üÉ ™ńj@Qo§(Ą ĆZžŽ¨pŘgöŞ_íŐ{ŽqZ%áVĄř'˙\ätŸ*V‡çÎ):”‡’ń3¤Ęł˘ŰOf`-ý ëť#*Ź °œ^vĄ/đŻŢŞ˘öH„Ţěë[ëë[PŢTQ(ŤčŁúÖę5ĽúśĽÚ ˆŠě`é˜ćÖÝ3;ĽÄh<žo2KĎĽŹx!0ÝÚÖ5WL3ů&[ä?vÁeH,$ŘűĂjť b‰SŢ´vüVÖŞx˜uˇ-T‘˙0HšgWŃâM´ˆŔyúňőXĂnőŐAj¤şPt(ĆúQGŸÇƒĐ~†ť‘Ô§ŞŽ(ž0€2b`r~=ž%‚ p˘ţ*sl+5Ŕ9ŽKŚśDŃrĽwî.NŸ‡ßďŕAbżľ×хËČ˝]VФ* ! ţúŞtŕqG• ÚëPúŤyĹ(/5ůŠóĚeaöcG†ľŁŻ8ƒ˘ěă_2WuŚT+ŕź(”ƒˆKmŤRDóŐřdá˘Y?Ěa?W‘M>ŸĘţXÖ9y Qü™"ˇäšGŚ.÷ šČuB%uă™\vˆŚă"ͤAf ,čű{ĚíŚâ ľ!ŮY!o>œ^œ ^ŸźýířLuZ[ř9q˜Ýăôr‹o‰5ł.~ۇŁŃöţöV}eˇń2 źź<"Ű^l6š]ÖśŠŘF=çˇt!”˘‹jŠöaąf˜NěÇTܼž>RIhâń7ĽÓЊŽ~ŤC]üś>eÄGÁw8ÖÍ>#Vë¸t’:G€đyń;AZtN…&ý)złŠM˛GʁŐ-u˜Ôç!íćĐ4“g düžŞŢƒľ}ĂőéůN).'LEäŕ_,ŇdĹ͕‹C…Šůʢ@›Ž…ÔüNKą°<]Ϟy)ŹeŢQ‘ŢŻĽaă >&ϑŤłpĂ s—ěÓ˙N3|)U°˙_á‰uA+IYü‰0!úTlŇíĘa…#ł€™üčóür1PţśŹÓ0 ńb¤(™zňb őť¨ŕď‹ÜP ŐK6ľ“ާîë‘{-םđ;\îÄďśÚćÎ8‰×łňYŐÂ(Ę/Ęň/ČńY–@÷qdÎÉ)č´şŒzŰԒyśŁp™úČÓ€bă^€^ú\ŮÔĂ[ó𖼘ęü‘{´‰lőÎ9ËT•e•mKŔÚşšUyZ̖>ăŢŮs.ƒąJwhn4}´cĚWáë•T[™Ă: ‰Ž2á”^Ŕř¸uFž3:ľĚű ŇŞ™ŕDIÔ×1šWíš“шˇžřÝݎšöDXŠ ĄÉčŰgŒ~ćÚ÷pŒ•™ńŘ.ŽQ…˝Ę)–fIE…Ý2WUÁjř˝Ú#Âogi¸Ď^O”ŞOłűvŹÇ¨ dzؽ〿zƒŮD<Ć@ޘ@Ę%~ćTqq?{;s҄P$Ą÷Ŕ|– oŽüŒŹ<.Ęqůöl~–#žß…TLőZeşpŠFľ*‹rÄ3%Wrőâő4+ŽŰ!vľďđÁ0 c!ÉĐ9öĂ Ě×ę¸›źŽ€>-\xčDX&ú˛ŔÎř–Ä-Xs4ĆđÖĂX{”ApaŞB€§ ő~¨nĆÜízíŇŠßňZm­ Yî@Ľ É n­!L38҂¨Ňż4ŕřŹ#étüťž—GÁ%Ü‰p•*X˘ť8ĚüUůkěĆvÝ,+ą°¤´V˝.Ó9Zš˛­(8#,lŐĐÄëącÉŹ?˙eőçňěą3ŽĚç“[)Ź“DŽ4sÄ<[wŸé*ŸV3§™G¨ĺSí:žĄ/nšäčÖ}}k¨ĺ°ź›É#ôöŃřĘfűE­´XŰú3ŕjPD–ÍĚł[gAĺ—ÔF3RßpFęŤg¤žzF8WWßS0Ô.{™L\U,Ć؏˘Qü4ĺl~”Ř“0 Ő-Ţ3Ň"Ě<šŒ’Ç–Ů…›™]1gu°QŠŘ°řÚm˛Ýóu,ⱝ6jĽ.˛˛e=9Łvv#iä ^=[ÎítbZcQ˜“9‘˘ł}ľ‰§ögľ\˛ď3ŰřŠŽ łX,_m‹Î"JuEŹߙ´mŸnjđ{í=uUƒ3ŻŤ­´ŕs˛Ŕ(eg˛Íi+#ŕú>ÜĆđúŻ|™ şMđWaů‰]Cuć&{e–ĺ]ÍmuČ_oĚ6ëÂe8™Ö–Źm)gĹjQ•TďŔ6ŒűqŻ z˞vn á4¤˜ˇÎ™ç$1YhG*ÝSĂ5g’ĽČpă Ď3éšş‰6qŸgrzM“\ JÔ0_>SţM+_]ĺź3ęôŠQzœd%čŚ7Îŕ  iË8ś6Ó0ðh†Q–Ę@6H MDŠşşœď]ńzDą­<äϲ2˜wîŤőB ł˜ŒźĚŚŕź á§HE%ΎąňÓ9"Yvvȓ'„„Ĺ—+JD暋Ÿ¤˙‘r&íîîqrVݎ§2Tv0kƒ;™Ž&łKžĐ\]ÍDߞ˙íüŐťˇŻNÎÄöłŤů´žÜĆ l´mמ@‡ž‚đçƒ1• @głrkćßb2现aą2íĤTĎ ^ýgżůń@?ÚIgŸÂŘúh0˜§r}âUÎXœ~{}rzŒ÷'aD\úUÝݟ~Ť‹ÚÔD)BG*“xž€×ăŠó)ÚŚçPççdŰËç@K,†ö‹ĺD,RýqxöÖŰžíšLţy[§×Č{ůhböv•#2;2Ľ*őI!ń¸"g÷9ŁCTĘg×ۋíjUh¤Ű×A4ádb‚É]Xh–÷A2]'Ł=—ŕFľďÂČ+‘0v°ŠpŒŻ0Őł‚|č‰~SŃźZuwjćÓćGôţ>ýóŠöZă6ŒŞNżŤ˛frŠŃËőťĺ痹ut(Řžg_ŚÓŃ űŠ“} Â\ &ţ¤Ÿ?6đÂ0Uőc^ĄĎ+%é"MP…ő$ƒ ”<őDŽ(Xő@CĆaĘ8JúJî˝Ţ.rŻŤ}ósCuÖÄ6WěÓԜUžÚĎŁĆĎ#<Đe:Äňů .ĆücčŘO°<ż:W"|”<ÍżÚÎpĄ•IIîSD;Eö­2ŐĐćˋ˜OŃŔ悊őę‘TÁúm*ôíďé‚ýN¸ĎMeżż¤3”<÷9Öz÷MhČ}‰šÍęď,—Hţ}K‹Řü;şƒH ¤Ë)C{ť&â"łAkXNRyNŰ y)Ɠer=ˆâ9ěňTŤo<*8čĘÇJ ˘¤ ůPýúŒg >“TXĘp1% Sއďď홂řw%ČŃő„˛#Ż )ˇ‘PÄĚC ‚YŻéşTFM‘MŻIWŚŐZ͖usĽBNŢ9„ťŻ)?¨łâäî4ř‚Âěf‘qvÚMč\ź3dp§#3D<˛)?‚’›iŹ@$˘ Dľ$BqU†𾄝ţąŒ?‰?ýîGľHłœA-x…ń×ĆrĐđ+ČŢé•ŸĹˇěšz  óŒa#ě7×ĘéfM[K‡{}úáüwD‚c7Äť@Ÿţ˝ůôŕŃĘl9‡Ň^ŰB“Ĺ#ý=žg˛ŐÔ×gÜÉjů<đ§ĐJW( L˘ ”Ňnż0đŒőHä€)%˘˜çšĽœď4Ӓظӊ-V šrZŁ48%ňŽ*CÜóăˇƒŁĂ‹ĂŐÄI8ęÁR|ĺä+NĺIUœ9/n˘i­/-Ľ-ĎBąĐ×Ęq é{E”§ýFöKđÖӞ>É´UǛŹ[OđÇŐÄw–›;číŸˇ‹ ‹1ŃYM2ůuÉB˛`ˆŇ9–(vĚŇa.ŮÝĺĐď:‰!fRTqßŇé@˘‰yňŹ%xżŽŠuó˘An65ůćBÍZ]{¸p–zz…ôa…´ađhKřړomĐaF /žŃ÷Š”Č|ĐĎÚäWĚ(LřmŤŞÜäE,r$Y¤„Iv•_¨œMŽśóm á˜äÍEČÓfÎ*¨č˘ŽŚL™Fë‘tl~ô´ÔůXżü"ü] Ľäĺ[ˇLë6ˇî—7î˜Ćݏ&0ç"ähbkpœ˝ÂJĐ*mŸÇL&źüÄĂĐťGů;Fá#ďĎ[8ČwgÚ÷Ńüňú•Ž‹/hᫌŞ•çácJłE ˜ęq8Lqk´ažúŤĺO˜‡&Ö.ͤ`ř)žÝLtÝţüěřđčoÖç‡ćóóP×ţ 0i8ş”nSŔ‡G‚ŇĹöć݇óăÁÉŃŤwGÇŹŮ4i|Ž^I§ń+Ó0ˆ)IŤćUŃĄ ëžÄ ´_'-Ӌ˝Ö­ŠÍ´š(5`ž÷ä<÷ ćůüoo'oĎ.$Qw5ŠT‹k(30Ż@5Áť n-žÎNÂ^ĐőFŐĹ$ŁÜŐýVßë´őNĎëręՎw‚đžyz<8;ź8F HxĆώ˙:­zuaˆkHrxƒ%^(#W;Â䚉Ž0ČçF>cN&đÖÂđÓŤ7G(†°żYąČgŘă`óŻ\~Q+ňfl-7ţ`ŤźÇ ĐB<Ľáf“Ę5%b~Ĺ >đ/w_cC$/*Áł:-9ůł8]Ě,ńÔp 1V apU"ťŢ&ŕŐ,nŚŃ:…ĚňßŔţˆÖűIŔőwhԅĚ֑żŽ…łÍŘĎď2ąäGÍďŇqĘLR8÷faŻhdożFO,éiĂ;­^v’šŘíW[Ç_-ć,ŰbcŘ`Đg2&Ľ¨uSĺ2œ0} ĂL#G:)­hÍ´ś6›ÖÖ˙ň´śţĂÓÚĘŘ~Żĺľű¸ííy_nAFPZĂ?—!l ´–ľJ R^ĂĄôu˜múü%m{Ř Ż§ĎhŐĂ6ŞJöB`°řg’Ž™Đ‚†*"§&5ó„cIi˝ smP?ˇ5—ńČyëŻ|Ű*xű`ްэŮčet+ՋÁpuƒVqu˝•˝9î$Ëqô2öÇPJb›ŚŢťt'šŔfiŕUčŮ7<$˛ť4­žs'ĐQŔzk?s/G[ł×wŁ ňP8’R_Œff…aËÔ[n‹MŁ-v)ÁŐ3ą.ž˘'˘(¸RYaUůžłrrtüöâäőßî?1ů/]w™˙3sňKç Źô'}‡# ‰"ď;äđÉw#‰ ćż×n‚Änwč‡Íb7›OîAgĄGhîžiO­öRßgmžÂŒ>lyş_ćâ ĆUŞĂ *[ĆföR˝„ĹÉrţ?ŕĹĎrBţËŰbŚpn7íŽf‘Ő|ÍŽ÷~őŸ‚Ë$7ăëjČMšĺŐáű×'§''čĹ_‹˙}éÁŇĄësęKťď›Ôa“ ˜š”Ýßäﭏ;°›@ďáĹ.řΰ.Ö%ڏŽ<ňK‰ud ć‚ @_ńCUr ÉJÇ/“qŠ9ălBRŽ Ő}K—á„,R]şö0á.(‡&̧pCoŸÂpŽs@•^R&şŞ —I vęuŠ(Ć{ă CŁĽ=TŠűŘ'}ŽřPmIşCďĽa.ÚgB…yH‰Çłľ<>GËľ˛ÔÝe¨ŞÝÉâx‰<)§ó— 4éW“̡˞¸ś)WĘGÓUm]v ˛2çÄńIóŐ,€ „AŁ2š1Xüð1,2틘gEB܊Ś÷J‡kľú<öŽoJľĘtÖ$œ`‘>$5ßOđ#OźýpzŞţű$ýLŲ|-LÔđ #Ořn–ÔŮ1˜tĽ9ÂŹA&TĆ^—l†<ŤŐG^-ż\šč&đt–<ĺ ţďńŮť ]é9đF )_%Ű͖×ÝERśéKÁqÄŸ-pĽƒý …˛Ěql°U–Ş3Ɂ u"†Š.[÷ŚŘ š,°‰ç´œč¤ƒŸËĄ¸‚ V YŸfěď,ą€'_öąÔtî‰+Đ^pCÄ!{e[ěf]>¤#ŤČِ—EŠču›b*‰JŹŐj[&ĐN+ĐŚißr¤I›gŽŞ",§2Ź!)ÝԈ܀„’mJ‰˜E,ĎyÜj›ŕö0Œ„<ú­GK[őŒ¸1ŐţŔ Ń˝Ž›lŤV^ŠßAźľˆŠ…|'użÝkŃúPIŃ6ć^ŘénQŔîRßޕٲî˙utu-Ą$ ŒŒ:ą˝PÖa!ÖK+‡/Ďߝ~¸8ćŔÖŹq=ňk[ës*żŸüöť<žĘá|ëŇüíťÁůéńń{‘ůŽŻlŃu ~ĹM˙Ő_Ľžv$öĺďG'çřSLČ=&dW'E”–@s=N°:ŠJYd;¨čúŇlMcĹÇ|ŘM×GäŮSĽ4­sŐöÖ|Ä“}›_üŚ2:í6uˇmĚÎ$ćî,WŽ ţ¤Zc^܆Ŕöćë_ęÜő˘ńËáç­ü[Ů:n\@oŔĚÚl‰•ţgۓ$“ÖꎹV™=0[LĆ*ôМTЋŞÚĎÚϝ_MŘűp–KŘulUFXĹX<ěnťËĂŢíZő ÓÝ(g¤9uţČ*Ąne-aBĆ­ăPĆnS“ÇÁ8vůl–RSł!ßr҇yí÷bkZëšĺäőá{‚8{—‹Ş?ŐęĘ´Ć^sĎĘßúĎÓsňńTHŻ?pIČ\AQGB×-<ľˆ˜ťB˅._˛ôDă¨*5]óÄŐ ”\ž jC_qSR­řڤZq†ZÉMIj/,ٲƒQő .–¨” C•˙ Î4Ő$4G•ŕ­č.Mýą’j˝™Ś&[ÍSś.lA˝–‚ęąš2-VĆĹŽ/ٽۑěţue8§‚ŃLÉęJň7śí#Ůšˆ¤™œŸ^œüw“;‡XÖ^ńvą"CŻPkÜŰm6/?š_˝}wöćđT~ÇŻ˜&ތŃęőşŢž>֐ßĺšÄĹĎŽVlSÔĎíÜu÷` šégéP(=§F-UŒ­ ĺ0˜s;Čab! ž š•ô]вŹo˘ Íť˛žąB†rşŹ ôöÚ֞č,¸ěi¤r>+ח‹ůŹXcţ>ăŘ(Ÿ†‰Ă4@g>ţŸ‹ăˇGÇGŠ˙ö]~ÔZónŻO•\Z}ż­jüŠ-mWĄ¸őęKéś=†¨šŇżžüˇ%˙mË;ňßîGH´ă˙gÄxą˜_Ëv^[Q(زźim(ÖËvůUhŐ´V]|¸ Cť¤ĺ˝÷˛Í6"]Ľœü?žđ%]CĘűîäw˙Î}ľ×ěĐNŇďěę;–:ĆTĂ)O‚5Łx8›ň‰SĹŠ‚7IŽ‹7ŧHF6PÇ}śń˛ƒĎxĄź˜˛ .Š°ţůě+;Ü3vs˙ň Íť,Dó&PXĘpŻŐ–‚,%÷Áłărśĺuˆçßš;şÉCCŠ_şŁťMĽŰšĘjZ~G/#Ší˛śú^ŮfŤˇz'ŚŻw{Qâ>siť†ŐňLC7Ž?ú˙[x°7Đgpm-1.20.4/patches/done/applied/evdev.patch.gz010060000017500001750000000015370760216311400177650ustar00niconico00‹Kx<evdev.patchUmSÚ@ţl~ĹítŔ„4 ` Őń-Z´Ž`Ťýr’CŽÂ…É]@TúŰťš M­ ávŸgďš˝ËnąX„!ó¨é­ý¤>|u9”ŤP.ŮVĹśĘPś,KÓu}Ž19<ĆŐlŤ”ŕvwĄX­UĐń^ƒÝ] Ţ1î "ŸÂçăŃÍÇßÁTHć]›ýtRšţŽő|ڃĆއ´š'ç¤yrzŢ!ŘľńQ$cşž /gÉ]†MŽî\Ú('Ě÷4ŒÍąĆŇŚU‰Uâ󓱙ЌBr:˘u f˙‘%¤‹ëĆ%:öé84gLѲ{ŠqÁŽ8ćËëť!ŹűŽt š~§éB†‘'A-(Zň؆|–łłë15Ąă ŝ‰ƒřĹ`ŠKaĄIŻyE.îÄŤ*€šŔsçůć\ډĺ Ţ ü%~ÁŮ–óĽc/í %ÝHʀ‹DýŠĺü9:=&űŠZ€{Č/‡ëóůĆî ˘…z:n7¤îu=CÁYó¨ńV Š›Ň ĆoqÜ<oâgpm-1.20.4/patches/done/applied/gpm-1.19.3-owl-warnings.diff.gz010060000017500001750000000003260760216311400224170ustar00niconico00‹Kx<gpm-1.19.3-owl-warnings.diffuĚM Â0ŕľ9ŀ˘tRkKƒHւ;/ mZ6-ůYôöŇ X*nfńÍ{Ż5],:见 .j~äŁ3}6˜FófĹ!Œą?áÝ=j¸=@˘’%"äˆH(ĽżK)~ň°”'”EąÄQ XQ* é*E`ol󊭆sĐn0ŁçĎËZľsvÜX´Ć‡vAöEœą}ŞÓ­núM˜'l­~öŮňHo"/Ěq?gpm-1.20.4/patches/done/applied/gpm-1.19.4-syn_wmode-1.patch.gz010060000017500001750000000063570760216311400223340ustar00niconico00‹Kx<gpm-1.19.4-syn_wmode-1.patchÍkSăFň3[ľ˙ĄĂŐd[’ÁxńB6ɒ WK vIĺŞR{*!meeÉŃcÁIřď×Ý3’F˛l uŽ˘ŔŇt÷ô{ş{ěÓ)ô’fËEĎę[Żú‡ý8 fƒçßž˝<ď§ŤČ]f—jkk/_ôz˝G)ě\ĆüˍŔ:kxb['Ś śiš/_lŁżs“ ř(–`Y`O†ÖÉpL˜ÖËoŢ@Ď:C8 GŻŕ͛—/Ÿńs3ŕ‹Š›‡|qCÜ,Ha”bžu™ÜŔ`îą/`é&îBd"IaŔKy*šÖú3 ÝYąRĆß,šˇĄ€ ÷–¨ń”i=ůçciš,νůŇőánxs¤˛C?’ćËeœd),âD€GÓ`–'´Ż#‘8JÁ|¸Íł ?÷qYƒhՏ ?H‰VWeŚA4‰“Í‘ÎăĐo0D™Śř *ž˛6–řœć‰xž6áú¸-iĺL_$LMň˘qˆŹŁňFŽ˙A‡ŚČÜĽĆw(Z,‚ŹÉÂ"^%ÂmœG,YÉÇ3dBA2×Ë ‚ťĽl‰đ5ž]bí)˛AÇě›ć Ťkf#ńĐaž&ţż‰‡9´7Š—¸Čf;7uŻ\¸÷Á"_şř2t=ą¸üÜ•JŠäʉř÷$´¤„V!a)˛/#ÜşĽX˝Ąˆfٜ,%C\FŮóę‰H$n&(ψHňŒc#‰/"’FŤŰAé˜RâtúœœXOţ,BĄz‡Uďř"tW­Ůă;fY9ä­Čîň%˝ňyş`ŠL9''šĚÓӒ=gČaag•;^žđ7Jä Ip;¸t?‹i€ŚŐ ™ćZ{ĄÔ„ÚůC쒴gcźŸŞBÉZ+”Ö0…ŇčÄ酒qŒeţáéđŽ h7ĎâjĎsĂpÓ$^@Ał1zť*‹їĺU/Ű<}?Hŕúřş—&ž|Ěă…`U” ˘Ŕ‹‘ĎĹ2Çü4X&ń ‹§ši€r ÖeAdźß~ŕ+†Ĺ’°‡8BÖOřÓFS•eßÓľ¨˝n7Đ(b‡‡‹XŠnÍrŹ›ĺđȰL´ ýW,›ÂÇŁjSq†‰5d;•%żĽ\˜šQ&ëPŔϸŸ:ČîT˛ă :ô 9k4´'\ΆbšÉm ‚{ßJáhh) \!+DĄWٰÚĚĂŃh,)ÜĆř I˘•Âíą˘€žX!ëń§ňphnŕáŕŠEŠRŽŹu’Q´Ű(J˙&Ĺa˘l„n(ů.p× ăü€Ő˘ş{MďT¤­é•ű]aVąľ×îť•†Ëśiőë: ͟7ÓXsú: vőÍŘz$Ô ˙ߌۈ ˝Œ‹6ĺ7ƒŚBk ¤°žůć¨RnF–lĂ Íd*§-~úůý{ccrÓř¤GŢZ2ýżŁˆŒ?¨„ ‚ühlŒ0ȏGZSR ˘iěĚ–#Y˛"” gŔw2Ě!“"AăJ+XZJ˛pŐńĺU>žä*ërTçîsNd+Źź˝Ď"Ł•C ‰0¨x–$9v@˛üÄ b9HbR{‘†B,믌qž8˛˛Ž/°5Ső•Ľ.Đş™đ˜üąęĐB%e•,ëĐ.‹ ¨KđvĘ$CŮ:ę1Ę ™~˜ćCYŇ tc~ᦎ[üÔŽ&Ćzů%|ŔśĹ!:‚QŕC‡cÔ|NĄg ŘÇO¤:éšy”3ĘŢÜM°›Ě2Şi#â Oäw<::¸ę×´ ٕ`H°wŚ2Ÿ^B{sŇm€]P‡á5?ţŘl"r†Ü†h3˘ľ†¨ĺŃmˆć¸‰¨çŮmˆvQKĂ[w´ńAz˘îäieóŇŢhMTřŔV‰ť[ëVŘJăKĘü>;âcҲ­cƒ’Ęi*glzzs”R ˔štTjíԝcŸN CiŠŃ>*żRÁĽońń,Ő×Ňë Öźš Ň× ä$Ť ćřłpî7-ŹÖĘJ ĹUĽ˜t:˝öд޸ §§Ň)aŤŐacŐ3ťŐńPj’śşĂ ęHćaÎÎŔîÂ_¤_ÂŘŮŠďŞ@,Ň\šŠÂDí(­Ń;ă“g=ŹŽćŞ:’:6 Á@1ż˛óć=čë,ËĂq+ËëH÷Uú(ěe)ÍMťđú5Œ›šSşÇ¤R_ćĹĂOk;Ź6î0•$7ě`ËĺăúGë;÷k¸ƒŘŸš*a1 ÎÖĆ%a­8ŠSžšŁÁH¨zp˘# e/ľ/–Ś"“ŇmaĽ-Ź&ĺ&ĺ§Íűž†NóÂkĆ& h8AQUƒ>8˜‡~}ĄĺFň֊'úń‘Lą­,ZáľmëŠćŒÄmfKRÇě0Ł4ć{Txy|41Ş˛4ćF‹nO …ĺ˖˝U˝ĆŠĺśńů‚tŽS˜ť(¸ş¨Ž Ju›Ń€ +:’EɞFۑłWM]gRšúei]š˜Ńˆ,Răk6Ýň|9TpńL›dŐíÝf˛~@“SO` Ĺ9]ctJWëUŽÖ5jääí!M‹a´…Ÿ˜úîć4ů×—ÔŇ$˝ŇHŻşÝě5¤ż'%儠Ť;!tŮă6˝âľŰş—ɨZ?ÂŞĄmďLył\,ÜKŹ\gmĎŻJ ›Ô[o€4űHŻíFˇőXp`ÓTżšS{Pď( w–—fÂ××ÎÔ2á4ĎYžYE|U‡>Cßt˛+>úk2ŐʂKÍE}"ł&hŠ=˙˛TÝq{qޚXľe•łTźn!ď$Ů,7"˙ß´IÎBKšĄ×ő¸<}$‚şmúł&uŚž”Ôz˝IVÚţlÝ3ěśüÝ^ĐéůŽ~V€ĎÓ *j82…ž˘éZh-xNŤŸĽąmˇŹđ4óň]ú’ęűۜčĎ óţęóÓŐÍĹ÷çĆn§)%ęëXŚÓń{ťĺYKɧHŸ0uŒđßÁAˇTĆş˙4íĂŽÁ$á×`˝0ĐTen) Ě-şšĽĆ3ˇpć–ęĚÜR„™[Ę'sKáŁÖŞć‰ű§˙áČTżd›&ßź‡ĆXvKrh˘w6œœfô Ľo*:&n‘`ݚ+¨˘˛wmşÚH°ƒ>cW<ŁöŤ–™ÇC9^ľlT€Eăp|\N;¤*jăTůzS ôŚqľŔ%‡/"5­Íä‹Üĺ¤řŕ2§Ş~÷" ˛Ŕ ƒ?(˛ŞoÎqŒÝPs|íúePĘU6Âź—KěńgMřZˇLü+¸r1*öŠiŔ0â9‹@0ÇĐS°1ُ'g'jžŘ9˛Ľ4ożűxőţç›sçňęí9ť(:ř/Ţýč|8żžúpă|řöćźśxýŃĆĺ||~~ łW,*¤_œŤ~貺Š•ĘŰá ě'8i Nř_Ĺ7áë*gpm-1.20.4/patches/done/applied/gpm-1.19.6-rh-gpm-root.diff.gz010060000017500001750000000017420760216311400221510ustar00niconico00‹Kx<gpm-1.19.6-rh-gpm-root.diff•TmOŁJţ,żâÜޘËŔ`kW‹]íŞš^ťąŐÄÜBa(“Ľ@`Đ6űç÷ĚĐ7÷^łYŇ2ĂyyÎs^fbž$`5ĚĘšĺ8'ýƒ˘âłn]E])ŤŠB,wÔ?i4˲~áź7nrłÜCü l{`ăĆśÍ4͏‘÷ĆĄ€Q$ú`ܓí´nçç`Ů´&ž?Áůšň<ƚ˜ÁiĆófŃ}é´O׀§Ipq9š}ş˜ Áčţ×ü‹°ŠĽš˙ŒonżL~2mğܢhćVÇň˜‡9j5.I̸šxăçąü˙sqů07ťxő˛îâFUQKW™Wß=¤Žfßí­Rۋš=ŔĘ%Jy€-X3&ÄRŃD]]V<‰ž‡sF;¨ŘçúOłVŒ‚ ĚĘ4 ÍB{‰én˛y‘×]ÖĄőzxÜłíUpz”†äţńîN˛Źf*꼞ňź;çůÚ{ťý+śË¨ĹâBwˆ'ÓŹÓ˘Éâü/iX–,WYj›âc:a“‰*šc÷Žä8ŕęRÇUeŤE(xX(‹ZDE“ o#ţŠ"ƒF‚ż˛9ËÔɆJJŸŸ'Ă`ôp5|ߗ߷×Áđţęöâ-00ĎLůŹí9ŕˇŐř-u2QÍÔ61%Q—Ü’˜Â—Ű;˄ÂUžă›*â‹vYśK„M*2F4ř.밆ËٛˇŞB߼'˛ ý#\epžYíÇÍźü×~ń#kćůJŕźx҄űúJl(ńዩV÷…Žé¨nźĽŹb 9qŔ…jz& óS› „ƒ=@.Ö‚UÄ˛ŹŇ39Ć1?TZ›rľtđb6mfAVĚôťŃup5üüxM;—×}Ű]€Ž×Ă>§ű|\I‡JďŸ÷é*+şĘ’r˘xýžĎ–.ńځÄň”YayRě}ą€ŠeĄ+Y/)› žŕmÉţŘ $X>Ȏ[go<i×ő@N,Lß]÷őÓ1ŢŘ×cGŢ mcĎĽżôÚÝłż4[˜”ńY*,gË9  N.8N„Ř̘Wxw¤aô­Ś0m„4Ăo–•8mđVĄi>[§PGkĎŕoœ‘Ż“K=˘ $˘zÔT•i_×§äô´GL=!tG˛>Lđkčď$ٜş]”ą^ŻQ’˘RŽŽ_{†Úx*L ç"ž˛$[˙ëŃd¤/蒨Qfj€Ížéşž$Ćę™ú‚HGí éZgpm-1.20.4/patches/done/applied/gpm-1.19.6-to-blaise.diff.gz010060000017500001750000000025460760216311400216600ustar00niconico00‹Kx<gpm-1.19.6-to-blaise.diffWkSŁHý,żâŽ[e%%ăcă–-ľŚŚ(„NBm,4cRŽűŰ÷Ţ DÝĽ4$œűč{úÜîƆCP“ěŒâŠŞwôýÎîNšx;řłăUޏ7HŮ“TU]é´1ˆB¸ö8€úŽ­śaĄiş$Ëň[…ănş šf[]Ű董!ƒjZŚŇ™nűp|,A~ąŸ,äęá4ňƒaŔ’ <Łg×G}Řن8‰bwär Óí Ę85“ÇŒó(j1K࢘;)ű;cĄÇž×Ń[=‘Ňťáˆ3ˆŸ%N–ä5[oDÜęaĚ6ü’äVĂq ţéľ×Ś+Š‹&ţÉAȞNú@ŸőýŇ,B론]rZŔË֒żN5cćbćTĚçxÍ\×lVЍf°q—…pÇb0ş [6ęBëž§Śz€şŞ4Ë6+ŞęĘ.Čř™kJB";ťŕËpT Hňď>!ƒ‹›sâœ^˙ů-çľk4ą‡›‚rě&v~ýp{˙•°= ęĐŐŮů}îf6ĄÁĺééŐAFş˝źřšťéëgnxlmĂçહʑűq–OR´=ŰŇlc˙˝I*<=oؖYíyŚ‡n]­hú„ń, á) 8k }ĺ1Y˘Xm&ź”ýľtIrĘ]x„n`§Fë"ž:BݰM(S:ôےüL‘Ň`2ŸZ+<ŃwóGŸ˛óg řó~ŢÔţ ›xLîřlÂݖ¨’‘jXť  ’LçkLç S2.Ňj?Đg–*ŚôXʁáÂkƒÖ~ϸĚ˜2ĎetFa …9ţ 4´™ŽŐ#aĄ‡däPżR’N%Ą÷ÂççUÄ ¤Ľúóö °KŕŰCĹö:ľ`A~ÇXôiəHD˙kdfćÓňBZŤčiŕL˘Q0M˝Š‚,ŹĘhŰwšŰŚ;u§ ÜĐM, ĎBó–žGšˇLCÁž¨i^ë“ŔëJŹU2,g-TM~i8ä[8A@ƒŠ_8"őŸĐíËň+pXˆŃ~Áz…Kźő‰:šA]Čř4ĘRöQ|Çţü3 |Üń‚™›ň”ś°y”ç†€ű1›ƒ…!Ăӏ Œ’Š;›ťâ(አÜĐuSŮŮĐM …¸67⣛ŕh.8Œřr×Cőßݟ:çWŠď]ĎÚĚÔ¨jڋ]tü‘˙˝ˆPϛb>7•ÍAŕ%Q 9\†œMp˝ ’ …hTp3ůŒSiĆNˇÜ‰”§1c¤ MýMĽ<žTJAwŞDdQU¨¨Â+F^ýÄ*ĚFňRÎ"ŮrVůYżźŸľXÎKŮL0Hé ꂺłY<‰<•.hƒo5 ”~$œ*‡"ňߔđA×îÓé‚XŤŤ1ŠJ^çŠĆőťŮ„Ż*÷$qŽÖÄŰYO7đ&řXŢCާŽţâ͋Ţ:FëqÇǁˇ%u…Ż6ŰŁQŽ šŸ™+Ań]ÎciZŒÓánœBšĎĺÉÚĹkϋô/ÁýÎgpm-1.20.4/patches/done/applied/gpm-1.20.0-wheel.patch.gz010060000017500001750000000034530760216311400212540ustar00niconico00‹łůó<gpm-1.20.0-wheel.patch­W{SâH˙űř]ޕ“@D˝ő˝§Žľ¸÷ÚÚJĹd€ŹyPI˛Ž÷ŮŻçH(ˇu3ÓÝÓýëçźs+JĄďz$†ÁČWőšĄŐ´zŮőšďÚ¤f×"ňľOF`NŽD ń–:nżO˘ }€z'eÉřZł—Ëb[UU—ňüÔł8'`4@oľ›F˙14ͨȲüŠ@ĆwcEČzŁ­ďľ-Îw| jÓŘWZ ÓÇ.W€Č őđaœ$awƒ3ú^ŻFőċ <—Xœi7ű/íjŠ\؝̷'|_p‹ü‘sIC´Ôˇ!}dˆIɐř°]ϸÎOÍżĎ>~¨nöI¤]čÝWűŽ2[rŮ)ÜŘÖ3śŐRt=gmÉ<ť*ô™J BUěLĽÎrŽ4Ǒć9ŇÇKEÎŕŔÚ6ŠÂ‘5°ĚgÔ0š,š›áƒoe4i&EšÜš1ńˆ (˛.`QđŤxnKˇŸŽŻËŻ›‰ë“pœ ŠßH˘^ԎLâ j‹9UW–ÂQbÚŢ8NH››P ”n7ôœwtýrŐ+zEŽÎ’!ąŒÁĂĺÁ] Y–5‚ȞEţyi­śą;Ď"Ý0h`ŃG–Eă vqŔ"—DY€wX$X€’Xŕ˝Ä!°aš"ČgRâa%đdłxâ/ÎT'U) ž<Ąë,h€c.Fžy–¤#ô‡­ťAśçڏq‘ -¸řěńšƒxŮ[ß[ćžóžČ1ΝĐĐŰú~ž”éŠÎj™Ž4÷˜a˙Řş âyŽŽc˛U Ö'zşVß­ďďJ ę8ą×f¸Ü˜~ܨ2Đh0Ă6Ý#J٥ێ•XR ÍGFĂłľ;IYÉ(VłÜ€j•JřŹ}MĐŚ†&Áá!4$^<ŇOr…î{FÝŕÔz‘Úwg ˝V ob=d ‘;Îä Ű4sćjÎLŠZ¤á‘ВčlCçsIťL\şŽ¸&Ž9gäĹŠ\[^ŤÎˇŁ# Ü Ph}ćA^Z㉛ŘĂE‚gQ4m [.‘vŃc˛Ţ‡ˆXĄQ"TWöŰEˇŻ”¨—K_DĄH2Ž=lIÎčÇJ÷úŽT‘šľ˘đô?7żŕ1ϚâűŇhŃMtÄw ŇiS[\­V‹1‹p^ÜݘďĚëłó{ ŽXŘB4Š3ălźÎysuzz}Ćyő2ď§~źş¸ź/łÎ˜ő/óĚCWmÂ?ÚôD[ž§ ,/ZyAF^PúŚ 4/¨™ rű3 ęćCTVÄÁ$5\,›¤J,+Xôě!“ČMíŤHĽ4štĐ ysc>Dš0ŐÉ_ŁězC“ ťBHW”aÎ)ÎAŻÖ't–°ärÉ(“ϲŠŃ^YY)/Ď÷jźhç´˛K´šK/ŘŘˆ˜&ćĺmr´}ăd×č+,â‹­ľqŠtŠ/|ż—đnLňŢMń•Bőíq’něŚă—~ŹE#‹O;/{ÍMĺWĐ\„˙~afżkňŠŔKŠÎ3źŐ~‹Ü eŻ 'ľšTYđSgpm-1.20.4/patches/done/applied/gpm06122002-cvs-tty.patch.gz010060000017500001750000000007630760216311400216630ustar00niconico00‹4Ű =gpm06122002-cvs-tty.patch­RM‹Ű0=׿b6ĐbÇV,;M˛äRö˛ů Ą§˛Ż,§[2’œĘţ÷ĘÎÇĘÝ´ôP¤Aš7Oóće,ĎŐr ƒp_•rP!Ů>T’„{.ď9˝uŽ„Đß ďbŒc„Ç(žB4žEĂŮx:Ŕ—0v|ßżQú  hŃdOgŁńčr ( ƒOŕŸŽĺҁÓ"‚st <‡ßW؇Œći]hřžňŹ úáČrpó"ÝĂ=`~śŮš„fp Ŕëňš“nS5°šƒŽ,w]­°€2- A\ĽeAškJ˜ -Šç?TeB¸N2śgZľÔžçÁÝÖ_=Ç˙/ĺ—r!Œč‰¤•Ú}ŘŽ’í—dłŮî‚&^}Ţí’őÜ+ĎîIńJ2Žóć'Á (č˝W˝Ŕž›[M”´$ŐąE[)ˇ+ŕë_ՙ÷ƒ~ť™ţd˜Y/h[ž"_€Šš9š1Ö&8ŠZŠĽ¤\7í‡`‘4Ăg*5.6ޝÔ6{Ă`nşV2•ÎoÜĐ:qŰăՉgŠ…@Ľ´[ząS,Ż†Jľ`lřŠŁëżaŒH–4ŘŚoĚpÎÍłĆ0fÎ// ngpm-1.20.4/patches/done/applied/gpm_synaptic_diff.gtar.gz010060000017500001750000000533600760216311400222000ustar00niconico00‹ţ €<gpm_synaptic_diff.gtar›S0 Ď­ÇöĚ=śmŰśmŰśmŰśmŰśmó{Ţě°“ŚM›÷Zë xQá_žÜŔ×Ú^N[ě‰y~GrOËłŤCž_-1dŠČj*­LJJ^ZԑÁĶĊRŠ­-~oWśÜ÷[Śmľ–„X|ÎlX°Ěä|čq9†ˇŇ~ďCľŞ]+˜Ďž|Íű›X0÷{=ťúq˝K=śgŕíK;Ww/ž4îťśo_?xęWqF]Š—ŁŃ?őűEœgš|=˜1`VŹnđčE;×͙5;ÄŻŽeŰ/Ůű7§Ď35YJź†9´Vđp^9Bďó-œX-š1Ĺeý´ň%6Ť—¸­đp_ŕĎ;\ŤëXË[8ŞC~ž×;]°­Žn™t]ë_Á1Š˜![!­-x>źp‚łźÚzě}ěgcmnŃľvAs˛ľž](s9ßMrkŇş7ż+eY]qďÖ|çŢî”]TĎŽŽŽŽźĂb!łśłźŢ(3›żtu´a@ő/œ#Ű2GoÜҝšöŮi1}qż|đܡî~é1ňCTżüÉö­Mžţůúů˙îĐßăýýĄiŸ˙yžgé2?­uu X}řÜ!˜ké Ý]ůŘ{žCăřşkۍYOço"ŽP`‰1H€-ÉeŘłĽŠJŮuÚ˙€|ŽÄě̛EůÓˇý5˝-ţO˛˜ÜßçWÚëwœÍZJöZ2˜ă{¤×m@öl•Ą^Ÿ ÓۉŽ5łDupĆ{G@Œ§˘{ä°Ďo'y†żV ę{Ű*ĆĘŹ&HŰŘ1XÓ7ÂÇĘÜäâ{ďśţĚ(躙Ľ-˙—ÜíˇŽÉĚfÉĹőÎÇeO+ű˜Őů–=S”ŢÄŕF€Îeßžc<ä„ďĎ-蓯ŤŹ‹„* o= )ÇYݕ‹6⋠‹đýz{ ÜrBćľţ˛Âe*Đ)˜ŽŽŘOj„W^Lȏ‡.ɞGÁ8ˇÍČDĂČ 0D¤ŔŸWëwŠűik S”ąÝ1O( ¤,–#‚΀8ü"đH l*Šž{ 2ÔĹŽJŤšc>zÓ;­vM§bvKiP~\ĘTAĄ)+Ű?[ďSŻ#ĚÂ>v3lĎşAœĹd˙ž2˘\49ʸi!šÔy ˄¨ŽmÂwţY„- Zy<“ H!Rr;x}ŠŇáÚDşŽÂmpçôĆäÉ1ŸŐŃřc#D5˜ÓypTE…š:*PaƏ*?(Ď“şžˆ#"…mmź(CS/%j*:ĂʧŤcg’ä2F!ĘőGMĄČ¨˛0ö0€!B9œ5¸ţž¤Á••, 1Q†'ši) vŰ~Fk35ńˆŔ—ŻuË\hŤ4ÝÓ[˜#Ŕ>ź řMalÖ ™HY9j fm .ÄÔŰĆÎţjqĘĹ1 uźQůoű›‹¸›} ¨™`ř¤^€s†kp0gFŽŢ}c:l˜Xź°ođ|,;‘ą8ߕ Őlň‚üřŹ€^üŻš3˝< M,ˆx™¸‡ŚHĹÖó”aÚ4 ĚŹWXśŃVÁפ“ýÂ.!"„€df‰Y-żŞđNž3q˙[\WČÖ ”7„ –[SđŃ=zaEfZbŠŸ$#ÜMZ‰WK_9]äÂĎDČ7ŚrÍfmšĹ;ܚÔŐ26YË>cőĂöŇđEE'Ęâ\ît`:ĆE<…]&PŹ$ á‰e1eZÎşMx†f^-”öʐ<ħ(IýüŐ~jň`ŢY,=ň&p,RNSvjZc VčŮłFK°ĺ(ņŢ=O°[ü”‹{:au˛Ű˘aC<( :)[nvý,ž°‰Ë,‰Ü,=cŸS0şt=ćHəőű38.5 ňŐZjČÚá&lÇ¤ˆüјQ)ú ĚÁ,:GŃôhŇô°$L‚[8/ŘÁ“”p,HĽáŻBS”Ĺ`-ňâ|iŮb3ń#VŘJç3ĄMŘ ńĂuzlżŤPĚ"FpqF ‡űŽžË ‚ŇŒ@řĽáŞŔ/Ą™ľŕLJŸ e駢>” hĺÖśk~2‰MLí9`ŕS2R‚Š/rĹąq?Çcu›Í<`Îś |{?ŇzIŇś^mo,ŚFśÇ ?ŐHĐ໇<Ʉž˜š0ů}˜qš8ż;šPé\ ˘ôFšćŒ™őSIš: e0„ ľhq$šÎ^AÙ=LlđÓQ S-hGŕV8ŃÓVü—㐐$I ŮĘ_‹$@痜טmĄ‡Ů=ĹÂ}!{°Q[Ÿ<È=[ŕ“ŔíîĄOgbĸú(ž‡ !ŒÚy– /Ÿ$A˝Ę\\D“›čDUż!úГAX˙yÍ.yăh’ ŻaCý‚ÖĽG_~˘8*~řLuę<ć{€ždú=%ŒŘzlĄ€ŒôgQ?Â+ßá>?ňÓýśVźşŁŞ:ź”KŔŮ‰ƒŚĆĄ›^MN@Œ .†Đó9–H•Ď…˘'˝âPxÚýFUŽÝŹZAqş6Ř I?] ÚlTěŔ‘wPŘHZźmRʀqcČWjgTáF}ńť1Ő?Š(L]ĐgAňďů†‰řR’ńs3dĄč_GAń !ţ4tr.Tyźab;=ßr‡lsá9älńžŻř8ţëŁĐD[Ô 28P™P­{řśš“ó`5k  |}eŐCçT6[e- "ˆƒpę)ü9äÖăŸ*kĽo źŢâMçë_Š-–ăx;&KĆp% R›„˜ üČ Ÿ4pľžféŠ 4ŹÜ=dobŃ P NšÄŻÎxIĽ"-yˇ3M㷞)X›Ö ńăńKP9LJ›j´#[ľ°OwŰoŐîčáú@ţîż™ŽŠÉK§hQäÝlŰCŃJŒ<żç‚`‰jJ:!|ĂŔ᎟ŸÇ÷ĎŰë‚0ŘCmź=l˝íM|ŽÄĽ'š6ź ÍÄ­ƒ“'Go7mG7+%AGŚîŢÎڊÍ÷ľŰŘ]ÚO÷'.ٖ"R…ńëHfŚŕf ^ö?ęęYó^ÔŻc SjT~Ă$HľöL>0ŁĺŒĆö‘1kö÷@˘°6’5wgŃŃŕë˘$}ĆŁ‰Áź÷Aó‹ô}F%1§Óô|*JC`ˇ°˜ł{DŤoQŒç]Óö­cÚŘh-ő1Éśmœ-ă“é/†ăpÎ] W‚›Zhaˇ…h´)ćÍď<„6‹ó­á“‚ž’‰<ůRźUzÖDĆĘ/ˇÖe§đîÖĺž&Ô/hŤňş0ißÍYúnŠ7^Ž"üů—Ž,ď]Q˜•K2ńч]VŻ/UŸéM˛żđľ§zĽĹŠÍ›xWż”V!ćżGŹUˆ´ÜŒ˜ú7).%^ŸČW6v̍G8NoW ˝“ Ą°¸m~ťš6 ż<ۅźĎ‘'ÂĚ+*`ň0Dîât˝ŤťUoŻę5K[uđ`–€KC žŇ }G"˛¤3č°ĘÔ"8ęôdœ5*kZŤź„~#Üjľ ňtťE]ú÷ó ožôÁY8č>›† Qó f€ŤĽ2AÄŮ /ĽŞ€0otŘĹÎř^i¸ˇá‡~˙Ň˝+ű‡ţśA݉ŘŠ`„IŹRćěĽaN煱D)%­ĹZ‰Ń”Rw+çĹÁ•ŠBckŃůQóF¤'?5 ĺËĄSăH“×GĄgîL^×ęoę@JafXYNTʞ–ˇúř]i÷…őóNBtŽéœ"FĄuMx>‡Ÿ9Ęú2+X!~JŔ‡ Ő(Ÿú^[aź‡$đe' ­QyŘ1§—ó]žšË>BLÖëëŒQó´h­{ä#¸sED!ç1ştĄŞŽ¤U›VüŔQ56M˙ˇČŠƒjlŘŤ\ ŰţÇČ߈4D ;5n=°úĚ Rł4*ćÓ&žâĎ.á íĆ"‰°=l WP…P9* €”Îvd Śď ČőĹżĹmlWÜB@•lę^p=!jÍŰŚż <‰/”ŽA.ĐßłĆ__ 3ŃęŢ\zV˝ÔHę´čé’ďá,Ż„;ËŐL_+ĐFtHžŞ*BR/  ŻcđcŤd&-  ş‚ý<^E/jEE&H\žŸżŚ  Ž™„„H~E?Ś ěŹ‹=Ɋ9}[ťx+Ö Ÿ]r>ĹfG ¤Pă´H!\E‘’dźƒsZ0ŕŒ:¤œđĽ<5B(ˇb‘’ż×kZĽ#*ŘuWâŽyNeäcě÷¸O‡/&!c”DΟ§Č긒1 ÓzáP§Ž­lŞuç ëůŢDdQÎŰĎĺľĘFöč7"$ ÷6ţ)üţ˘´Ż¤‘ÓŹ|Ęs&ĆÖ^"5¸—ű•<Ć˙š^ąË˘łUĂöQ,Ö¤Ţ"ŕ›Á;4Pö•cŸĂ pÓˆř›Iô}ž¸ôľöpÖÂ)*UŇ7xĐvUŔ5jzŐíşŔ¸^Š R8`ŽŰlIË׏^ľÁ˘Ęz<ţ<˝ĆFvÁąÓ›˜HgWţő•É–“-#ĺĽydÊΆ/đÁbˆtƒü„kńő5zbĹŃiźłŤ'Łh$Ú Â}vDZU^ zí@&Śí( óú|vM ŔçÃüšiťşá=ŻŰŞĂń18S냾;÷‘>űY™9š/]7!Ć0”sxšřÄ,?˙‘’Q-5Úáď߄•tŽ{†-ś[‰JľŤ8 ­ ްń&u Ö[–Ä–hÎl$[Žžź)ů”Žšľ‘Â!÷šňm$G~][݋]-ožÄH~e"Ds$U \ô@¤›+pFý]ęĺ8Ů_<Q÷xÍUqY‘â4m•iŃ×ŔWž‹6’2Îq­ŰÝ'Âvž ŠőŽŃx” Ť-ϧNŸímęű…]'™Űň˜dXërŔ–žŽő5Č"ńúĘÚ4• Ěś˛iëýVü!OɰUľ˝#şÖäú”NľŻ;¨ćœ3ŕPü§‰4˜j7%u¤Ďń’4RГ`ˤq<_ęKyPďI‡Síż˛ĚNŮrgĖ9Ś8nWü˜eS6n"!â{œůiöÁsM6wŇŚorŒů辁 ŔčŐsŸ()ŠńĚ(EŞ6şÔ“ţ+ŐÚűmʍÖîXphPˆ ˝,ÚŻmAȇejÉ4Ş*ŸÖáh 8€ U‘GŹC墎jÔ(}‚Ő˘nęSˇd¤˘1~ú¸Ĺ’!Ŕ¨ŞđLÁ¤Uľ™´ć!Ŕ‡ÚbŇśI^}8÷äOęÂĄ_đŢä ˝,ÂWoÉB‡†Q1ĹA˝lšşĽžŰ9nP j„:]Ŕo´Úë’lł9mÜg]…ŻÇś¨Â5U‡wEIŰçĐLú÷ůĐJ€áĽ‘RËJĄB˘%ú“LԂ\Q@=ošhbŚłœ*4ęg@cţúŠ{Ź,™¤'š. wbrP°%ŇľŔďZŻ4r°ä*ÓżéśPŔbÜrW8‚4nˇbD’ŚW7¤ŐBŐ蠒ľSm”0<ŽşPéűILEî™ýôBźĐ˝/čŃX†-]ʐXD ĚP)jĹSɈPůŻĆBvş’>JČ “*Ń{ŹsVčÓ˘`Ťą‘?y†ˆ$YŽ5MĂdJQT*ë‰\ݚXśŇ¸"řC˛Šrß;E#Ľ°{łVRA×XÝN2Ťw°1`éˆ ľđš<çݗkՍT(œĹ / Ş'Śă%~ô!uŕ‚šĐŇ^łüđÁ•0Ąčú†D ˝ RijŤŁŤ‡çÉśöN˛Ö,ŮeIĺęďĎ}.=ˆw HąţĄ{Ň ’Ţp'oגVĺ‡(Űu2k7ŽîŽîŽşŽŤ\Mč@Ń-록ˇÓăÖĂĚüyĂ '&,<捯D\ÚĐ^ö‘žmmƒAUKËśQIu/_ŻkmXÚGhOőA~÷ÁÍĆČËÇź‡ŸáVdhNľA_÷AŘÁĘČý튛”hťŹËjVmUv˘ŔˆT—ńÎĐHVń˘ćŰë՗NýŞoŰîΜÖU°˝Ó(ŁşÁy@]LkßÖĐа0ÄCöœČŁZ^r ëpĹt ě@HXÂcÓ,ÚjŽCs4ŽĂîP§˜ÇUĂßŕŮńüŔ—`c(IFźÔeďfqœźţě¤I5ž9Ş#öœ"_Pqߥœ×]óčâîKYĘońŤ”ĺGcRĽ),žގCŠ_5€EŚČwBŸq“‡űb “ŒŞfbËşyJ¤^R˜ś{úţkd"őĎ#XHƒl“óš(ťůYF.Ţ^Χ3m­ěrqЙ1ČßÚn[_KvÔŠÚkyŇ\ŤqL°)ńđÔ~ŹűĎČhŻ˙Ńńéű=$qt#>"Ěäćß׍ç‹QŠqĂn’“lş1Ă´łJ_eUŐńüé÷÷zĄ§żCq˙úCÖŤëéŮě՘7r˙”ľĆW& 0Őʋ{—'˝ś”Ö…÷&hă„đťBWo íÍ.+ ĎňćŢŐG'Pć#ß˙“9`˙ţ{žsŤek 1ôŤ'ű ˙öú–MŘÉKüzżtń¤e TːS9őÁ˝ŤAYtO÷ęîőa„7xôœŚ ¤ÍkÚÔ y9xˇ÷ňÉób;Ÿá FB†€8Ř]ěŻrqŹĂÔŰ…5Ø怐QWEóqIȒˇvuą™ůŽéhżŇsđľcq3F5ŁRu$%łŞ›Ĺ÷‰ň;iŐşÂك¸ýpůBśËL$ˇ™JěB‘4X#ĺ=ˆŰöÂ=źĆćKeÎ=Wš–ĄŔëŃažĚ$cžzsîA> °‰„žzýŢ NFšŚx~˘[҅=§”ăoJôdÓőŞ[ď /ŚÉ85kŁ™&FáŘÜÁúT­˝RĚ&Śł@ŤMiˇˇ}ž‡î8öŇZ4ţٲ5_ĄF—€8fJ¨w_0˛ŒUń˛ŇcJŁ‡ŕ˘Šisó‚N4>Ú/ňĂ?‡B ˛vHňžY!ިľÖWť†äl5hP!/&W#ý˝kđTl°üdűył\š‡ŮŻ™ž_OžÜŹÂáHń[ Z†OR*ĚřôNT_ťlUIüČçóńp ˛Ž)ŠsEŤN~˝3ÖFf' ż‹ÝťË§řŇçĆÂ~=tťĺVćőEöUÇ -ZżZ……HÇtöOYń:1Ś[­ÖţŘ瞘č.Š ÷ŢâCœmŇç Ă-AÜ}LL0ŸĆ'Â`4śfŰAs¨źœV9żţX°"ú:§ŠÍKžŚÚJ‹Ľĺ 0Vá¸`*(Fž’K'v{żŔJ^^jĘÔđ ´d8IšH;ۂHžˌ-ˆĄ˜’†`깎¸q@-֐w!ľîşp­\ΕďçŚw5séabŹČ‡ďٜ¸@žŹWŞ}&Çf\[؂z[6ű{Kk–ŔbňJ;ƒoýuďN]>–*˝ťa:¨ ž;’‚hśŕšQ,†B/ą>,včg‡"›O[ĎÎĂŽě•fÄx8.)ĄÍ˸ösr¨ƒî3ÉŞs6$ŕđÜQG€"ü{^̸ß1ĹŰzWĄ”ÖŚéYýyˇ)ݡ¤ĽŕôŹfůgŔś˛ÎŽVî!&ŽLŻÓ#FËAşĆPża1ŸýíŔÉ´4ŸĚ{ŔlU’$WC‰Ü€ÉMMé„ÎK€ă5ƒÚR3Ž_ŚÂť2Ł(ýŒÔÉ3ó8š ŻWŒ 9"mOîĎx2”ëÚ|Ś|Ďöé|§sű8Íß öÇvʸăţP˝ěźÚß?úĘ`ŔyPŘ#•6•ÇnP—‚őQ=VáÔŞ ”ČéžĐü9ń3ŢŢňxUěŽ/ˇ›c›´!zđ0g WÄ;T!ŒfËŢěŰ!nXŰk§i5œ+Ę~ƒĂ˘Áun3Š>ÚjŰDĂŘĄ[ž„N°żŢnoXš˝(EÎ?•šíŮîťRšłI"˛šşĺőöŢŞ­)ZÔąćBűÂg•îŁbÎlą9kB4™YĽdĹZdóÖ%ݲĆţ\éĚźt­ ŠaFj-D¸IÜŁ§‰ĘÚĄŽ ŔQ“ëöbyݓ!Ž´/ž´—$=Ü4ůĄî2ÖÉßż¨áFX_‰#<ĘŮXŁY۝Ă:to:ŕ̢č“&Ţ3P>:X‘‹ţC"~ }¨ţĺS$Í`)˙çöŚ"uÎĚ5 .ĄqF”¤s+ş㒕”Žƒ§ďv:TčŢŃ6čĹĚ .G Đ~Ąb#•Éü4ăĄ˙Ă5íeöhĆř“QđœEŞź!Çm’DQ#›żQ,nCvVˆ|#iź_F€~ h‚š2Î |’Ť28Ű-ő#'œ}’~Ţlašč™vdú~÷>jşi–KŚżś‚-‡NÓĂžˇ+Î4!`FŹďĺ Ď˝ ‚vÂZ@v‚Ą Ą[ĆNXnużfŞűfœÎ‚~2ľyäČÎŞƒÉLŹr[5ź*­aCPlMQK){Věm)™÷*CüJ_gŢ/†<‰jܤpS“´k”ZË&<[†B †žżWôxŒ€ŠˇŐKm?KŘňž•Ľâi9d9Š8ąÓ,׻ԏęďLkĽOŐmÝńŠ­Ďœ[ۨ™ŘúZ'YŰÚŽĎrˇ€Âđۜ iź,ʨ':ĘhxvßqdÓĂž#ő†qL”[mۋíŕŽ™Çhţ’)”č‰gedúMšę¤ëŒŠrű“a$Š&"‚h”ă“Ot‚áş‹ FŹ€rJY‹˝˛Œ}jŠ ]e Úk¤}BVÔę%†Ü”Œčy{žZŒJŠ…ëĹ{+jN™W,Ţn ŠnčîŽg÷ ĽŐŢl z<ŹřępœB™ƒŚüńÄK&ĺn0ŸkKwš„ů|â ŚŹüëJbŮ˙–í°|ĂąGUýőşŕ+_.7\CŃR.W<"QuyýYąľˆ‘Ţ~ŒZ‰v)Ąq…:PLZ,N{KaCŘ1×ƸРp[ޤŮĚçÎi2KŸÝŹgLÔ i¸‘špi[>ć™ë—ÝŐ VˇáSŮĽ˘çąő¨5O°TˆN™ $'–ë\ %Tˆĺx]$Łý\ľt¤I4ˆçx,ÚĚôdś˘śZČ%čízvH cRXf.Ü[ÂŢmŒČž8yF  qíx?ŻMF㯝IQÂźšIФu•XFZ…ý;ťL€9™ňŔ;E-=D"ě{o„DŠnĄH¤-ĎXŐćŞ7;'č‡ÖTJŠtlľ¨ě"Űi¨9š żbޞÁé%Dźl7W0ŒŹú2i=×Xâ+×ő=ŁŁ#Q?¸DžżJęöű'Ďâ1q›”VbŔ>v΂ŠÖ?ž÷N/_%ĎÁĽ§á ć˟&Žv{łEśe‘4(WœT:_÷Š„.źŻa9Ţr“0›Đ¨K-޸¸+8ZmIíEÇö ârßÍ~L’Ź+Z}p‹%xnĺń´DęŢ6Žžfé nt?vłvŒrîŮĽ`˙Ä_ ÔVňîŠ8÷8K9ř< rušU˛.-^,Š•ńŠ}$ÇWOúÄ?řľÝŕť&őçĆćŒáÔŔül-JőÉ}nöëN…î)Ă čŒá]Ń&씞˛°LFŸ[ˆ*äŞgYťÚ€ [Z”Á°Y`ůgO_˘Ë ¸˝2kNKp?˜úč˝Sí9aôv‹21ďˇ?Ĺ|ĺm{Z5MÓrşÄ}łDyĄ˙GĽHŸÁ“>Ľw RÔ Ÿsg˘ËŃҎŸĂŰu…D/eĂw,ašÎ”ŃٝÂY§œĎĽą+}/­6ćNNě/ĐgĆ &÷Ś5@nĎĚLl °^°qŤ“ĺd)5֚SŹéůĐúaÂu1éÁŻů+ƒŐUŽ$J´ 'ń*Š5Ň"9]6âcÁůfÜâQWQv™yU–RCzŹ|Š16*/ČĐ˝—uœűvúUdÎ袋2˝ňqW:żq3ł;ĽŠ2œJď­\]ĽÖ¸ąáXb¤ßvA6}Uy–źĄ¤7fťˆNc˝Siü}ŻqąÚWAtʁâéńÍ7pÝ˛'Ă˝Ń@)THŽ<ŞäÄL•IO™÷-KŰĄv#/˛{ëĘ~ĽNn=úśDâŜ%FłˇĆqŁĂ;™/˘H‰›<&P~ľ‰+˜ŹŻ–ŞkÉÝžakö=kŘWę†=˜l˙Xľ_ę56 ´Áş÷LĘÝx:NU"ăJť&…NÍzF}°Ú} ČčFţáBŞŃ[¨Ş¨4Á¨nOĎź:đĎ0[›}ž2…ĺż´e‘djFŸĂřVŕéA‹¤eđ7p‚eămł„Ç•óoYoŁO9¨k9l?ă§aÁd80TWśw¸š;Ě ˇÝ\꧛ҟSĚîO;šąçĹj,˘yšCjĂÓwŮeYę]€°`˜qŐŤ] ž!ă1eęă+̇žźcP:ĂZ^á´e+މÓr˙dá–Ę`Ąń ˛=”ĆXăV$Ru‰‡Mšš;ąŽ‰]Ě<¤žJ™9 ł1Đ”<ăŰVNg"âu#‡ÜäŢ ěÎ ý䢞vĎ_"Á˙dÖJ_ŕ q݊D՘Ö[†>âRłŁR´Žď/9DY,l߂˝çÇ@âłWţ2âCňK…X‹ăgí¤1ŽLjeŃËĆă—ƒ2ň_zfťˇdmԔvCš)7͎¨0h’Ük‰Ž+mńRR†ĺŸĐ˜,ŖPZ@ľĐi%ěj_žŠŞViˇýf”MßۜA4âîŸR'äXC9vÍe1ŔÇŢíRX§_ôgÎĐ –tS´B*LS0ďkŮ´/ľq™ŁŒH…bćuUókM"]ÄŽfGł^ôžŽ+?Ą čđˆYüđÉjŃfœ­CĽeb;ĐřUůr?.ąrßÎ˙‰¤S߆íZĽšqĺœĚœĄ×ňw˜˘D’ [<¨Ť*҂gœĚZ™~Ą–?]'`‘^“Ó´ýÄŚ‘ţ0>ČÖpu1eŤeijk÷§ă͢QIÝjč!•ĎmäđžrĎľÇAZă§@iĐH—ţcŢWUŹý𲽝śđáe“ŁÜšŐ‰Č\MËł°Đ'É&ľˇ˘ÍVRyq…v ĺđzŻN §Ţ<3žşk‡űĚať Qr•7m:ŃLiœ8ÜY~ąvšDϖ?ą(KTđMÄ$&Ś—¨lţv€Ł`:˙d,źňˇŸ˜eĚ^,“¨$Œ‡Úďąő TşôcĐ@ą÷ü†Ţ=ÄKÎp 1uçĆ6_őhcd)a;s…Ł´\:Ώ3;OɂŇ5Š‘ńšŹ“}eŢžpˇŻLă|WDABíŞÁC3ßrÎO‹ÖqK”ĺPÇżéˆ#yBř`çťÚRYOĽG-°;ŁFęŠÓ rpK2ՒňČó×íHĽ ݒý$tj&öˆ–LZ(ö) qćţĚ4a=™Âş`%ŮŕŸ‚Wť9@[†8 ^íűý‡ Ň4…ţ߉áŮęV/KgŠž2@döWkěŻ!Ć­@ÚË_ôȸ/w#­^cX÷ľ62˙łŻĂ%…Ęś lOhc'˛s\Ä{Ť ™/9ÄTčS?űVs@űsˇ'(-^V ůëŸ3l Öś0!܆Ř˜ž|ŰC=Ůĺj˙QGě˚ˆ>CŠŁ<Ë_­žÇŐ.őü~rČó ˙Jç3kÄ){ĺž'ô=ň×Â=báí7˙jŚ´L@Rë„IřôMR\UjŘ@°]jâÇ,]!)ŁmŔ5źąä>,ˇűűUu"aWŽ3zśěÇ ×šrô2؂?Wişäo>ŠFŸ)şQu2w;‚ű;}Ţ%]÷ś^q%QrŘfÄ_´Śm7‡Ÿ2S\_ˇl´îˇ(Œ…˘¸ĐěˆDf{čtŠFAy_—y;ýP˙°óI૯ľ?Ű wH šŇ%7$hślp¤cňÇŻJč0Č7Zk‚9Ž]q^UŕÇőł4MÁŠOĘnŮW´¸mN>ń1-ŕÍqϧGĄä]ƒ•:AĚLf˘k=űœíźH[H ČK}>š˛UťďŮws‡~Źe{źœźżOď[°#˛„œó§”>źĹ8y?L鞭­äjĺrHţš¸ž€I~$!ăG“Ÿý0˙ěęÄ֐cˆ^UŚKÄź„Ńp!H€Ŕîš&Đo;]ěËď3ź×ćRâ@`ŞŁZ͸­vN>)ŮăěˆPƒ@wĚcžL‹ňŹ=cF_ČÓf…†îSţă°lş™†‘-­čŮ4?­×uůÂ÷ڧÁ]šˆY.]CEŁ‹“’,†äđŢ"šČô s]jˇ€g˜†ń­íđCŔ’­}Śn0EľÓy˜çv >ĆűAVěÜí‘ÖNDJĐŮipĽdâ÷ǎֺҜÁËĹJ`čslăK?WšĹnđ/ÜçAOWčLƒěÜ(¨đŽ–Kb`şžQůꌧť ™ĐÇǂ)†)ƒI6í\C6vű‡ŢЧ™ŢB•'uŚ2f~]ć‡%ÝŹ­N›a˘Ô2UŠí1NÁCŤ }Ś>”ťbŃ]ZÍOwĎ|XäŽ öDż=ő=6ßÜÜA×´Ácę2ÔĐa”ąĐÄëä3ĆUI$(K“…VA4ŠĐb‹ĚAg‚AšOr6| çůIÎŐ%bkÁ˝*ĆŹhńđó‹ÂŤ0}ŹÜڇŃ{ żSÚ:J 'K%(–nkúnKƂ 'Gć›cúčž˝5ŚÓ,öĹĚ靕 ĺJl +§+ ,JFĘć ăßh€† '‘r€LŰç„kËB˘“žÔz`ŃüÝ.qǰ؋[5([#}ąKä ć0ŐCŠ(ƒń6`GeôĐÖúÝł˛eŻÖÂFŸ]ŽéPHýĄ•˛o7˘ÖĘĆżLCŃ4ĆÚc<€óĎBĹóVĽh– |ą}•— ,óŸ2ľ&sFľž^ŢžéůŠrůffźű飆Lä˛|´œJÎ@ąŻcĐźI˛N'Męë~ěc‹ŃŃw< CGˇƒB†_ĄÔjEžúśt aŕÁ$Ěś`ÔĚײ…ó§ĽK}˛Ň…#+IžéČDßtšńĂĽEݸe%:łĄrřAˆ{1D˛ł‡NŇÚ&Rœx’0šüŽí{JËy§ąŁÓŐľ.4g§ĘŔĚMgĹ¤h*LŽ'´Ńc œ¨—¸ńq6ŽÖťJ€Ć„9ž×ű0˝aŮřňéśž,é Ü륅˰ _Ěě9‡˛*€rÖ'ŮŕŰ{–tŔ"ł§č¤†ąyZŤj˙yŇNÓӞ×Z LĘńŔz™żŒ\ŸąH7ŁÍąÁUĹkE]˜(‰"Ć´}xTý3\čĄCO ţŁĆ‘˝œžé‰ú4°ŻşŒ‰äMŽ;•LëŽĐ}0Q$¸y<Â\ŢT˝|m˜ť„úÁ—Κž]D)<‡?D,Ö+šHŰđ†Îń”Ué<˛˘6lÚg˙ĂöŽ+­ěUM3˜|1)h(WËţřź) îVNŻkž}]şž`ÝóšŻÜ|l)0QS‰AĺˆŚĂľŚŠ/xeqĄżŹ—+8?Ňҙ}ži ËÓ}G|CžŞ›čÜĚ9نe#ę˝=ůň‹äśBffĽY•ĺÚU×}Çi;ŔU˙ÍIíôc˙Ótđ E|÷DšÉĚý‘מd]âŐqŃöŒƒ”"T j`nv0ÖFóqžw XŻŞ*ŇałŽ#ˇ8ăyÇó€­âŚTh|2ÖŰmőëľËěc_0Ă?͂IŒCwČIČ80ńĎKąm-/ĹŇ ,ř÷=ŔĂšöĽ˛IL0qÜ# X×zĂVeŐA’B¨aD…?v;ëA }pHŕöWŻßü)Ŕ|ČMJó˜ĘŢčAfzˇŞcV*îjŇor1ŃtZSHŽŮŕĘdş<×⡰JKĂž•›č 0Ż!Ÿô‰Ž*Ă}ƒ" Z’˝ˆUHchpŇŰŘŘbé÷CN—Ě {Ĺš|Ӈ LYö_Ćý ,98|Hzr ŻqóÂßĂB%ĺ–zp$ öäN#čNę2hą‚úĆŹuj÷1Důj 7Z1“}WŁú|ŔI Ű >fÁÚá<ĆAx“ĎxńZ˘š púł(öČ ŠăEÉ]‡Ćd\9PhŁĐäwr-2—$ždÔÓJČÁśE<'Óá3;fť}AŻÔ98 kʌ;d7ľŕ°7’?ÂĚăEá}‰őhbĺÜöW´Ö–ůÁ%ĺÁe8–ÉÖqóŕîd›+>t$jB‚lfpRÁIÍm V-aš˜§ĺq]Şšf‡1¸]ȂˇqQg fF˙ _p.0Š"ƒYZ‚ĂHqç°QílŒearŕ†ŠĘĚÜpš °8Ç(ƒ@§Œë…×Ô÷ Ÿ\ ‘duń+f ˘KÍŇU?ÇĎYƒe”ZŚYţŒł#çó¸mőŽčÔNŮ/ŕŚ͌F ç˛ÓŰăón.ŁÂ¸ź€3Ż{.ĎŃü:źëÓxşâO–´`a1pˆ%v7B4˛<، mxa`P łĘ4˘9ńŤ>6Ň.Ă/Šň¨Ř˘ăŽ˙PÜT„V’S8ń[]śbPƒńĐ)ŰĹ)ŘŚ…%@QzLI –Ö˛ۛ<'”t%ʳɌěú§˝tŻĐ[:ƒŐ[IżrhBź(‚O‡QĆ~Ŕ=ČžCääÇ=’=€d’Ć,čK TŠžĹć“ ”-„ŤcŃV—r78HüôÓ÷ęŻÇ> ‘/śˆAůSL] ÝÁ?G•ăXUI Žk‡ ŁŇźĹ˘ž­Ëň'T%hN@ S¨Űi­ [[ĹÖÄ[˜K(•Šĺű–˜ÂŢĚöů¨Ţţ_Ţ(bČÇŽ”Ń“÷•Ś}Őb°MÓ°+ÚP Śş édšzďٙzŕĎÖJßBVŻL*źb™žSäZŽě=ꃋü-ʖωáăɧěçh"üyň Áó^âš=fíĺÁÎgwÄ­70jzCĹaH¤ÄFn)eŞ.5ţ´Ö ä0—-Źü:í‘ăp+´ŃÖ~ÜĺSg ¸žń‰ŔŒč`Ű5GČE˘˝\Řýh8‚:bmźç‹Üb*Bł¨nöŚRaC‘žÉɑ]đeĚƱϔŒąODđçőcg˝ěţ9m+҅LUŚŹŐćƒcÄö€ä4q pťÝŰ*3MÂŽsŸƒY­óۃíaŠ1?ߗß{ýť™MÝNc曵üxUÄ´°ŠĚ3NĹvOgż÷üƒýĽŰƒfďů[O…a ís7M î—ä6c˝łzZöďlýC)´'ó^ĹŤ—pÄ4%Đ}ŽăZŔۏg;š ęL0+î÷’-ąVúĺ>¨Ę“>ŐE†ěUŞČąâ ń}4ĺO_ż26Łn‹€w3Ť+ô™ܸÉd"ńÄô˄üŤy˝-ľŮZŒ^u5aˆđáßĐ>żZYög,†ŕƒ7óˇ†Qćš rV}Ys¨˝žbJżgJYٚcŁZđT7Ú2ľŚţÜ ˙Y3őĽŞłçŇkĎĽ÷C'7‘Áś'čIW^ń˛ő4¨Ň(Ó§˝j̖ё;Œčˇžtöůžkś$ąŻ(1ŹLň}Ę!:qœ?œS=·Ÿ1ůÁó7ü …;ŕBÂyär•:´ŚP÷cö Ú*™’7–2š?ŇFĆ!ö+*Ť?WëżUŰ$1‰j˛e7ö›ůŸóĄbBJssÚF(冂DN÷}ěÚ°zvüźDrăěä7 …œK#|Uq‰€ô9Ó´Íý ťĆFw‰ĄÜGŮĄĹ\<RŸĐ-ĎT)VdĂşĽ›¸‰‰9¸+˛0ŘbůaśěčČ$×Ä;;ŇÂÂJŽ ž íwÓň°žĂTG8Ď!+éeŠ€ <7Ë8ŽxYŔâ%nKeچ ¸çDLűß/}t;OG°ŘóWĄRdÜĘ%h”ŕŠcčŮ\ŕw[Q‚yOŹÝ×ç`•DĺˇKŒ8IpĄÇKľâĄ ž™ÔžkĂD „¨Î$Ňô[€gňä¸#$>Lm™xĹy dyIm#řN!rňHECó\˝Ń˘…7lHŘ[ÎrŤo­m‹!5‰Ę직.2˙ .˜óĐŃGŔŽ›şŰ §”™n8Ď¸RńˇžÚYM‘ ďxhŕ$s T<Ą”™‡Řĺ.˝% 7teփ.€‰+jy–ěž›ÝĐę`Ľ2œŕgYóΌůRş˙ń*+;TľŽ]Ö NĂIՉčĆź‰+n &՜——Ńě ńîô‘@=˝Ŕ#I3ôł{HžĂç şĺ{í"¤th€[ü€ĺŘj† %.ވ•ÔććÝ\çT/|ÄŤŢá‚úAŁúMh ;ľK„Áů—čIŁŁ77‹ýŚ-ĽďŽzŽßcN"/ŔĽ—#/ŕ8WŠ—}u9š.¸?Ď>ž$Çż¨)ŽZReFÓŰ!ŒoEş3ňşUa8žœÜ|;î9(Ńď<ď۝˜ŕË4\óřŰýsgk'mŒăJ豙nśžŕłęjÖ *ÉĆÇ`8Q—gÝćĂ]Ďszv†ůIöżô–¤q}ÜŤD|Ÿ (!bëaNŞHŒĄ×žčľt˘ŒŃœLěĽ0,óź1-rmşŚ‹Â“[˝šn çIÇń6¨Ľúu™i[dsʲ's›#b§óШ›Ú!ńyçéِ˙:üƒô2Qe쀆*hœů™3WąşśVˆJž]ňč4řqÁéů÷pąëSSăćş|4őÁk˙îšŘţĹŰăۍLn$†X™ĎK†g(ańŘŰömń˘–řĂ2/>g܆´mĽ%ÓiÍtw=ŠĂ5Ö3›ʔpóZĐĹ82V"ŇébôŒfŒ(nÁčˇű?ł!ĎNŚíυś ť…Î?İuźßˆÔ,Mř%ŽŤvpg$´ˇó%Ďu¨ěŤx™röÍRŤ–׉qA‹ä˝˘Ó fbşCirytBu†Sď~ä ƒ…íQł˘VDl1î2`Fî[ˉî+_8ęž/^˙Ůř´bî(čĂ>KTnʆ$ˇóZ[‹žŔŒ™×‰”žĎԏm†°ÓůÉ–šž ˘-—ÓŃąŠťtAZTDŕź.H•x°r—i…ŢqŰÇń†Ďĺľă'Bš0#ý Çá[ý›<Ô7ü-Çź†g¤LEŽĽŠ.Ńu8gňňÝŠĺy< X:HŒZ,€ńŸ‰jřâÔaŒ0´`Ą_ížÚxÄrĹŠőoŕr˜™vhwKŻ!ĆŻŘ{ŕżLmýć8Ů${'‰D6äęüÖaي%nœԀA‹bíě×5^š1Ľ–ĆSÖ{Ę:@>•œŔĘč?ƒ„"]˘Ú H…_EuľŇ.Ű8}Í1BĹ"P?óDb÷(Ú!ËŔ#ÓdˆŢŸ9`Jă+4Śńs7{–CÔmÇŽöáíрO ÇŰŇązí‚^3 ť<>°1HŁĺ>cî‹;ź§Aü%K˝š]„"Jž:Ž”fÜ~‡X}I#ˇ=)Ń}ź…aZ>ň냭$9%‘‡=%S?ů$ĂׅĂĽ“d7_ä ç1Źť˛üđĄĎ­ÚőăÚWV’@hÍ×X6^ɇM6™{$ŔnżMş‹ŰçLRh\dĘUĄóÜѸq_ÉǐĄœWO0_…Ĺœ˘ %ä˘-G=žĄA‘ˇľ]ędŽÄŘ,‰Ćс‰:O§m¸çŞŇĎ˙ůĄ$lá4rŔ™_L˜ÂŔP‘&\cJWÉHˇŕúËź$bD<ňß!ˇ!ݖލ—‰Ö4$Ä8ĘóŹÚ$lÁ˛zŢ,Ý~˝ L8gÄ/żę#ĐÄżö3q=ä&}JŮ˘OŽé8ş9¸ŠZŕďŠ?%ɢڝ›NjًoăqŐž‹Ęd\cRspҜÍfD™5v9•Vőűg…$­ÄB§â†[ľçWi¸ƒ„8™L8Ľí|5vĂ•Ž—q‡ř¤mpd*ôĺ°ŢL~eV#ł™Ö匚֞řČs­v›ŤÚŮs}!]̉؆^W s8ÔŢń „ ^#Ăž€DydŚ#ÁO.CiąŃŠ­ôUoƒeďę…îKGÄJQ4Š:;…›‹ĚĎo˜ŹŢ\ż .§[ fŻČ$ Üź­ŰĘ÷ľF‹?RŹk[ög_űoŘIQ]ásښaĄŤGD´gŒ'| ĂűĆf㝎•Ÿ5vAÉú\IÍ´ĎĂ 8gŔTîšđgĆ|ep“ęĽőJŤň­ťÂO™’´ZŕŽó<Ď#ýĹ}źÂĄ"űâöşyRîŇ –˘HÇŻ7Gź;}š ę7RŹbľôpŮÂ*D˝UcńEIúYVś‚˙{ óďŽđpťDxÜÁc'7÷ŕbu˛Ő‡h­ŕ~$éăŤ;×.K{˙XÍ=7.3ÔéB"gŒ)jwďcŰ6”)œĽ`ëöçL‚Plľ5+&<ţWZfSHQ;0˘N¨Wx7‹QxďđƒÓ#c@“u¸yʌMŮsół§gé—Ÿfhԇ3?1xúĐmÚ.;ŮLQó/‚w˙K5ĘݕN?‘hmIą~Ń>ÎŞD÷°´qhuĘßj{Ň mÝé€OôhŮxëBśÇC4třkž˙Wt€8ó&H5ƒŢśŤëOdě ÍWFPoƒ4Č>ú'd,7ˇćGÔ@\*C`Š!—r Ÿ}¨nń:ÇqÍ‹ţl şŔ=x9ŠZĚU_›ëŢ-Ą˙Ěá``öĺXhO0K –€ÚĚ?y^ÎԟżÄ)öŘĺ;Łxď4sCófżŘÎ|p{‹–ŰéVö[˜QfŚzˇ0yśř-Hƒ¤Ia‘Lw^ME9Kc[kÑc–€‹Ë>=ć ířÚŘ qäځUQ*É 'ôq-ę÷tĹ Œ •{ۚ'čÎÎĂ­÷–RR?b ,'ŞÂŢ´Œ‘ßA)ÁłVĺ5nYłéVËIˇĎבQHˇŠžÄ]ŻwÄ.ËćXŐ÷0ŻĘˆÜŤvJ†-Š´ĎázLu'Üééƒs{žy횒ýą€.@š{Y'ŘŹ R‘đ™‡/Z? űZQDl 1=ău{öéÖş6VFÓđoW˝x™Ř*ě ‡ÓsßT÷QĄĘ^rt–wËűüü@˜ěëŔIGx´bŽœhŔË0žÓ{ŠlŹ+|Ü^ ĹţţŃU#`ĄtK’U|äC<7˙§§Ă+}ĚLńţťCv|ƒÓo؎šßćżjmOI ‡ŢăhM€Č1˘÷yę2Ĺ^ś˛ˇĐŐBc”wÓĹQŸ“NleďŔŽÁsĘť(…ƒFž~4¤‘NFv`ĹY­'zE‹eöqS—Ş#^oű&Ľ~\ď(ľ÷ŇČćZ6üŢöÍđ›\ÖľqMć?¸ŢÔP˜ĆKpú+›%žü`ÎÇLE™nŒŽˇUĆ+FăAçǞ\qÓZULöë qƜť~k>rÉ8Zäđą7‰C^ąä&™óYEcťœâ˙úÉC^‰”ŻOb•ŰŤ$ĺŒ%˛ Ѓ nďôítËxÁ řśÉňä(Łľ?Ç*XŚćEeŮţëQćÉgfö,šě™bZ//St¨üL rڌ˝V…E‰Uœą/€ cŔLˆřb€éj3@LB"‡gôLgüń~gÍA-#ađŃś‰¨:t5,ł(i›¤=ý~RÄmĄ•/\.šľe+C$Ä2 đ)ŽZsöłŘ+GەţŰÉ­Ş“LđëůwX ÷)–źBwᨏ,Ϩ‡Lŕ/jŢî‘á•ę*•[^A^eĆŽŁSîÝŮzUyz˙Ž\řĎŹźtrŮSʏiZíw~U„í=S6Ž.<4Ţ%P†2‰şRń.ÚÝÇšďck뎹6 ľ\e'=W QĹc}ßMPKeš˛R}›!âs‘!ľôňj”bpH‹RˇržŃ†źRłńşâý…›ş9ČM¤=ó”§zŒ)5Őgé}|×%ž||ŽëÚĐ9ëĐĹźţ4Ů]ʆyŒfů¤ĂśâüírŮuG4şÍŚúë^ƒę†Ńj—Üę‘+tőÉđ•zŠ1Ž€J݋hžhˆÜ@ h@:1ÄhÖrV'îâ-#" `ŘÁ3ňҤWD Üúź&žŞ^>‚ŹDFółauˆýjlX~úHpöHÖśđe;[LQç ؜ŕÂϞ—K܅śjčtÚ3ě)^ĉŠÉĐĆ'@˝˘ŘíoŠŠŠO•/ÄOś•áHńˇ§Ě}ĄĐ‚ Ć{JBKIyŔ3A¤óóÁźu°:$XÍ43iÝ3ćtZ90x+Jr ‰$qĄ#4*đŠ–Ĺö5ŕR,MíŇĆ7{qđ#ŤĚÚ@˙*'4~FÖVĎqŃŞŢÔö§šz.%Y)ôsăŮ^댉uË –Ýqł€`¤šČˆ0Ířą*4מřą0ćď—Aůłţ–ŘŐźĄœ÷Ÿę ÜDƪ߉ë…ŹK5–[D>Ä3Íą†sHĚ}.-ľí9ůFä 9â7ϟů6•§*Ŕ8ӗšéşŇýN΢ú'Ůt‚]î;y¸c$Ś Ôá /~{y^ý‹‚ô:w˛;O1˛źŤéƒI?łôsá¸Íô‰ Őá ”\fÍ ľĆ‘áśę<5ÝŹزłďN Á­4c݅.L^ĽĚŕ.?˘9zbqză™÷.ĺęĘđř{:łA3™gţŽŤłu~ůOŒ?—l:iˆ¨W•ĆeUŞ/ć!ers(b—˝Y‹ä(%´sćň”Šëp­EŮqE?x57Šövk˝arśQx˙zŹEŠFÎHR ýŇľUTÁą¨$\@%âaˆ{ĽT3@9wŞ^™•ő™qá|/rwOşóJ÷ÜBočâŢĐv¤Zo̞÷q?­ş.é˘âˆE4äÖNęgţąxł›ŤÖéő(˝:7Űr˙ŠźíŐÝŔĂliÚ0ű{'Ýžě[ĄmžŔřÔ=ĐksˆŠĚ7i%CmGŽTę˛ö25za‘¤K‹šß÷JÜŁűŠÎĐĚńƒé/űQÚöxÁóśSL‡Ę.ş ‰—CC”G™Ż>ą<ş%hDšÜŽxŃÎtŠ?ä*ÝŃŞvE5ß6×sÇÍŇPşÉCQ:@śąŻ–€őakťÓ[Ż*âĺ**m!)žyyŽŞÓq:АĐA~)nš˛ś]U<ůZ6&úĽé9VyÇzp>nZѧÔ*ˇć;䞃íö‚{ÂGt÷ş†ĄŠi%ľ­Ô-ŸíĹ2 - Ölܢ!€Ç×ԝ\N ÓśžŤŠ˛N]6Ěç ăRôŕ/˛tňˆć,Ď;›ˆýaWHŮŰ^ užöâtĄe‘ĂÂK@°wźnnĆĎx5 e&ĺK›JĨ]éČŐöl”Ęż,ƒžIÖˇŢE6H’şôƒ!÷ř$K…vVŚvN&„ÉLiŽ‚/úĂ?żĐŽbď/&RFK`>-pÓ¤u,;‰Űékć iŽ÷Ö@Ţ3”`şJ€Ž$—Pk jä4'4¨šĽű^ĹŁ6='V<$<ÓÄ`ů€1ŒŢŠČ99xޔbňWţ§–ëU„ęQąôCú•Ct›Ľ–]Â5ňӂ )†7e‚ŤŠKţ•;/†ĄáĂôG0şdfÉK˝ŚTĽş÷ĹLlÔr}oöN>Ű/ă\•yBƒí _§2Ă1ކh4Hą_ŽëÁBĐř!ž3@ɚŐý´óľ$ĄÚuŔfFŮ ŒĘö‘ϟȌÂU˜ÓÚÁEöĂąeiQĎ+Ůĺč°ŕpghwĐ}­Œű4–j˘Jz$ĽjĘÖ{źfr1TÜ ŸLŘtőH^(טđ~ŸRűa}đňh3<^‹ĐéN[#eÉĎëƒ@}y“ŃýUɈz ~˙QZ-ú ŮWÖŢąžťn›7ă_ş’DŹąŚň›:ZzÔĆŐą€^ ebËŽ]‰vÁżWÄ[ďM顔QíÍ Ĺ€\BjOĎŕZjŠeŽľĹÖӧŐłŘfؕ`çSĽmŠŹ…Ş2ţ#ĘŤ§ůUć0uĄ1dĄ@ÂImé'7ąv€’)v4eÜú—_ş'(÷„Ű1ż7¸WbłWS7aź\2šb– le3çVöA‡ď,Ž ~€bšaą° Č>9ŒU”ŐŃـ.oi;—×ö••íBŠ\œtűŞó5[Áj˜Ä‚]ý s˜j(řěĽ“ÓJŽÓ=HŔŚůň%sÔÉ0w u4^/Â:ˆ`!˛áwk'‰Ío÷LŸ?’÷~kÎN÷ošc€$řçůÁýÓáÓńí(Ţĺ˙˝œ†>ń1ÔʕÝÁĂMŸ}ćĂJŠC‚ďŢĹ<ŕüşąFó4ˆ€éÄ5 ó€Ń{ iYĽ ;Ćý3:ggéÉŕćYžbëá’ń˜ÂňěYąţ-¨ÍkQ…ţŐąj]˝ˇű!Žrx˙)mhí\Ćj Ý›ŻűËżě3ZœśŇ*ů¨`Œœœůüĺ{ŽP­ŞTŐZř[ÒdŠ%yŃô1aćÖëX†iĺÂŽAß,ץĹiťĚ÷*M Ôƚ1Vú+|8.“,)ĘőÂŞň4jÚݔFę‡e DšB,Q[{VáQ‚ŤŻĚĘnčíM‘Œ÷OAë…Eaü„D*#‡!tc"Á˛čn,ˆ˘ăşŠóúŕťš˘ VäęŤ~˙čŘ“]ÁőŇ?_ľś‰¸—[‡ŘyŰÁŠôŽŘ'łÓĹÉűőś,Ę(Ő]˛Á/ŠŤŽOż‡_ž€žIku‡&B,eÔhĎ^´ ĄYú†¸"™łRШşĘă>ş˜ 9ąv­ťľřWü[]s \7–Hx7ŕX~âß ˛ĚL ŢvŮš“÷8c ă"krĆ@oý ˝uÜ_tb3ąź€+Ţ*‰ĚşÔĄˆż{P%Ü.ţ݊ăcč鞛~î˙ŻüŮÎýóTóÄüĂř"ĽŐVgpm-1.20.4/patches/done/applied/gpm_unsigned_patch.gz010060000017500001750000000007360760216311400214140ustar00niconico00‹Áţ<gpm_unsigned_patchURď‹Ó@ýžĹ?\[ŻÉľ"BŰ öTÎűĐóđ‘°Ýl›ľÉN؝Xâ˙ÝI,aavßź7ófŘ{gŚ$f[š6bĺ‰Óşe~٘ŘEśuL ›áˆíBeҒj›6á[şM÷M=%óŤä*Á¤ľ361‹ůlţ|ŁŢůýÎ;vşr?4;ňŘŞ3T7l+‹†œgŔ]cUŚ2|(]„:č.Áşâ’Ú}‰;ä/OGËŃí˝-ŇÖ˙˝@‹xtlJ[$I˘ÔŁ":DTî`ář"bknăé!Ds“ŕŇŐ@;ˇ}H™RmÄ[L€›–[†ÚJšU‘¤ZďÉbہƒ•yNľÎBč¨ţůó†šCĎsŒ‘󝚆˘c+KëĆ`Âlţ# x|ővý>ߏ?_*ˇCG-žČꪜ°XUŽv“2ˤ‘Ľš‘˝26šŤ›8Ý6uţćťdŇgí%ÎFz{˜šőXýTŔ  –q-ę^{ ŒeO€iś•ŸA>â×5F}ňËłŻ™xc‚ۇM~“|ŔÓsjő_ęőťO÷KŐ“Nmđ}XŞßJŠFˇ•RéŠRŽgpm-1.20.4/patches/done/applied/repeater-patch.gz010060000017500001750000000011630760216311400204550ustar00niconico00‹Kx<repeater-patch­SKsÚ0žűW|GŔlIJĘĽÓS'3mfzčЌ°× ‰_#Éšöżw%SJú¸E[Ň÷Xiw†!*™Q”E’[Üw„OÔ"!šžOoć“i'žďű'"Üř›˜öÄŐ aO‚+řö—&X­<ČÚ@‘(ŰF–aüZyąđŕaMÄačůĎ,çĄČtŞîçv8n- oÝwţ'řĆZYP^č.Çź'.<˙‡=ޫ֓ťĂçěî1g˜°'EsRiŘj<ɜ\eŠŽÎlŚô‚ď-Ľü&솭|) ŠČyÝ3ˇĎCŸv [}ÝURś*]ÍžiM96GCÚőö4I :š ’‰kî‹R||¨t6xßV×#‹Q_‚"zxćŕĐr[łiś ›Ž(H}™­6ŻŽ|‡€{Í˝ đÍĄËnť•zE‘­=ož4ńz9pţáíŚ3†ďŒŻˆńőßů;Kîŕĺ‹9Il˜0]ü†§ĂŅďdÍ œi18!‰EÎŔ8.ě?őŘiח°ŻäßáŽ˙ 7ľŚá™v.}‰ŘxŢš}ąWŇРȃžĚý áÔ Đgpm-1.20.4/patches/done/applied/repeater-patch.mail.gz010060000017500001750000000050420760216311400213760ustar00niconico00‹Kx<repeater-patch.mail­XksŰ6ýüŠťů)–h’zËMj7Ž[ĎĆOěîc2Ů DBÖ$Ą%@Ëjw˙űž J˛,Űm:SfÉpçžű€ĎJ“S›Žç]ŠĹ Ăq4G]ŠĂ0Ÿ”ŤĘ˘})Ý|LßÍy[Śš.Ž3m 2]TwvoĹŠĘô­*UÚž6c*tbŽm27Îá}eSÎ *QؓŽŠńŸ\ęŒ:qż“.n͍Ji˛˘J§6(îŐĆŔŠŁqŽťj‡xv„LŮň޸)̲ ĆOď?|¤EbWÖŠÜŠjR#ŽÁpt†AÜé6ąŠ´°Áža´ÔnNWחߨyc~wö­ď í{´–ň'{źkö“jÂoiWÉHva’›mŹ¨Ńƒh0˘ {;°ěšń˜üE™Id67ÖŃç(!ţE_šâîo˝ÄŽŠžk֊߳fńžžŒÂ“( ăá]WŞőКÎ8 :F!5Ţ˝żşnîA Ę?TśouŽË`Q+˝!F}ŽŁ8uƒ(ŃđŰ­&=˝ëô˘Q˙‡Žx15ĽĎ›ýŒyƝÁ#wmÝ¨Ż‘ęœž ăł^'~Zt§?†ĐßAjWţ>NÉ<ĎlšJľ4… ž|ű9p]Oą^ÝÓŚď!7ˆâhŸuĎÂävO>ƒ[§7ĂÍ[żĐy†Ź‡y{”ƸăçV˝#ń0č†Á°ˇväi†Aoë}ˇŚĂËŸnî˘~÷Qâˇ\‹L‰nůÖe×ޟî3âËŋ[-ÉŞ"őE¤NO—ęÂsĺť<ęeżüS"‹{ňŻ'ďžó˙-5NŐD˂ŽXL'ˆ9…ٍY;ń؇§]ˆ.8ƒAc’EZŞĺłč7Nü:]Öë Źtjü{*ēdžŞ&˙V‰Ó'Hřüă"˙BĽZ(éŘ’I˘2qĄŹ•3Ő>?EŻcÉá(îEƒ¨×ë'QĆĎ%.€OűĚd™YV‹m>=D‘›"݊Dٍ‚N4ŠÝNwœÄń çčH˛A]‹Wžš^č\ľ˙ŚJŤM1Ś(Ĺ;S8U¸öőjwœşs‡‹Lęâ씥UîMeŰŇ&ZoˇžjT/Ť—Ą "%~śŞlŸĚ°<Ś‹ĘšĂ(č eľ8/ڟÔ"[yGžÝŇŁšhe5х>ž•﯌  S´čB–ZuĚ|ŘCww‡—Č܁ť]Ué‘{rĚďËҔvƒîÓ{ţŃţAŠâz wc°łÎĄĘeq(X=QNöÄe‰ÔJ9@Č­*ťpś}ŽLűQŞ”]V%PTp¨˛`aŞnUf9ô)ěĎEĐf~ŃY&ŰWNş q†Qôču<Śpý`íçóÓˆ3`ęöâ¸Ű xRęśZ,”żÎdLh䐥O>$´, 2HźĽżĎ iK3Ł‹9C¨Ĺ¤Ý÷BœśCOJnŽh"łŒăçćŘ ŽÓD%žÓ9ɜ2™ƒIĺčüUNf:ՉƁ9Ś"ĚL( Ö i!]2‡T€Ô" ĺî•Ĺž\ąv[Mrt…ĺnŔD?É[R ň?Şd‹­Á50 qť)˘MH˛IŚ ňFŘŃâýŽeň!Öe˝SuŢCÜ´*ÎK˛T$-&,áOűş~Ă_íŕř”Ň;_'Rô1ĂGXnáĽAŻ3‰É(Á -ŞŽ źMř^eŽÍPe)NpšŃËÍ­ňœičZˆ\,2H/š˛ě÷!¨u°RédS,窠•ŠüI˘d+:DőŠ´ŔąâTۤ˛Ěîmô–Ň7qŚ&e%ËĄ~ƒAÉÜېHëĹÂcl- ń đm!ě7„Ź0A x‚%/۟ĚÄÉM$ęhÎMő wŘ|Sd+ą Dną­ň\Â˙ɢŇ*—¸ČÇ(WĐqZ(łČęaU8lPÎśź –efYj|˙—&Sb.Üč>ž*s˛Ći˜Ěń)L5›űS¸ť'@ؘa#ËÄ4Kd}Ůⅺ;‚ĐUąÖŰńžL ,Zť—úv|ř´z;7KKť*QKŕ‰ÍĚď[rÂÚJYČ|˙Ç ‘ęŠď)nKDä …)ŃŮîWEQĺPşď)}ä-‹›^÷Ëöş ž¤)ĚŽ “#˛;šœ&œłdnSÁ”zŚ TÉô8},źC(—xĂěĂ!=+UÂëQeÍwĎíZ8ˆď \S*Af˘œ˛ožJţ0çĆËv pŃΰ~‹ÂlíKjČIfážZ¤žjî„6底Teéłd7€Ě]ą4U–ÖôeTk)6™5ˆ,×ď8Œ¸M%gô­Ě°‰)¸ëŠ€ś¸Ĺ|u4ĺl`E+6`‰‚ $÷*ĐV9ŠŘíuZcŠ)_CŔąÚ°.g{)áӕáTMUön3“Ëľu óşČ§f­pâŤnŚščň6ďŽÝF˜˝|YĚԆMţö)v+^j™’ë’ô Ş2ăŃHˆKŽű$g(ŕČ!îژGA#3Aď\Âř3ĽxDUŢ* 0Ź•ąľn•mĚ:N™žńťn†?Všvo*jĽd*Žäşn1v+b/˝G;g›źll8gžźrŔŔw0žú~„.U-jţĄ¨ŹĄ%§ŚďűűŠůšű˘žŽéĘńN!ő8+DťÝĆu(QApĘđ@[ł=eťĂq'Ź˙úrpp°ŢHţyź1Ž7S;;­>đGŃńą€!ľ?HÁť7í¨ľůe…_Ž :|ýćOz^ŠƒĂ×$č5f‹Ý„n1üœĐ9łˆ+7çÇMč7ť­†ŽűtŤĹË4S\g¸o-5cžCĘqˇBÔś6řŘł4đmŤD"BĺlMţM˝đĺnˇ];:œ…ƒâŔ:˙šőŮóŐň˙ž.éüSéú‹ÄĺüŕWÇSú?ĽŐßůńč-o˘ďý˙ăýĹďX/ęsťĎ¸Ţx$ţÇćýŠń;ł7-ňmhé;îÓş´ŽËœšEľń‘ŮNRGđw ™é_ę:€ČgžFyYőPÄ8ŹK¨Ž â}wŞ ČĹÉúză”őÜîƝVŇAˇ3lEOîP|úŠÔlŕN÷őý-'ŕk^SuŚiSĐŻPŽJ>+ ”/HČb{_ŽWž;Ló+ŸĎQ‚ŤŮLŰy{ź\Ÿ żźixůíˇ¨Ž‹ňż(ź Mú/>‡Ą ży@‘őVӎ{}žŔv›G;r;_p‚śŰ¨MőJÄ+ۅøyÄbxťŠŹç%q–<­nőœş. moˇí¨‹ް>ąĽ/nÚŠĆ4mŐť[=^âë{7Sţ“''ߙÄ7ľšs‹ńááršÜž;ĚëťŰ!oŐĹÔđˆ,Ä˙"vAĆgpm-1.20.4/patches/done/applied/shlib-patch.gz010060000017500001750000000016120760216311400177460ustar00niconico00‹›=Ý<shlib-patchĽU˙Ú6˙˙o*ęAƒMČ}i›ŠíqĽTt‡ŕŚi2Žޙ8Šw´Ýţö=’Ű8V­[„Űďűű|ňx'ľ6-Bŕf)!6x¸SÉRž‹%Źř­´ Ő|‘Ž˜5˜K™äšŒ@%ŁŃ|­ty&%áĽ9_ß+­xśEŁ-4"eů\Kšr›Ë,u.mނ•Ü4×ľ•čKY°KžÉˆldf•IŔÄEĚ Cg `¤%G]žŚzË0křŔ…’żB)Ż< ĆćăVÜŞÜHąL”ŕ~HTá8ß:Çýˆ'öś#Ły€G<úżĎe°{$]qĽCě ČL7˛Klq–jŒŘÁ­Üß ŽkKiĺ‚Śŗ̌v‰uł Š8şNŇLŠ5ą‘¸Oä:x0cEČś0IŹëL2„éAúˇ{lý˛e-đý€â/8…Îyx„Á)óË<ˇĎóţ)ÂŢţŒú§řĄž=śďvžZĎÁ+V<ʁÁÍĎłÉO“ŮŐđ-…L@Ę@ý“Ę?ÎÄffˇv&uü;ź‚-’ôéӝüžţ‰ 'O3ł˜-„p ÷Nă[G%ŹŮ5zňn8xóŞ"6ŤóššĹk­wˆ Hm%q)~5&6ířI9é,˘ăČ(ýpŽť¨đyž˝<ŠĎEÇáSŹxœÜŒ#ě+ľžÔjŸĄŢ˜\őšp2=9ąíiŁţlڜ23mü᯸oO;Ě.ÚLƒöŠÁwhÔťőăfťŢ=q€?ž•Ž‘oĹ5Źaęĺüáh0_÷›Đ-@čŻRŮß /* struct sockaddr_un */ #include /* VT_GETSTATE */ +#include /* for serial console check */ #include /* KDGETMODE */ #include /* winsize */ @@ -142,10 +143,25 @@ static inline int open_console(const int mode) { int fd; - - if ((fd=open(consolename, mode)) < 0) - oops(consolename); - return fd; + struct stat sb; + int maj, twelve=12; + struct serial_struct si; + + fd = open(consolename, mode); + if (fd != -1) { + fstat(fd, &sb); + maj = major(sb.st_rdev); + if (maj != 4 && (maj < 136 || maj > 143)) { + if (ioctl (fd, TIOCLINUX, &twelve) < 0) { + if (ioctl (fd, TIOCGSERIAL, &si) >= 0) { + if (si.line > 0) + oops("we seem to be on a serial console"); + } + } + } + return fd; + } else + oops(consolename); } /*-------------------------------------------------------------------*/ gpm-1.20.4/patches/done/need_update/gpm-1.19.3-serialconsole.patch.gz010060000017500001750000000011020760216311400236510ustar00niconico00‹Kx<gpm-1.19.3-serialconsole.patchĽSŰrÚ0}Žżb›Î06žaLhB€!ÓĐ mÚĚ4´Ó7ĆŘrŁb$ƒĄ—đď]I†Ú>U˛´{Ξ˝ČžďĂ×Őҏ‚č"ˆC<i HI“"ĺLđ‚œź))źMŔD^ÔęuşĐnľ"ËuÝ?¸Gčř˘×>7čŃüřÜ낋ű+,xIYZTžř!ŠC¨WŘ!Ë*• xşH˛ŹœU šĄĎieŐ÷p-÷D¤}žÎnĆÓűéŐtŹđî1Ú§ˆÎy Ću˝>tĄĽó[d‡ů˝ťF÷w×ă#Ź$ĺ’rńFě†2AS€ęDÔi{Q ܨ{í3Ý !IS  ó$ř‘ŔW„Íę´lő•Úźäq,řealuĎłKˡ|źä`Űy6P<ťćądI@ęFÎv7Š>ĺÍ3Ŕ?r2Q1o˝`_ŹË5}˕2:mwľî‡“Ű)Ůůţ2k$â6ý˙_ř¤::çáEgpm-1.20.4/patches/done/need_update/gpm-diff-first010060000017500001750000001103070760216311400206100ustar00niconico00diff -u -w ../../gpm-1.19.6/src/debuglog.c ./debuglog.c --- ../../gpm-1.19.6/src/debuglog.c Sun Dec 30 00:56:34 2001 +++ ./debuglog.c Sat Dec 29 15:13:48 2001 @@ -37,6 +37,7 @@ # endif #endif +#include /* exit */ #include #include #include @@ -74,13 +75,14 @@ gpm_oops(char *f, int n, char *s, ...) { if (LOG_ERR <= gpm_debug_level) { - int pri; va_list ap; #if(defined(HAVE_VSYSLOG) && defined(HAVE_SYSLOG)) + int pri; static char fmt[] = ": %m"; char* buf = alloca(strlen(s)+sizeof(fmt)); - strcpy(buf, s); strcat(buf, fmt); + strcpy(buf, s); + strcat(buf, fmt); #endif va_start(ap, s); diff -u -w ../../gpm-1.19.6/src/gpm-root.y ./gpm-root.y --- ../../gpm-1.19.6/src/gpm-root.y Sun Dec 30 00:56:34 2001 +++ ./gpm-root.y Sat Dec 29 15:17:40 2001 @@ -1196,7 +1196,7 @@ Draw *draw=NULL; DrawItem *item; char s[80]; - int posty, postx, postX; + int posty=0, postx, postX; struct sigaction childaction; int evflag; int recursenow=0; /* not on first iteration */ diff -u -w ../../gpm-1.19.6/src/gpm.c ./gpm.c --- ../../gpm-1.19.6/src/gpm.c Sun Dec 30 00:56:34 2001 +++ ./gpm.c Sat Dec 29 21:53:12 2001 @@ -27,6 +27,7 @@ #include #include /* select(); */ #include /* SIGPIPE */ +#include /* time */ #include #include /* O_RDONLY */ #include /* wait() */ @@ -235,6 +251,7 @@ } fd=open_console(O_WRONLY); + gpm_debug_log(LOG_DEBUG,"Paste %i",c); if (ioctl(fd, TIOCLINUX, &c) < 0) oops("ioctl(TIOCLINUX)"); close(fd); @@ -386,8 +407,25 @@ { gpm_debug_log(LOG_NOTICE,"Skipping a data packet (?)"); return NULL; } + + /* Better debug output + 29/12/2001 02:12. pebl*/ + switch (protocol->packetlength) + { + case 4: + gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x %02x",data[0],data[1],data[2],data[3]); + break; + case 5: + gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x %02x %02x",data[0],data[1],data[2],data[3],data[4]); + break; + case 6: + gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x %02x %02x %02x",data[0],data[1],data[2],data[3],data[4],data[5]); + break; + default: gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x (%02x)",data[0],data[1],data[2],data[3]); + } + return data; } @@ -532,7 +586,10 @@ * Return information also if never happens, but enough time has elapsed. * Note: return 1 will segfault due to missing event->vc */ - if (time(NULL)<=awaketime) return 0; + if (time(NULL)<=awaketime){ + gpm_debug_log(LOG_DEBUG,"No dy, dx or buttons"); + return 0; + } awaketime=time(NULL)+1; break; } @@ -1104,7 +1169,7 @@ continue; } - gpm_debug_log(LOG_DEBUG,"selected %i times",pending); + gpm_debug_log(LOG_DEBUG,"select returned %i fd",pending); /*....................................... manage graphic mode */ diff -u -w ../../gpm-1.19.6/src/gpn.c ./gpn.c --- ../../gpm-1.19.6/src/gpn.c Sun Dec 30 00:56:34 2001 +++ ./gpn.c Sat Dec 29 14:27:12 2001 @@ -460,7 +463,7 @@ check_uniqueness(); gpm_debug_log(LOG_INFO,"Signed"); - } /*if*/ + } /*if(gpm_log_daemon)*/ /* * well, I used to create a symlink in the /tmp dir to be compliant with old diff -u -w ../../gpm-1.19.6/src/libcurses.c ./libcurses.c --- ../../gpm-1.19.6/src/libcurses.c Sun Dec 30 00:56:34 2001 +++ ./libcurses.c Fri Dec 21 16:13:05 2001 @@ -93,7 +93,7 @@ /* JD patch 11/08/1998 */ #define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; - extern gpm_convert_event(char *data, Gpm_Event *event); + extern int gpm_convert_event(char *data, Gpm_Event *event); int c; unsigned char mdata[4]; /* JD patch 11/08/1998 */ diff -u -w ../../gpm-1.19.6/src/liblow.c ./liblow.c --- ../../gpm-1.19.6/src/liblow.c Sun Dec 30 00:56:34 2001 +++ ./liblow.c Fri Dec 21 16:13:11 2001 @@ -529,7 +529,7 @@ #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; - extern gpm_convert_event(unsigned char *data, Gpm_Event *event); + extern int gpm_convert_event(unsigned char *data, Gpm_Event *event); int c; unsigned char mdata[4]; if (nbprevchar) /* if there are some consumed char ... */ diff -u -w ../../gpm-1.19.6/src/mice.c ./mice.c --- ../../gpm-1.19.6/src/mice.c Sun Dec 30 00:56:34 2001 +++ ./mice.c Sat Dec 29 21:35:11 2001 @@ -93,7 +93,7 @@ static int parse_argv(argv_helper *info, int argc, char **argv) { - int i, j, errors = 0; + int i, j=0, errors = 0; long l; argv_helper *p; char *s, *t; @@ -595,8 +605,8 @@ * and then switch to 4-byte mode. */ static unsigned char prev=0; static Gpm_Type *mytype=mice; /* it is the first */ - unsigned char b; + unsigned char b = 0; if (data[1]==GPM_EXTRA_MAGIC_1 && data[2]==GPM_EXTRA_MAGIC_2) { @@ -665,10 +675,10 @@ int treshold; } wcmodell[] = { /* ModellName Magic MaxX MaxY Border Tresh */ - "UltraPad" , "UD", 0, 0, 250, 20, - /* "Intuos" , "GD", 0, 0, 0, 20, not yet supported */ - "PenPartner", "CT", 0, 0, 0, 20, - "Graphire" , "ET", 5103, 3711, 0, 20 + {"UltraPad" , "UD", 0, 0, 250, 20}, + /* {"Intuos" , "GD", 0, 0, 0, 20}, not yet supported */ + {"PenPartner", "CT", 0, 0, 0, 20}, + {"Graphire" , "ET", 5103, 3711, 0, 20} }; #define IsA(m) ((WacomModell==(-1))? 0:!strcmp(#m,wcmodell[WacomModell].name)) @@ -2045,6 +2107,7 @@ * The first three strings are the name, an help line, a long name (if any) * Then come the functions: the decoder and the initializazion function * (called I_* and M_*) + * Flags: * Follows an array of four bytes: it is the protocol-identification, based * on the first two bytes of a packet: if * "((byte0 & proto[0]) == proto[1]) && ((byte1 & proto[2]) == proto[3])" diff -u -w ../../gpm-1.19.6/src/mouse-test.c ./mouse-test.c --- ../../gpm-1.19.6/src/mouse-test.c Sun Dec 30 00:56:34 2001 +++ ./mouse-test.c Sat Dec 29 21:55:30 2001 @@ -335,7 +371,7 @@ devcount); printf("Please move the mouse. Press any key when done\r\n" " (You can specify your device name on cmdline, in order to\r\n" - " avoid this step\r\n. Different baud rates are tried at " + " avoid this step.)\r\n Different baud rates are tried at " "different times\r\n"); timeout.tv_sec=10; /* max test time */ @@ -375,7 +436,7 @@ } } - } /* devcount>1 */ + } /* while(devcount>1) */ mousefd=devlist->fd; mousename=devlist->name; diff -u -w ../../gpm-1.19.6/src/synaptics.c ./synaptics.c --- ../../gpm-1.19.6/src/synaptics.c Sun Dec 30 00:56:34 2001 +++ ./synaptics.c Sat Dec 29 21:20:17 2001 @@ -212,48 +238,49 @@ static param_data_type param_data [] = { /* enabling configuration parameters */ - { "edge_motion_enabled", Flag_Param, &edge_motion_enabled }, - { "edge_motion_speed_enabled", Flag_Param, &edge_motion_speed_enabled }, - { "corner_taps_enabled", Flag_Param, &corner_taps_enabled }, - { "taps_enabled", Flag_Param, &taps_enabled }, - { "pressure_speed_enabled", Flag_Param, &pressure_speed_enabled }, - { "tossing_enabled", Flag_Param, &tossing_enabled }, - { "does_toss_use_static_speed", Flag_Param, &does_toss_use_static_speed }, + { "edge_motion_enabled", Flag_Param, {&edge_motion_enabled }}, + { "edge_motion_speed_enabled", Flag_Param, {&edge_motion_speed_enabled }}, + { "corner_taps_enabled", Flag_Param, {&corner_taps_enabled }}, + { "taps_enabled", Flag_Param, {&taps_enabled }}, + { "pressure_speed_enabled", Flag_Param, {&pressure_speed_enabled }}, + { "tossing_enabled", Flag_Param, {&tossing_enabled }}, + { "does_toss_use_static_speed", Flag_Param, {&does_toss_use_static_speed }}, /* pressure induced speed related configuration parameters */ - { "low_pressure", Integer_Param, &low_pressure }, - { "speed_up_pressure", Integer_Param, &speed_up_pressure }, - { "pressure_factor", Float_Param, &pressure_factor }, - { "standard_speed_factor", Float_Param, &standard_speed_factor }, + { "low_pressure", Integer_Param, {&low_pressure }}, + { "speed_up_pressure", Integer_Param, {&speed_up_pressure }}, + { "pressure_factor", Float_Param, {&pressure_factor }}, + { "standard_speed_factor", Float_Param, {&standard_speed_factor }}, /* toss/catch related parameters */ - { "min_toss_time", Integer_Param, &min_toss_time }, - { "max_toss_time", Integer_Param, &max_toss_time }, - { "toss_cleanup_time", Integer_Param, &toss_cleanup_time }, - { "min_toss_dist", Integer_Param, &min_toss_dist }, - { "static_toss_speed", Integer_Param, &static_toss_speed }, - { "toss_speed_factor", Float_Param, &toss_speed_factor }, + { "min_toss_time", Integer_Param, {&min_toss_time }}, + { "max_toss_time", Integer_Param, {&max_toss_time }}, + { "toss_cleanup_time", Integer_Param, {&toss_cleanup_time }}, + { "min_toss_dist", Integer_Param, {&min_toss_dist }}, + { "static_toss_speed", Integer_Param, {&static_toss_speed }}, + { "toss_speed_factor", Float_Param, {&toss_speed_factor }}, /* edge motion related configuration parameters */ - { "edge_speed", Integer_Param, &edge_speed }, + { "edge_speed", Integer_Param, {&edge_speed }}, /* corner tap actions */ - { "upper_left_action", Corner_Param, &corner_actions [0] }, - { "lower_left_action", Corner_Param, &corner_actions [1] }, - { "upper_right_action", Corner_Param, &corner_actions [2] }, - { "lower_right_action", Corner_Param, &corner_actions [3] }, + { "upper_left_action", Corner_Param, {&corner_actions [0] }}, + { "lower_left_action", Corner_Param, {&corner_actions [1] }}, + { "upper_right_action", Corner_Param, {&corner_actions [2] }}, + { "lower_right_action", Corner_Param, {&corner_actions [3] }}, /* use wmode */ - { "use_wmode", Flag_Param, &use_wmode }, - { "finger_threshold", Integer_Param, &finger_threshold }, - { "tap_lower_limit", Integer_Param, &tap_lower_limit }, - { "tap_upper_limit", Integer_Param, &tap_upper_limit }, - { "tap_range", Integer_Param, &tap_range }, - { "tap_interval", Integer_Param, &tap_interval }, - { "drag_lock", Flag_Param, &drag_lock }, - { "multiple_click_delay", Integer_Param, &multiple_click_delay }, + { "use_wmode", Flag_Param, {&use_wmode }}, + { "finger_threshold", Integer_Param, {&finger_threshold }}, + { "tap_lower_limit", Integer_Param, {&tap_lower_limit }}, + { "tap_upper_limit", Integer_Param, {&tap_upper_limit }}, + { "tap_range", Integer_Param, {&tap_range }}, + { "tap_interval", Integer_Param, {&tap_interval }}, + { "drag_lock", Flag_Param, {&drag_lock }}, + { "multiple_click_delay", Integer_Param, {&multiple_click_delay }}, /* end of list */ - { NULL, Flag_Param, NULL } + { NULL, Flag_Param, {NULL }} }; /* ** The information returned in the identification packet. +** STIG page 10 */ typedef struct { int info_model_code; @@ -264,7 +291,19 @@ /* ** The information returned in the model ID packet. +** STIG page 11 */ + +#define INFO_ROT180_BITS 0x800000 /* bit 23 */ +#define INFO_PORTRAIT_BITS 0x400000 /* bit 22 */ +#define INFO_SENSOR_BITS 0x3F0000 /* bit 16-21 */ +#define INFO_HARDWARE_BITS 0x00FE00 /* bit 9-15 */ +#define INFO_NEW_ABS_BITS 0x000080 /* bit 7 */ +#define INFO_CAP_PEN_BITS 0x000040 /* bit 6 */ +#define INFO_SIMPLE_CMD_BITS 0x000020 /* bit 5 */ +#define INFO_GEOMETRY_BITS 0x00000F /* bit 0-3 */ + + typedef struct { int info_rot180; int info_portrait; @@ -276,83 +315,37 @@ int info_geometry; } model_id_type; -/* -** The information returned in the extended capibility packet. -*/ - -typedef struct { - int cap_ext; - int cap_sleep; - int cap_four_button; - int cap_multi_finger; - int cap_palm_detect; -} ext_cap_type; - -/* -** The format of the reported absolute data. -*/ -typedef struct { - int gesture; - int finger; - int left; - int middle; - int down; - int right; - int x; - int y; - int pressure; -} report_type; - - -/* -** A location record. -*/ -typedef struct { - int x; - int y; -} location_type; - /* -** The information in the mode byte. +** The sensor types as of STIG 2.5 +** Page 11 */ -#define RELATIVE_MODE 0x00 -#define ABSOLUTE_MODE 0x80 -#define LOW_REPORT_RATE 0x00 -#define HIGH_REPORT_RATE 0x40 -#define USE_1200_BAUD 0x00 -#define USE_9600_BAUD 0x08 -#define PS2_NO_SLEEP 0x00 -#define PS2_SLEEP 0x08 -#define NORMAL_REPORT 0x00 -#define EXTENDED_REPORT 0x02 -#define REPORT_W_OFF 0x00 -#define REPORT_W_ON 0x01 - - static char *model_names [] = { "Unknown", - "Standard TouchPad", - "Mini Module", - "Super Module", + "Standard TouchPad (TM41xx134)", + "Mini Module (TM41xx156)", + "Super Module (TM41xx180)", "", "", "", - "Flexible pad", - "Ultra-thin Module", - "Wide pad Module", + "Flexible pad (discontinued)", + "Ultra-thin Module (TM41xx220)", + "Wide pad Module (TW41xx230)", "", - "Stamp pad Module", - "Sub-mini Module", - "TBD", + "Stamp pad Module (TM41xx240)", + "Sub-mini Module (TM41xx140)", + "MultiSwitch module (TBD)", "", - "Advanced Technology pad", + "Advanced Technology pad (TM41xx221)", "Ultra-thin Module, connector reversed" }; /* ** Define the information known about a sensor. +** STIG page 14. +** Resolution only apply for absolute mode. +** For older models the default resulotion is 85x94. */ typedef struct { char *model; @@ -381,6 +374,76 @@ /* +** The information returned in the extended capability packet. +** STIG page 15 +*/ + +#define EXT_CAP_EXTENDED 0x8000 /* Bit 15 */ +#define EXT_CAP_SLEEP 0x0010 /* Bit 4 */ +#define EXT_CAP_FOUR_BUTTON 0x0008 /* Bit 3 */ +#define EXT_CAP_MULTI_FINGER 0X0002 /* Bit 1 */ +#define EXT_CAP_PALM_DETECT 0X0001 /* Bit 0 */ + +typedef struct { + int cap_ext; + int cap_sleep; + int cap_four_button; + int cap_multi_finger; + int cap_palm_detect; +} ext_cap_type; + + + +/* +** The information in the mode byte. +** STIG Page 17 +*/ +#define ABSOLUTE_MODE 0x80 /* Bit 7 set */ +#define RELATIVE_MODE 0x00 /* Bit */ +#define HIGH_REPORT_RATE 0x40 /* Bit 6 set 0 = 80 packages per second */ +#define LOW_REPORT_RATE 0x00 /* Bit 40 packages per second */ +#define USE_9600_BAUD 0x08 /* Bit 3 for serial protocol */ +#define USE_1200_BAUD 0x00 /* Bit */ +#define PS2_SLEEP 0x08 /* Bit 3 for ps2 protocol */ +#define PS2_NO_SLEEP 0x00 /* Bit */ +#define NO_TAPDRAG_GESTURE 0x04 /* Bit 2 for model version >= 4 */ +#define TAPDRAG_GESTURE 0x00 /* Bit */ +#define EXTENDED_REPORT 0x02 /* Bit 1 for serial absolute mode only */ +#define NORMAL_REPORT 0x00 /* Bit */ +#define REPORT_W_ON 0x01 /* Bit 0 set */ +#define REPORT_W_OFF 0x00 /* Bit */ + + + +/* +** The format of the reported absolute data. +*/ +typedef struct { + int gesture; + int finger; + int left; + int middle; + int down; + int right; + int x; + int y; + int pressure; +} report_type; + + +/* +** A location record. +** This is needed to make an average over several packages, +** because the reported x,y might not be that accurate. +*/ +typedef struct { + int x; + int y; +} location_type; + + + +/* ** Parameters for controlling the touchpad. */ /* touchpad information */ @@ -417,7 +481,8 @@ ** ****************************************************************************/ +/* Get model name, STIG page 11 */ static char *syn_model_name (int sensor) { if (sensor < 0 || sensor > 16) { return "Reserved"; @@ -427,24 +492,27 @@ } -/* convert the model id from bits to values */ +/* convert the model id from bits to values +* STIG page 11 +*/ void extract_model_id_info (int model_int, model_id_type *model) { - model->info_rot180 = check_bits (model_int, 0x00800000); - model->info_portrait = check_bits (model_int, 0x00400000); - model->info_sensor = (model_int & 0x003f0000) >> 16; - model->info_hardware = (model_int & 0x0000fe00) >> 8; - model->info_new_abs = check_bits (model_int, 0x00000080); - model->info_cap_pen = check_bits (model_int, 0x00000040); - model->info_simple_cmd = check_bits (model_int, 0x00000020); - model->info_geometry = model_int & 0x0000000f; + model->info_rot180 = check_bits (model_int, INFO_ROT180_BITS); + model->info_portrait = check_bits (model_int, INFO_PORTRAIT_BITS); + model->info_sensor = (model_int & INFO_SENSOR_BITS) >> 16; + model->info_hardware = (model_int & INFO_HARDWARE_BITS) >> 8; + model->info_new_abs = check_bits (model_int, INFO_NEW_ABS_BITS); + model->info_cap_pen = check_bits (model_int, INFO_CAP_PEN_BITS); + model->info_simple_cmd = check_bits (model_int, INFO_SIMPLE_CMD_BITS); + model->info_geometry = (model_int & INFO_GEOMETRY_BITS); } -/* Translate the reported data into a record for processing */ +/* Translate the reported data into a record for processing + * STIG page 14*/ static sensor_info_type *syn_get_sensor_info (int sensor_id) { - if (sensor_id < 0 || sensor_id > 12) { + if (sensor_id < 0 || 12 < sensor_id ) { return &sensor_info [0]; } else { return &sensor_info [sensor_id]; @@ -519,14 +589,14 @@ int edges) { gpm_debug_log (LOG_DEBUG, - "\r%c%c%c%c%c %4dx%-4d %3d %c%c%c%c %c%c", + "\rSynps2: %c%c%c%c%c %4dx%-4d %3d %c%c%c%c %c%c", report.gesture ? 'g' : '-', report.finger ? 'f' : '-', report.left ? 'l' : '-', report.middle ? 'm' : '-', - report.right ? 'r' : '-', + report.x, report.y, report.pressure, edges & LEFT_EDGE ? 'l' : '-', edges & RIGHT_EDGE ? 'r' : '-', @@ -637,6 +707,7 @@ last_edges = edges; packet_num++; } else { + /* No finger on the pad */ /* handle the tossing action if enabled */ if (tossing_enabled && !was_tossing && last_finger && @@ -1045,66 +1120,127 @@ /* Adapted from tpconfig.c by C. Scott Ananian */ /*------------------------------------------------------------------------*/ +/* PS2 Synaptics is using LSB, STIG page 29. +** +** After power on or reset: +** 100 samples per second +** Resolution is 4 counts per mm +** Scaling 1:1 +** Stream mode is selected +** Data reporting is disabled +** Absolte mode is disabled +*/ + +/* Normal ps2 commands, Command set is on STIG page 33 */ +#define PS2_RESET 0xFF /* Reset */ +#define PS2_RESEND 0xFE /* Resend command */ +#define PS2_ERROR 0xFC /* Error, after an resend or disconnect*/ +#define PS2_ACK 0xFA /* Command acknowledge */ +#define PS2_SAMPLE_RATE 0xF3 /* Set sample rate to the following byte */ +#define PS2_READ_DEVICE 0xF2 /* Read device type */ +#define PS2_READY 0xAA /* Send after a calibration or ERROR */ +#define PS2_STATUS_REQ 0xE9 /* Send status request */ +#define PS2_RESOLUTION 0xE8 /* Set resolution, to following transmitted byte */ +#define PS2_SCALE_11 0xE6 /* Set scale to 1:1 */ + + +/* Additional commands*/ +#define PS2_SYN_CMD 0xE8 /* Four of these each with an following byte encodes a command*/ +#define PS2_SYN_INERT 0xE6 /* This ps2 command is ignored by synaptics */ +#define PS2_SYN_STATUS_OK 0x47 /* Special synaptics Status report is recognized */ +#define PS2_SYN_IDCODE 0x00 +#define PS2_SYN_SET_MODE 0x14 /* Set the mode instead of sample rate (used after a sample rate cmd) */ + + +/* These are the commands that can be given (encoded) by PS_SYN_CMD */ +#define PS2_SYN_CMD_IDENTIFY 0x00 /* Identify Touchpad */ +#define PS2_SYN_CMD_MODES 0x01 /* Read Touchpad Modes */ +#define PS2_SYN_CMD_CAPABILITIES 0x02 /* Read capabilities */ +#define PS2_SYN_CMD_MODEL_ID 0x03 /* Read model id */ +#define PS2_SYN_CMD_SERIAL_NO_P 0x06 /* Read serial number prefix */ +#define PS2_SYN_CMD_SERIAL_NO_S 0x07 /* Read serial number suffix */ +#define PS2_SYN_CMD_RESOLUTIONS 0x08 /* Read resolutions */ + + + + typedef unsigned char byte; +/* read a byte from the ps/2 port */ +static byte ps2_getbyte(int fd) +{ + byte b; + + read(fd, &b, 1); + return b; +} + + /* write a byte to the ps/2 port, handling ACK */ static void ps2_putbyte(int fd, byte b) { byte ack; + write(fd, &b, 1); read(fd, &ack, 1); - if (ack != 0xFA) + /* Should check for resend code PS2_RESEND also */ + if (ack != PS2_ACK) gpm_debug_log (LOG_ERR,"Invalid ACK in synps2 initialization"); } -/* read a byte from the ps/2 port */ -static byte ps2_getbyte(int fd) -{ - byte b; - read(fd, &b, 1); - return b; -} - -/* use the Synaptics extended ps/2 syntax to write a special command byte */ +/* use the Synaptics extended ps/2 syntax to write a special command byte +* STIG page 36: Send exactly four PS2_SYN_CMD (which is otherwise ignored) +* and after each a byte with the 2 first bits being the command (LSB). End it with +* either PS2_SAMPLE_RATE or PS2_STATUS_REQ. It is hinted to send an inert command +* first so not have five or more PS2_SYN_CMD by coincident. +*/ static void ps2_send_cmd(int fd, byte cmd) { int i; + /* initialize with 'inert' command */ - ps2_putbyte(fd, 0xE6); + ps2_putbyte(fd, PS2_SYN_INERT); for (i=0; i<4; i++) { - ps2_putbyte(fd, 0xE8); + ps2_putbyte(fd, PS2_SYN_CMD); ps2_putbyte(fd, (cmd>>6)&0x3); cmd<<=2; } } -/* write 'cmd' to mode byte 1 */ +/* write 'cmd' to mode byte 1. + * See ps2_send_cmd */ static void ps2_set_mode1(int fd, byte cmd) { ps2_send_cmd(fd, cmd); - ps2_putbyte(fd, 0xF3); + ps2_putbyte(fd, PS2_SAMPLE_RATE); ps2_putbyte(fd, 0x0A); } -/* write 'cmd' to mode byte 2 */ +/* write 'cmd' to mode byte 2 + * See ps2_send_cmd. PS2_SR_SET_MODE stores the touchpad mode encoded in the + * four PS2_SYN_CMD commands + */ static void ps2_set_mode2(int fd, byte cmd) { ps2_send_cmd(fd, cmd); - ps2_putbyte(fd, 0xF3); - ps2_putbyte(fd, 0x14); + ps2_putbyte(fd, PS2_SAMPLE_RATE); + ps2_putbyte(fd, PS2_SYN_SET_MODE); } -/* read three byte status ('a','b','c') corresponding to register 'cmd' */ +/* read three byte status ('a','b','c') corresponding to register 'cmd' +* Special status request for synatips is given after a cmd. +* Byte b is PS2_SYN_STATUS_OK to recognize a synaptics +*/ static void ps2_status_rqst(int fd, byte cmd, byte *bytes) { ps2_send_cmd(fd, cmd); - ps2_putbyte(fd, 0xE9); + ps2_putbyte(fd, PS2_STATUS_REQ); bytes [0]=ps2_getbyte(fd); bytes [1]=ps2_getbyte(fd); bytes [2]=ps2_getbyte(fd); @@ -1117,8 +1253,8 @@ { byte bytes [3]; - ps2_status_rqst (fd, 0x00, bytes); - if (bytes [1] != 0x47) { + ps2_status_rqst (fd, PS2_SYN_CMD_IDENTIFY, bytes); + if (bytes [1] != PS2_SYN_STATUS_OK) { printf ("PS/2 device doesn't appear to be a synaptics touchpad\n"); } else { info->info_minor = bytes [0]; @@ -1128,6 +1264,36 @@ } + + +/* read the extended capibility from the ps2 touchpad, STIG page 15 */ +static void syn_read_ps2_cap (int fd, + ext_cap_type *cap) +{ + unsigned char bytes [3]; + ps2_status_rqst (fd, PS2_SYN_CMD_CAPABILITIES, bytes); + + if (bytes [1] != PS2_SYN_STATUS_OK) { + printf ("PS/2 device doesn't appear to be a synaptics touchpad\n"); + } + + cap->cap_ext = check_bits (bytes[0], EXT_CAP_EXTENDED >> 16); + + /* If the extended bit is not set it should be assumed that neither of the + other capabilites is availible.*/ + if(cap->cap_ext){ + cap->cap_sleep = check_bits (bytes[2], EXT_CAP_SLEEP); + cap->cap_four_button = check_bits (bytes[2], EXT_CAP_FOUR_BUTTON); + cap->cap_multi_finger = check_bits (bytes[2], EXT_CAP_MULTI_FINGER); + cap->cap_palm_detect = check_bits (bytes[2], EXT_CAP_PALM_DETECT); + }else{ + cap->cap_sleep = 0; + cap->cap_four_button = 0; + cap->cap_multi_finger = 0; + cap->cap_palm_detect = 0; + } +} + /* read the model_id from the ps2 touchpad */ static void syn_read_ps2_model_id (int fd, model_id_type *model) @@ -1135,75 +1301,97 @@ unsigned char bytes [3]; int model_int; - ps2_status_rqst (fd, 0x03, bytes); + ps2_status_rqst (fd, PS2_SYN_CMD_MODEL_ID, bytes); model_int = ((bytes [0] << 16) | (bytes [1] << 8) | - bytes [2]); + (bytes [2])); extract_model_id_info (model_int, model); } -/* read the extended capibility from the ps2 touchpad */ -static void syn_read_ps2_cap (int fd, - ext_cap_type *cap) -{ - unsigned char bytes [3]; - ps2_status_rqst (fd, 0x02, bytes); - cap->cap_ext = check_bits (bytes[0], 0x80); - cap->cap_sleep = check_bits (bytes[2], 0x10); - cap->cap_four_button = check_bits (bytes[2], 0x08); - cap->cap_multi_finger = check_bits (bytes[2], 0x02); - cap->cap_palm_detect = check_bits (bytes[2], 0x01); -} /* read the modes from the touchpad (in ps/2 format) */ static void read_ps2_modes (int fd) { unsigned char bytes [3]; - ps2_status_rqst (fd, 0x01, bytes); + ps2_status_rqst (fd, PS2_SYN_CMD_MODES, bytes); #if DEBUG_SENT_DATA gpm_debug_log (LOG_DEBUG,"PS/2 modes: %02X", bytes [2]); #endif } + +/* + * Translate the incomming data to an uniform report + * + */ + +/* STIG page 42 + * wmode = 0, newer version. Gesture, right and left are repeated. + * + * byte 0 | 1 | 0 | Finger | Reserved | 0 | Gesture | Right | Left | + * byte 1 | y-pos 11-8 | x-pos 11-8 | + * byte 2 | z pressure 0-7 | + * byte 3 | 1 | 1 | y-pos 12 | x-pos 12 | 0 | Gesture | Right | Left | + * byte 4 | x - pos 0-7 | + * byte 5 | y - pos 0-7 | + * + * STIG page 43 + * wmode = 0, old version < 3.2. + * Second is a second gesture!? + * + * byte 0 | 1 | 1 | z-pres 6-7 | Second | Gesture | Right | Left | + * byte 1 | finger | 0 | 0 | x-pos 12-8 | + * byte 2 | x-pos 0-7 | + * byte 3 | 1 | 0 | z-pressure 0-5 | + * byte 4 |Reserved | 0 | 0 | y - pos 8-12 | + * byte 5 | y - pos 0-7 | + * + + */ + /* Translate the reported data into a record for processing */ static void syn_translate_ps2_report (unsigned char *data, report_type *report) { int i; - if (((data [0] & 0xc8) == 0x80) && - ((data [3] & 0xc8) == 0xc0) && - ((data [0] & 0x0f) == (data [3] & 0x0f))) { + /* Check that this is indead an absolute 6 byte new version packet*/ + if (((data [0] & 0xc8) == 0x80) && /* Check static in byte 0 */ + ((data [3] & 0xc8) == 0xc0) && /* Check static in byte 3 */ + ((data [0] & 0x0F) == (data [3] & 0x0F))) { /* check repeated date */ report->gesture = check_bits (data [0], 0x04); report->finger = check_bits (data [0], 0x20); report->left = check_bits (data [0], 0x01); report->middle = 0; report->right = check_bits (data [0], 0x02); report->x = (((data [1] & 0x0f) << 8) | ((data [3] & 0x10) << 8) | - data [4]); - report->y = (((data [1] & 0xf0) << 4) | + ((data [4]))); + report->y = (((data [1] & 0xF0) << 4) | ((data [3] & 0x20) << 7) | - data [5]); + ((data [5]))); report->pressure = data [2]; - } else if (((data [0] & 0xc0) == 0xc0) && - ((data [1] & 0x60) == 0x00) && - ((data [3] & 0xc0) == 0x80) && - ((data [4] & 0x60) == 0x00)) { + } /* Old style packet maybe */ + else if (((data [0] & 0xC0) == 0xC0) && /* Static in byte 0*/ + ((data [1] & 0x60) == 0x00) && /* Static in byte 1*/ + ((data [3] & 0xC0) == 0x80) && /* Static in byte 3*/ + ((data [4] & 0x60) == 0x00)) { /* Static in byte 4*/ report->gesture = check_bits (data [0], 0x04); report->finger = check_bits (data [1], 0x80); report->left = check_bits (data [0], 0x01); report->middle = 0; report->right = check_bits (data [0], 0x02); - report->x = (((data [1] & 0x1f) << 8) | - data [2]); + report->x = (((data [1] & 0x1F) << 8) | + ((data [2]))); report->y = (((data [4] & 0x1f) << 8) | - data [5]); + ((data [5]))); report->pressure = (((data [0] & 0x30) << 2 ) | - (data [3] & 0x3f)); - } else { - gpm_debug_log (LOG_NOTICE,"tossing PS/2 data: "); + ((data [3] & 0x3f))); + } else { /* Garbage or not + * The synaptics pad keeps sending data 1 sec after last touch + */ + gpm_debug_log (LOG_NOTICE,"Garbage or tossing PS/2 data: "); for (i = 0; i < 6; i++) gpm_debug_log (LOG_NOTICE,"%02X ", data [i]); report->gesture = 0; @@ -1217,56 +1405,79 @@ } } + +/* STIG page 42 + * wmode = 1, + * + * byte 0 | 1 | 0 | W 2-3 | 0 | W 1 | Right | Left | + * byte 1 | y-pos 11-8 | x-pos 11-8 | + * byte 2 | z pressure 0-7 | + * byte 3 | 1 | 1 | y-pos 12 | x-pos 12 | 0 | W 0 | R/D | L/U | + * byte 4 | x - pos 0-7 | + * byte 5 | y - pos 0-7 | + * + */ + static void syn_translate_ps2_wmode_report (unsigned char *data, report_type *report) { int i; - static int finger_timer = 0; - static int gesture_timer = 0; + static int finger_on_pad_timer = 0; + static int time_to_forget_tap = 0; static int gesture_delay = 0; static int stroke_x; static int stroke_y; static int drag_locked = 0; + /* Check that it is an absolute packet */ if (((data[0] & 0xc8) == 0x80) && ((data[3] & 0xc8) == 0xc0)) { - unsigned int w = ((data[3] & 0x04) >> 2) | + + unsigned int w = (((data[3] & 0x04) >> 2) | ((data[0] & 0x04) >> 1) | - ((data[0] & 0x30) >> 2); + ((data[0] & 0x30) >> 2)); report->left = check_bits (data[0], 0x01); report->middle = check_bits (data[0] ^ data[3], 0x01); report->down = check_bits (data[0] ^ data[3], 0x02); report->right = check_bits (data[0], 0x02); - report->x = (((data[1] & 0x0f) << 8) | + report->x = (((data[1] & 0x0F) << 8) | ((data[3] & 0x10) << 8) | - data[4]); - report->y = (((data[1] & 0xf0) << 4) | + ((data[4]))); + report->y = (((data[1] & 0xF0) << 4) | ((data[3] & 0x20) << 7) | - data[5]); + ((data[5]))); report->pressure = data[2]; report->finger = (data[2] > finger_threshold); if (report->finger) { - if (finger_timer == 0) { /* finger down */ + if (finger_on_pad_timer == 0) { /* finger down for the first time */ stroke_x = report->x; stroke_y = report->y; } - if (finger_timer < (tap_upper_limit * 80 / 1000)) finger_timer ++; /* don't want timer to overflow */ - - if (gesture_timer > 0) gesture_timer = 1; /* dragging or consecutive tap, gesture to end with finger up */ + /* don't want timer to overflow */ + if (finger_on_pad_timer < (tap_upper_limit * 80 / 1000)) + finger_on_pad_timer ++; + + /* dragging or consecutive tap, gesture to end with finger up + * forget fast that there was a tap if this is not a part of a tap.*/ + if (time_to_forget_tap > 0) + time_to_forget_tap = 1; } else { /* interesting things happen when finger is up */ - /* tap determination */ - if ((finger_timer > (tap_lower_limit * 80 / 1000)) && /* minimum finger down time */ - (finger_timer < (tap_upper_limit * 80 / 1000)) && /* maximum finger down time */ + /* tap determination: Was the finger long enough on the pad and not too + * long, while staying at the same place. + */ + if ((finger_on_pad_timer > (tap_lower_limit * 80 / 1000)) && /* minimum finger down time */ + (finger_on_pad_timer < (tap_upper_limit * 80 / 1000)) && /* maximum finger down time */ (distance((double)(stroke_x - report->x), /* maximum range for finger to drift while down */ (double)(stroke_y - report->y)) < sqr((double)tap_range))) { /* not a consecutive tap? */ - if (gesture_timer == 0) gesture_delay = 0; /* right -> don't delay gesture */ + if (time_to_forget_tap == 0) + gesture_delay = 0; /* right -> don't delay gesture */ else { /* a consecutive tap! */ gesture_delay = multiple_click_delay * 80 / 1000; /* delay gesture to create multiple click */ } @@ -1274,28 +1485,32 @@ /* is drag locked */ if (drag_locked) { drag_locked = 0; /* unlock it and don't gesture. */ - gesture_timer = 0; - } else gesture_timer = tap_interval * 80 / 1000; /* setup gesture time to count down */ + time_to_forget_tap = 0; + } else + time_to_forget_tap = tap_interval * 80 / 1000; /* setup gesture time to count down */ - } else { + } else { /* It was not a tap */ - /* a drag to lock? */ - if (drag_lock && (gesture_timer > 0) && (finger_timer >= (tap_upper_limit * 80 / 1000))) + /* a drag to lock? If user did a tap and quickly hold the finger longer than a tap. + */ + if (drag_lock && (time_to_forget_tap > 0) && (finger_on_pad_timer >= (tap_upper_limit * 80 / 1000))) drag_locked = 1; - if (gesture_timer > 0) gesture_timer --; + if (time_to_forget_tap > 0) time_to_forget_tap --; if (gesture_delay > 0) gesture_delay --; } - finger_timer = 0; + finger_on_pad_timer = 0; } - report->gesture = ((gesture_timer > 0) && (gesture_delay == 0)) || drag_locked; + report->gesture = ((time_to_forget_tap > 0) && (gesture_delay == 0)) || drag_locked; report->left = (report->left || report->gesture); - } else { + } else { /* Packet is garbage or not?? The synaptics pad keeps sending data 1 + * sec after last touch, + */ gpm_debug_log (LOG_NOTICE,"tossing PS/2 data: "); for (i = 0; i < 6; i++) gpm_debug_log (LOG_NOTICE,"%02X ", data [i]); @@ -1343,8 +1558,11 @@ { report_type report; - if (use_wmode) syn_translate_ps2_wmode_report (data, &report); - else syn_translate_ps2_report (data, &report); + if (use_wmode) + syn_translate_ps2_wmode_report (data, &report); + else + syn_translate_ps2_report (data, &report); + syn_process_data (state, report); } @@ -1394,7 +1612,8 @@ syn_read_ps2_ident (fd, &ident); syn_read_ps2_model_id (fd, &model); syn_read_ps2_cap (fd, &cap); - if (! (cap.cap_ext)) use_wmode = 0; /* wmode not support by the pad */ + if (! (cap.cap_ext)) + use_wmode = 0; /* wmode not support by the pad */ syn_process_config (ident, model); /* select 6 byte packet, high packet rate, no-sleep */ gpm-1.20.4/patches/done/need_update/gpm-diff-first.gz010060000017500001750000000233360760216311400212340ustar00niconico00‹Kx<gpm-diff-firstŹlô Žß‡đÇťđ 0K7&xă_wëż–f.tżšžnűOö€˝ě h@uڐj4ěL›cXx8ě4ä6Ôť šĂšŔY+ś=wŤÚ“ęŔޤ†ĺŐńě6P:űľ]Xí€1ęŐíĽ2ŕˇ3ŽË'Ż˜ě™™5j!…šcœ ŔłŞ˜†ë:ÇâlRŐŮݘ^ýóü݁ň×ý×{$Zƒ÷ď!Ńáˇ×vëY˘Ž§z†&˜œĚźoßá *'đnVń¨gěPMÓÖÔ*JÂdVŐ­Ő]ăfOވXŤ žąS›/ŤˆĐˇvƟUO<ÜŠŕ" ľ&#Ľ2@ŽŻŞÎ9ŢŽžĆ\éŃąmo űą‡bs`֙k2iއ')2WY>Öý+ @ßQ_`OÇﳛ‡ŤŤÓ mčąěř͛¸^ÜoGŇw.^Ž;Űő– ~y—/\Śaߙ”î’]h¸ĆTŐ<Ăś˛aęâž:{ž˜ę4|t˜śp\fŮ/gŇ)-ËöQ'†ƒfˆ<:*'… j5p‡ÁŻĽÂ_ď&| Hä-ů¤Ű>‘[‘Č[ÜC´B.bć8Vza/,\U:wâƒ3u™É4݊†™ňĆÔRÍ$ěýđňnx7 ȘăńŒ‹ÁqHjK\şsŐQgioƒíÍňÂąýVőooŽžćxQ / AéšZĂ{ĺiwšDşrho ŐD?łçĚR4Űrm“Uo•Ď#EŹÔ˜k˛§Ügő.•;Őőź3* ­vř4ĂÖ<ł:Ń0Ţ~şŢ<|iŔ{­żT+¸“ŹČŞVD4ÓvŔ'îéz#¨w¤ĂFŤëóMŸUp“eďćv<ü4hTîó9:lPAW=ćŞöƒyPý=Š>óŽá ¤ĎŰn]8#ăG桕ě…7_x˘ĐîäÖYH-4ž}˜łG“l€;˛ĂӞ :wlĎÖlłůAŒ~sę=Ő"ŤŕFS]“ÝúNĄŔű4‹wRë5őUiĐüžIßĹUöŻ-˙ÚţNŠÜyt˜úă41\÷§†ŰlLqíŽÝűůąˇc@\ťyŒ`ŒTŚw˛ %fžÇJ•žkÉ=4)şěFG hqo¸ÉÎťíEˆ.šť,Ĺěö`$ kb;3áoUÓľišY˜,8đ¤Îqůb~ń¸@nًé“p4OŞ ĚTç.Ó÷col|Čđb˜&şť)—č ž 3Ăuiíŕ–×üđŹEř"̋őNăTiőÔ~;S_T4pl¨ÄĽPŰ+Ř)ł„t vú+ŘMĐC'UáşĚŒńđ?‹†ŹËáúö \í"DK˘{ÇĄƒäĆj[ža-X „ YĄƒéčšÜJcN9Œ5 b Ş/>Aa˘ÇŃфöö7űŔLľÔ)ƒŠŁÎŸ0śٺ>kËÖVy°ś6 ÖV*ďœ´ÁşÓ“Hö^;&zí‰i? Í˙ť`sÝjŕ´łÂŢ\ܢżÇČĚtîŰIAo((c"Üą¸Ż&â(şĘfśUă˘ŕn~W,Œfš  - Cœ îrfÖ\ƒŕ=18đfsĐ ‡`šČln*ćKčóŸŔ6őľĆ ĎŹ\.ćŘSą°c@ëD˝p !xäíŁ¤n$řcxý8;Ćťő1NRŕ’ĺéč@>>>ɆŘOŔőů—›wŁÁ_Ÿţ<A'žŰ Aˇ­_=”‰jf; —d9YX‘2Šm9řöčqî°gJryŇęßK óÝßX°W Ĺ×?ŽJô|žÂݓżá"Ú€KěP+ěńÎ`ÉůČ4ćÖ Ř5i§°°\ng"1ŸůAĆ_˜EâŰŔLű%°~[jb+pĺČş­cxZŰ 4Ý\UŽďA–¤ĐůŞó7äݞU×ÁŮJj{ˆ!˝f&şâb†>îžy§A)ŃkRÖkźVɛR Ů^ŻńŁ[dÉ5ž° }.˙wíů Ë]ĚBä 70™Ą1nâŚŘ,D˙:Ł {§v7a)ݰ_ݏSq™˘:Óç*})O̜c ˛Gى(x`łÔ<ö†—<Âj†Ń€7waśăÂY˝ƒ.ňńN.^ÓĆLÄôĂÎc5 ^bŮóÄžĄ{ÜĽ}CO˘‹Rö@ľtRŠdçčż;ÍÇ%úxŠ"GNƟrR÷¤ŕ3é4ÖOć3^Î1ŹÎ–^ĎHž|§lxäý(ZˆÍ˛H›’ôůäSmţźƒ •ŸZž]Ţ]+ƒ/ăŃšr}~9ü¤ČźĘ#ÎloËßl­¸4z˝.Ľ•őŢa7J/Iäŕ9Ě}ˆEŠ(źh$Óä5 •p͛nT4`ü\ŤSœś¸{ýÜ|řh;:jĆD0J+Śç¨wŞ^hŕSżŇÔHÜ´şţ/„ŒCW†–ˇ°Ý 5#ňe1rH/TŁX’ŸYĚçśCyXÄÍłîTÇł˜ƒ¤*ŸĆ /yĺ01•A€Ü•Ľ6żkĘr ŮwMŤŸĂ[ƒ×ÄPŤŸÄ[$Ž~B>Gý'„Áóó7QşôƒĚĐ=ŻÎjP­~V1‹ŚvvVmĘľÚď ü•góę/łFh›1Čďűše­& RGT8dé0L#÷`Ž@ďÉa D×ĺ^™V'Qh cr)€Y= C]PĹE¨ZËZH͢|OŕN/Ÿš'üQgšMkŔ÷2¸Ŕ ĎPMăőÚ´Ђ}Şšjš¨•Ą"\Óľ˛Ç {paŞS¤*@/lšKLގŁ.ÁžŔÄ^ Ż@υP‘Ť ‹ †ŽąĚ˜ß/âΡÜz4°mĹ<“÷b JD7(“ ŐI_ŠV B‚÷bÜóÖŕě̐żóŠł€‘C˜V7ÕőąÎĆlą‰œx"âĹKâ^ jmôKŔ&ë‡Ý“vŹdŰnw)˘űś´ĂëϚ˝ˆ’„9š’7ŠVîLF%™ý,삳wč IkKřÁ–đBڃ2űŰůŰŞ‚¨~ľ ĄfÝ9ӌÉ–¤Xăˆ0@ŞÔÎta˜¸˙nÖł•Ś ęłmŃĄ¸›Sç>ôQܘ€ ›T:8*é˜Ű˝c Őáô+¸Î%°_#QŃCHžăĺÜbßÔn/ź}ďł@íLĺ™ú ¤°2*^ďpáwÚ˝HřčœĎĄ‡ Śęčžú“dÓsC‚ő­e¸*bHr)ŽJŘ]#ČqU*ȈË-$š*ehĐdđŻFœgś3ĂkƒrĽ´ĚÓV–.0[Lžś . Čű5̆-ÔKšhš`8Ă`:fdO™€‹VŞp),đBĹ+5 \4ĺĺP\G°UČáOlĎŞlŽJ…ë˙’rÉmä¸*dŠËŸ%ŮţžcŤ˜pÂKđŠÜ7ĚAySĽął“H€wŕ}ŘI]q-O0'ŚýŔ“_ZČ陆ÚÉl6_ĆĚđňi¤€rHřRN"”CÂQ‘ŃbdŢ˝“ƒg °óŹšĹ¨D[wTzˇŻýČ{ؙƚ-LϘ› ㌡ýPtt¤K$“&äî¤ÖU‰âWY͇xŠ~U¤űřfq­ňWÚOY§ţUţDŠ `•ľ€fŠ Źrm Ú7–Á*kQąĄŹĘě ͖NUq~ę:p tœ( vÉ\ú&Xފު”ŕŰŽ˙~e—jŮŻ?â'Ç“EţQ–䋿řżż[GÔűńđ07‘Ľ]^?ĽâĄÎ&ÁŰ˙Uđ‘Přë…Ţ€ˆ7°­?PŐ:–rPÜ)N †ý"vdÎN}ˇžFşš¸UFˇcůHR>Ç÷ţ{§×#‰>\“†­ś˙‚7‰xw;Î‡ăUzípĝą•‹x?¸šż%Fl_$ĺ^ł%g˙<ő?Ÿą%ébC]÷}\ŘŠťůˆ—ƒŰëÁxô51Gü\„ˆRłí#âżrărlu{šhŁWšŽjř/ü[‡˝ĆQęmšŰhĆ^qsŘ)ł1v–ü5ˇ°TCçĹp~Z í˛š]ŇńK§ě\†ixËĐD›äv›™YřgöCAôÓřłk26O´Đ[=ErL´sWĽˆ°‘č˜Ť&†ó˜F¤ßˆC…ÚĹ̚‰™‰y‘;Łš8Ě%Ź>şśšđ?KŕĎŁhSć˘DXČBŠ#ĘǙĄëfŞŰ/ќxâ>˝†wËč7~)†ĎJđM*œÖ9ĐĎQ|]a–§Żá?9Ň[ˆ’>*Ďbމż-N‰ \fš¸ą#.¨ü-*÷U­ý.‡š‹ůŹf°DFƒŤóńđ݁r}Ű@¸"#\ĺˇWă$ŔQ ŕęöł2ďRFçăA–ŸĂË?SäŘ"€‡ű"ˇ$t™çý<ท8Šîî[Ę úˆŤÁŕň(@ź7Cáćvt}~峙Gađe<¸éú1hĹ%ÉgřYš˝¸Čĺ!¸‰ń sCJüúiO8zíçĆ^ŒUŹZo…gš•{ż˘c{Ą=ёŃ~mX–Y˜,€\ĐĽ°Šž‡ ŐńuG~}•۝š#öv{AoœhŘ}$Q7ńšš#&{5MzńpËĎŁ4é¨f’çϘX’í8¨ę†œŠÖś2ôŢZ-)€IŃFˆĎ˘çŢńlžäBČóą9ËHyüą 7˛Đ‘"é%H„Œ ŽÉŐދăałčc?ĹášţŹZôęaĚ´'Ë6íéŇn˝¸7‰Ëˆ­A•‹ńR‘C§ű]ŚW2Y]_Xś—ňQÜLŃĄŰ -sż”Iž:˘eĸŰ'4Ű2— Îçř´˘€ ÎÄđ6ă> /×?î"~1€žzaŠę•áÂQ÷ő‡(Ěc+-ř…,~̉ébĎĎůDë[Fd5‘Só&gœHŃłđ´(đ0ąœ18Ňü‘R¸T %Üy9Ö|´‹ŰĚĆcňF<%:ŠŁľ ĐŽŽĆCĺbxs9ô…2°“hwçW×J0|BĎÉŃä8šć_UՓy ÄDâ’hŠg.‰ŽDę’č‰ç.ؑN^ęâ_!ä‡cŽno…ş×„SˆKăčxrŤ JďÄą’‚/ş ŒGÂř‚ ľ"Ă.[w1‰ąôÁ‚0Ÿb!řtÖ,ę;I+$Gŕ2ÇPÍđPY†JNîP"™‚T gÜšŰĘ´ Ý(ĄÇçwýŃů%îGîÇŁatjońAŞ“.™×‡3\ŔqBi*ţАZPŞŻÉ^v’k7&ě„óž99ŸÜtŠDŮĎNŇ d ?7Š‚ě8™UşŮ6ƒ/Î"§n3ęÉmF=žÍ¨'ˇőř6ŁžŘfÔĂäż&˙őô6ŁžÚfħ•łÍłĹx‡˙YŒéâC3őăÇ4ŃŽČ ŮĎ| ғ.L:D‹ŘLSŠćœŇkc‰3BŽůŮÝGęEYŞšFo‚Řą%'˜ŮÝDŞž+ _)‘ůQBçŘ&?ýEy”ŸbÎâGrţ’Z´$ܰ`Ż#ň{ĘĹiű=>Č˙߇ď!çp‰v*VŞ8ˇ/ qFůźť´”(§‡*‰FdE5‡NŘűűˇßpüç?ÁnîČ˝Zđ+c˙—†̙˜óŒ ™Č\:­ĂFŤƒÓ>n5Z˘äđĆł—&őĹ{Ťg:L{FĽ—ŒĺY5ŒżŤo6ÉysŤ~€C¨Łjž–8HYbâ~“ĺ5’?i‚čl~ˆ•]¸ ÎüäqnŞ1bäDMüˆ8~P˘Y‡ß)Ŕ÷•!Əŕ=ÇjO8| eepŃô• ÉÁ•¤ óq2¨{QĐ_­ś(˝eŮćŮ ł6ÂďäMۘńşôL_ßĘÁŞ]|üěĚiňÜUlŤęLľ–!ł‰ĆsŞŽYB ŐÇ> MŚŤ°Ą-ÔKlĄ”X˘2˜G}{óȖkłSÜÄL˛ŐŰQm`.šĹÜ,Š„ĺ” *QŢ­Ć]ßŘQ-—Ž1$c?oŒlܛŠ0*˛=Ç֘řąšď g“ôXHŢď÷(ÎÁ7úK/ü;n´Y)dHńť˙Ł7ů˜ţQ˝{tüQ˘˙™řë.:ŚAčKţŽbżB~™~*;ď´ŕŔťŽţúŽŮŃńŽM_Q~‹"H–ŔýŇÂĚţś!”}Ç%ĚaßOáwřuú+œŔŻÍ_K E =  âżŕLcPŽIˆaާ/’P=‹ŃocđÔTĐwBúőbř×Fpˇ ď‚ä51Žj\ŤWƒ‹ą2č_ÖĎ%@ýˇ˝cmj#G~f…’`ÇÇ36„GĘK`‹Ú\’Ăěím]ĺ¨L˜ZlŰźEţűőC­ÇŒĆ˛\Ý]ŐQľےZRŤťŐÝjľŔ„•6Ţđč&!§ŢÚtîX)uNg§Ü|—ÁČrŜŽn‡†OԒ_ĺýXk÷r' 5Lš'ĺWé1Ë*)sšN_Œ&ÇRŸ’L䂒WWŐłť”ƒŠąőę*0 XˆóV9 ]!ŰŔ,Iť'ćV<ýő.Ň”C¤”Ín8BŤuŽÎćjżĽúçăŮLőFé(KG%糏IGOôg”b0‹U_î‰đ{œéťţŽ‚œźj‘áÁÍ%fľšÁčD<9Á|M…1zÓ÷׉÷B?]E×k¸ÖpČ.˜ó”ŒˆřuĚßg“A:ds/éÜTFŠU˜˜ą _dSZ6$šŒb ű…/ْňKäš<çăáˆĚŤ}ţDF-4ƒąZ,t:EŻÄńA˙ŕÄqJˆÉű’曳ŒĽÁűˇNƒŻÁčBShyp|üáŘíjß´<Ŕ[ĎM•Ňʤ#ZŒ>˜(öˇŁS8ގ˙łrÝ)‡=N8ß]SŒaÁÓ#uŔřŠ;6Ľ^% [_hЍAşŠˆ‹EˇŚ‹ˆé˝…MäoGű`â [ßkăí7Đö7g.˝ž3œ#F!}é¸H@c´0ł“ŢÉ/}€ůWvđʆ:Áípüĺv0 .0z Řg͡<ÄL 41)3Ô\†Ů ĹDAýý <Že’>Ćar„kŕă]˛ŢĹE†ÝŠ ™ ˙öő:ƒ>gȇxĽý1 {éů'*"Ë­ç`„ńSÄ2węĺčýö=yă'oˆĂˆČzŮçŃxB¸Pć"› ÁÔëőágô–nZœŕĽH˜´mܗ…CĄ] &řy”ý1¸>zťŻ]ˇt(XěřŕD;wŰ÷q×[ ă_ÎFÓR/ Đe‰Ľ‰˛tK@ŻťËwBˆ—Dz‚ěŰÁťŸgő9ű –@ZĆ>ö͢–,6ĚîŕýÉŃáoÖA‡yX8¤gÎgŒz? 6lj÷]Ż aTÓô/DeŔ.éýxôîčäŕ cÓ0ç1قćŘ˙;˜„ôß1͍¤Źi˙ŕř¨÷˝ÁŠé†iŞŠ sœ (eĂev_ Gśl–€™Ţ^.cĺƒŮ2`ʍ˜:îR{4–KţL¸­wő 6O™/Yĺ@íhú2QDúL[6T8üL6Ě%/ R´¨ül›łÚ!XĘϡzÖT1[€Ú¸Ŕ*ßxxx…v’Qî#j­ĹżéžÉŠ ܃3‹ÜP8˜›[w0M2Ex$ĆĄŻ°AmłćK=zcSîxĄ"˙Şí1řŽžíŇŽW׉úWăŰë śÉ8œČv|áíܔ?/ ;ôŽZ¤™2ÉZ›ĎF_aş yg#M(ôě] Fƒ8Ş´Ń҅ŒČ •…ŒËšË}ă %fŤšSŒ~†7°Çfš§ZäŠ7ŰŘÓACŚŁ‘mźć=ypš=AĂvĺniľťŤ ö,Tĺ0ŁÎ]ĂĐ;KaĽF; ˝Mٚś8m˘óOäl nR ôäzKŕŽĹźć ĂŽTAMOrúEKŃ>t…‘Źt@—â%úsu7“‡”‡žýŤô+&`€˙ŃáÓÄßĹAüŸłŃ9…g˛ŰżŔ`Ř:}<ăšÓôƒC§9 óŇĄj ­Ń0×\HÉe`¤2ÜéYVäK<­€YŻ–aĆŘl§ ˙k4L>ăÜ-IŕTđa.äŞÔ`˘{{őŐö}GęŔO;;ť ››– ™"× tNjäŕXĹBÝĺ5ZäXęŢUxQŘůűŤR\oq.X¸Ćýagî-q2ŠÍŰ=W•N3YŠˆDŃâ[ej:‚žzI Fë7r|Oŕ ü. –.@qňä(–ÄÝŞČ_Ŕ‚™ÂžŔIihčÚ&Š­ĽkÍľ3řď|­Ž7¨“7cĘ˙ˆŤ1|ÎŚ(ëx}ô’= ,>Y•ۡčˆÄţ,ť!ëŤĆ&ґ¨R?Ň…Šš=u¨•uĘŠ¨7‘éFýŸNžLgšuś+űĺeąůŽĺ?xľ`ýŒŹgă\9˙hÚuˇjĘXlKㅥI ”łĆ›˜ś,NÖ;ú$Ő*Jşmç“Np™Ă’no7šŞŐ”Ě˜X_ęnj_uBČž°ˆ…Ľ6ţmNŁjĎ?öA=ĐÖ?ŢńÇ<‘˜ľ6•š=‘aRČřŽpô}ëăŠa6’+•ťv]—Éş*cźˆĐŮpŽgĹ,ÓLŽëv4ľÄŒČ;p^wup˘[$'ęP/>ňďDľ—`Ą˝drí%Cn ~ÓŽa ‡ó|Ań¸Ü´ő6ŠĽĘ‚,X4avąuMvÜ|%)ĽĚŽľxsťdčxâzИ/ŒmeG˝îęÄn|axg‡c8í [9…[u…‘šýŽ2vçZŔŻÜYIÔJ>b% <=Bvť†öi=ZZł}^ş€ +ńvëljGŒ`ÍľŤ$}@ŠÍˇŤ$rĐł•kWIÂŕ4sí*ÉtIÖɛĄŠ;ľËl–V=ĄV/đŽÇˇSe,Ź\”sŕ˘%ŒĎoÎ~ŒĎř(:xÇH–“Óˇ˝“ŢÂăyވiŻń9‚ż?oz|fĚůĆş1b\„V‘ĐĚBC€â*0ŞbóĎsÚ˝ŽÍŘc}Éę>݄@ňuů]Lđ9ŕQ˘ŸmПřxžÉ!˜äĄĄuôpLŤ~ŃřŹŢśŐ-žĐ§68ÔÇ´JÂďÜbÝţtĚGęęöô ”…kŘř7nĆSÇŃVšmĹ{ŞŞů`!'Nƒâß6WU;ÚTË˙ȝ<>řƒ>ö{o?VŔ‡…Ü]8f=yáŰAU†í@^ŻyţHČěr°¤×ɓŢÔ;‰ŰŢQŞÓJÄ_Cąď¨ÂIźŽyöf ééD¸|jĂ郀}éiů蒵ţF˜^ňý¤§AT#ťe¤× ”‘Łi{˝"d ˝ 2ň­lEqňŸ!=‘ęOĆľ4șŁíHŸgsԍŇDi̓żä˝JŹţZ3|‚Ö†‘Ÿç[”Ž—t xŃJŽÔęäjkiXíKŞĺ7…ëÚjÄř:ƒ![kŚăä3ĐÓRr›Ëźx°{ć˜!{8łxś+“¤^xÚäş^2ÇRAŔa‡„J|Dđd§C˜(%^śhOBŘręôCŞEWźÚŇČ-•7˘ˆ`Ż‘ł-ę)Î7’˜6'żIđÚ"xIŢ˝ŐJ͚ƖœŘvx bĎ­(ŤŚ8‚b.¤§Ľ"ˇ‡yy— ˘‹ N¤.śn0‡˜Ŕ@.ŢôŞŸž˛ľ×šS;F–î˛<Un›_ą!×WˆÚ9N]ńUxCjľƒľ:9X[ÁZÝ",Íč”lůĂ5ÔĚéz0=ą6Lçgaž˛ńď ´}Åý #„*ł ´‹m;š~ˇĘÚvŠmĂ´íţűš<ś–ß—Gš<ž ąqň)Ď‹@Z.G%Ž ąqwŃH˧y‚î0÷'JŔútךÔ/¤ovTf JČ*;^Ökő<7DśFŁ@GÚü)œĄÎŒGĚŁńLˆZ§­0žZ´œ nŚttmLÂľf}ăłlfk ˛3.žôŽš1Â3ĄŃđi1џĘ@ßŕăŕűŽ~hű*0~٧üZ9Ź×ÖgIźŮ\ÇCn{˝šůJÂtlĺr+7Ś×/*XŹżŞ$ęŹJ.ţUĹňÓ˙-V‡Qý_žĺOď^ţ˘ţˇ-V˛ëüDWOŠůGŢËj’d.Š{Ü/×ÜáVh„ŒG§ ĘŤaÁél| |Œ—i0×§ě%Ţ(ËZ¨Ât6˙>8˝/ů}ž˙Ýd€\ȋIÃ\{C+(źI[Ľ¤Ě¸ĐĽťÁD´˜uĂAÝѶඁ˝­ÚąXdZ”6a/ťČ{c}pŘl4^i§­ŰÓVáš/…P!Şh6ęŸJŢc śĆűÚĺ=ćZlŠ*Ę#4”ҨŘä0dš,2\*Ů-‹Í–ŠVËbŁe‘Í’W…ŞX,d°”)ą5]CíŠ|îK˙‘dIż=ĹŹŘg_¸Ž/܀'ľ6Žű$Ş˛ĆťÓ—fᆨ‘8Ď#ɓÝ+"˘`B†2śíďsç÷šű\ŹR ‡żŁjš,œ°9mľŐKꈃ’ĆŤÝhĐť9üÔć]Ş0ÁcśËëńóDŻŰŠ/đ÷pęů= fŘ Z?ŁşĆy@ źa "Œ˛)M°?Œs¤BźŰçƸdu–â(4Ô1$°Mປ–ó‚ôUŘçÔ%iÄěŢÂWďRô3ăîG?ęĚ㽨5™ńŰZPÜň'Ř=ie`nÁŐžbĚ˙şę>ĺR…yp„+˝rĆOCóŰSz:x?ě† ÚĽĚđ=ŕ‘Üd˜Lz‡€|˛Ýăĺq2Đć–öOzá)eĂŰĄÇaÂSčgx$3ÔôžjŁ|FŻŐŻŠźĘH éĄ7ýfśsŹpńfăąłöXšÉoKĄ*2§Űˆ|QdŠ &nŽÓsLŇaŻű5ŠŘóhő)Řpř8Ş€K$Lř6Äf°ŒoĎŽőš…‘…őŚŇ“,Őpľ.&(Œ@‘ŃL†yČsňź^׾vÔôËČÂ$fż3pÄ ôĎ<—cđ7LmE1Č[@Q;ĽăfŇ.˘=-ȸP!ž„ƒ(-Ě÷AV+–Ť sy&XËĂ%4vWœ…ť×—}äZ+jĚ]č§Ń“Ín3Á¨ÄîÖzł“đ˝r”7S’ŠJkáԄž,ľŞšěŢymŽđTґŰz\-#%ZŃ2/_榓.L{:˜Ô3ÓFęĆšăőUŤ-ʍRkŚ!˝–×úÓýŤ‘śţ5i_ĘÍhŻa2Ǟ Ą0_!ŠĄeřˆ`‡ôÍ*mĐđg_Čď.‘!uŔG K Ěť˘0É.ô0q‘żÜm]Ď*~y)Œâ m5Ú%Źá0Ře;Ś3v_Ä.ŸB‘Bq›ľ8­¤=EŃvšD úßą‘ňŕ3îĽW-U+‹ć~Ă+(šńžá>­p ŐĘČ%'„PňŐ1元ϜĽâA]´š•@í×]kBĐwh‘뺎OI]6sYě#{ 0ĚÝú0áŢźŠč9'iЃÚTÖ‡ŞžĎüôŽSôn‡˘Ď×סšqlĂĎ]ߓ|sšÍ{őĽ^.~t}UűŻČ&´—Ÿˆç[4 }2u=śç†yn]Úî]]Ÿďó3š5ôL $3‡*2R_Qüx#NĚSä^č!Ýńâ0ąUúĚ \fJŐL8¤ D1R ŒJ4ń˙ĎđĽá›–D,וÁžŮŒůĹMócŃxÍÉÇŃ(¤]Z†—C"'ÓrĆů;ážúŇghvâ5ŐhQâћúGăˆ Ą‡!ŕŐŐǐgpm-1.20.4/patches/done/nice_but_refused004070000017500001750000000000001101736502000170125ustar00niconico00gpm-1.20.4/patches/done/nice_but_refused/compat.c010060000017500001750000000062101101736502000205160ustar00niconico00#include #include #include #include #ifdef HAVE_SYS_SYSMACROS_H # include #else # define minor(dev) (((unsigned int) (dev)) >> 8) # define major(dev) ((dev) & 0xff) #endif #ifdef HAVE_LINUX_MAJOR_H # include #else # ifndef TTY_MAJOR # define TTY_MAJOR 4 # endif # ifndef VCS_MAJOR # define VCS_MAJOR 7 # endif #endif #include "gpmInt.h" /* * Arghhh. check_devfs was soo brain dead. We just need to determine * whether or not we are using devfs. In that case we should do the * nice thing and return a boolean value. * * To do this we check if the /dev/.devfsd file exists. If it does, * then we are most likely running devfs. We should write another * function which returns the /dev/XXX portion of the appropriate * devices. This is a start and a building block for such a function. */ int using_devfs( void ) { struct stat devfs_node; return (stat("/dev/.devfsd", (&devfs_node)) && S_ISCHR(devfs_node.st_mode)); } #define LOOP_SET_SUCCESS_MAJOR(var,dev_major,stat) \ do { \ for(i=0; var##_name[i] != NULL; i++) \ if (stat(var##_name[i], &buf) == 0 \ && S_ISCHR(buf.st_mode) \ && major(buf.st_rdev) == dev_major \ && minor(buf.st_rdev) == 0) \ \ return var = var##_name[i]; \ } while(0) /* We may not be able to open the silly thing!!! */ const char * get_virtualconsole0( void ) { static const char * const console_name[] = { _PATH_TTY "0", "/dev/tty0", "/dev/vc/0", NULL }; static const char * console = NULL; struct stat buf; int i; if (console) return console; LOOP_SET_SUCCESS_MAJOR(console,TTY_MAJOR,lstat); /* If we failed as yet ... try again, this time with stat. Someone is bound to leave a symlink around for compatiblity. */ LOOP_SET_SUCCESS_MAJOR(console,TTY_MAJOR,stat); oops("Unable to determine virtual console device"); } const char * get_virtualconsole_base( void ) { static char * console_base = NULL; if (console_base == NULL) { console_base = strdup(get_virtualconsole0()); console_base[ strlen(console_base)-1 ] = '\0'; } return console_base; } const char * get_virtualscreen0( void ) { static const char * const screen_name[] = { "/dev/vcs", "/dev/vcs0", "/dev/vcc/0", NULL }; static const char * screen = NULL; struct stat buf; int i; if (screen) return screen; LOOP_SET_SUCCESS_MAJOR(screen,VCS_MAJOR,lstat); /* try again ... maybe there are others ... at least we can assume some compatiblity from time to time... */ LOOP_SET_SUCCESS_MAJOR(screen,VCS_MAJOR,stat); oops("Unable to determine virtual console screen device"); } const char * get_virtualscreen_base( void ) { static char * screen_base = NULL; if (screen_base == NULL) { screen_base = strdup(get_virtualscreen0()); if (using_devfs() || screen_base[ strlen(screen_base)-1 ] == '0') screen_base[ strlen(screen_base)-1 ] = '\0'; } return screen_base; } /* Local Variables: */ /* tab-width:8 */ /* c-indent-level:4 */ /* End: */ gpm-1.20.4/patches/done/nice_but_refused/compat.h010060000017500001750000000003070760216311400205310ustar00niconico00#define TTY_NAME_MAX 32 const char * get_virtualconsole0( void ); const char * get_virtualconsole_base( void ); const char * get_virtualscreen0( void ); const char * get_virtualscreen_base( void ); gpm-1.20.4/patches/done/old004070000017500001750000000000001075432545600143035ustar00niconico00gpm-1.20.4/patches/done/old/gpm-1.19.3-8owl.tar010060000017500001750000001440240760216311400172640ustar00niconico00native/Owl/packages/gpm/0040750000022700002260000000000007326524145015014 5ustar buildsourcesnative/Owl/packages/gpm/CVS/0040750000022700002260000000000007326524145015447 5ustar buildsourcesnative/Owl/packages/gpm/CVS/Root0100640000022700002260000000003407326524140016303 0ustar buildsourcessolar@owl:/home/cvs/cvsroot native/Owl/packages/gpm/CVS/Repository0100640000022700002260000000002107326524140017533 0ustar buildsourcesOwl/packages/gpm native/Owl/packages/gpm/CVS/Entries0100640000022700002260000000122607326524145017002 0ustar buildsources/gpm-1.19.3-immunix-owl-tmp.diff/1.1/Sat Jan 6 09:09:23 2001/-ko/ /gpm-1.19.3-owl-gpm-root.diff/1.2/Tue Jun 26 03:05:44 2001/-ko/ /gpm-1.19.3-owl-liblow.diff/1.1/Tue Jun 26 03:05:44 2001/-ko/ /gpm-1.19.3-owl-warnings.diff/1.1/Tue Jun 26 03:05:44 2001/-ko/ /gpm-1.19.3-rh-doc.diff/1.1/Tue Jun 26 00:31:29 2001/-ko/ /gpm-1.19.3-rh-gpm-root.diff/1.1/Tue Jun 26 00:31:29 2001/-ko/ /gpm-1.19.3-rh-install-no-root.diff/1.1/Tue Jun 26 00:31:29 2001/-ko/ /gpm-1.19.3-rh-no-ps.diff/1.1/Tue Jun 26 00:31:29 2001/-ko/ /gpm-1.19.3-rh-owl-socket-mode.diff/1.1/Sat Jan 6 09:10:37 2001/-ko/ /gpm.init/1.7/Tue Jun 26 00:31:29 2001// /gpm.spec/1.6/Wed Jun 27 00:12:54 2001// D native/Owl/packages/gpm/gpm-1.19.3-immunix-owl-tmp.diff0100640000022700002260000000657607225560303022247 0ustar buildsourcesdiff -ur gpm-1.19.3.orig/README gpm-1.19.3/README --- gpm-1.19.3.orig/README Tue Jul 18 16:39:11 2000 +++ gpm-1.19.3/README Sat Jan 6 10:31:18 2001 @@ -159,9 +159,9 @@ better "ldd /usr/sbin/gpm"). And the compiler messages, obviously. * When a program hangs or segfaults, please reinvoke the program under strace: - strace -tf -o /tmp/trace.gpm gpm -t msc + strace -tf -o /var/run/trace.gpm gpm -t msc ^^^^^^^^^^ put your true cmdline here. -Then send me /tmp/trace.gpm* (they may be one or two files, according +Then send me /var/run/trace.gpm* (they may be one or two files, according to the strace version), and a description of how you reproduce the problem. The last resort is a core dump, but I'll ask it personally if I have real diff -ur gpm-1.19.3.orig/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.orig/doc/doc.gpm Tue Jul 18 16:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Sat Jan 6 10:32:15 2001 @@ -2012,7 +2012,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" @} button 3 @{ diff -ur gpm-1.19.3.orig/doc/gpm.info gpm-1.19.3/doc/gpm.info --- gpm-1.19.3.orig/doc/gpm.info Tue Jul 18 17:21:19 2000 +++ gpm-1.19.3/doc/gpm.info Sat Jan 6 10:32:22 2001 @@ -1626,7 +1626,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" } button 3 { diff -ur gpm-1.19.3.orig/doc/gpmdoc.ps gpm-1.19.3/doc/gpmdoc.ps --- gpm-1.19.3.orig/doc/gpmdoc.ps Tue Jul 18 17:21:19 2000 +++ gpm-1.19.3/doc/gpmdoc.ps Sat Jan 6 10:32:32 2001 @@ -3466,7 +3466,7 @@ 2190 y("")477 b(f.nop)430 2294 y("load:)46 b(")191 b(f.load)430 2398 y("free:")237 b(f.free)430 2501 y("---------")45 b(f.nop)430 2605 y("disk)h(usage")g(f.bgcmd)94 b("du)47 -b(|)g(sort)g(-rn)g(>)g(/tmp/du")334 2709 y(})334 2916 +b(|)g(sort)g(-rn)g(>)g(/var/run/du")334 2709 y(})334 2916 y(button)g(3)g({)430 3020 y(name)g("jump")430 3228 y(foreground)e (black)430 3332 y(background)g(red)430 3435 y(border)h(bright)g(yellow) 430 3539 y(head)h(bright)f(yellow)430 3747 y("tty1")94 diff -ur gpm-1.19.3.orig/doc/gpmdoc.txt gpm-1.19.3/doc/gpmdoc.txt --- gpm-1.19.3.orig/doc/gpmdoc.txt Tue Jul 18 17:21:19 2000 +++ gpm-1.19.3/doc/gpmdoc.txt Sat Jan 6 10:32:41 2001 @@ -1589,7 +1589,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" } button 3 { diff -ur gpm-1.19.3.orig/gpn.c gpm-1.19.3/gpn.c --- gpm-1.19.3.orig/gpn.c Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/gpn.c Sat Jan 6 10:30:20 2001 @@ -223,13 +223,17 @@ static void check_uniqueness(void) { - static char tmp_pidfile [] = GPM_NODE_DIR "gpmXXXXXX"; + static char tmp_pidfile [64]; + int fd; FILE* fp = 0; - if (!mktemp(tmp_pidfile + strlen(GPM_NODE_DIR))) { - oops("mktemp()"); + tmp_pidfile[0]; + strncat (tmp_pidfile, GPM_NODE_DIR "gpmXXXXXX", sizeof(tmp_pidfile) - 1); + + if ((fd = mkstemp(tmp_pidfile)) == -1) { + oops("mkstemp()"); } /*if*/ - if ((fp = fopen(tmp_pidfile,"w")) != NULL) { + if ((fp = fdopen(fd,"w")) != NULL) { fprintf(fp,"%d\n",getpid()); fclose(fp); } else if (getuid()) { native/Owl/packages/gpm/gpm-1.19.3-owl-gpm-root.diff0100640000022700002260000003421207315776010021517 0ustar buildsourcesdiff -urN gpm-1.19.3.orig/Makefile.in gpm-1.19.3/Makefile.in --- gpm-1.19.3.orig/Makefile.in Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/Makefile.in Tue Jun 26 02:33:16 2001 @@ -50,7 +50,7 @@ # Main portion: regular build rules -GSRC = gpm.c gpn.c mice.c special.c twiddler.c synaptics.c +GSRC = closeall.c gpm.c gpn.c mice.c special.c twiddler.c synaptics.c GOBJ = $(GSRC:.c=.o) debuglog.o @@ -112,6 +112,7 @@ mouse-test: mice.o twiddler.o synaptics.o $(PROG): libgpm.a +gpm-root: closeall.o libgpm.so.@abi_full@: $(PICS) $(CC) @SOLDFLAGS@libgpm.so.@abi_lev@ \ diff -urN gpm-1.19.3.orig/closeall.c gpm-1.19.3/closeall.c --- gpm-1.19.3.orig/closeall.c Thu Jan 1 03:00:00 1970 +++ gpm-1.19.3/closeall.c Tue Jun 26 02:33:16 2001 @@ -0,0 +1,27 @@ +#include +#include + +#ifdef __linux__ +#include +#endif + +int close_all(void) +{ + int fd, max; + + max = sysconf(_SC_OPEN_MAX); + if (max <= 0) + return -1; + +#ifdef __linux__ + if (max < NR_OPEN) + max = NR_OPEN; +#endif + + for (fd = 3; fd < max; fd++) { + if (close(fd) && errno != EBADF) + return -1; + } + + return 0; +} diff -urN gpm-1.19.3.orig/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.orig/doc/doc.gpm Tue Jul 18 16:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Tue Jun 26 03:57:17 2001 @@ -133,7 +133,6 @@ As of release 0.96, a default-handler is released with gpm, and can be used to handle Control-Mouse events to draw menus on the screen. -The @code{gpm-root} program, however, needs kernel 1.1.73 or newer. @xref{gpm-root}. Release 1.00 has been an incompatible one (is is incompatible with @@ -1940,17 +1939,9 @@ The program @code{gpm-root} is designed to handle Control-Mouse events to draw menus on the background of the current tty. The actual menus -are described by a configuration file in the user's home directory. - -Please note that @code{gpm-root} needs to run with Linux 1.1.73 or -newer, because previous kernels lack some screen handling capabilities -required by the program. +are described by the configuration file, @file{/etc/gpm-root.conf}. The program uses the files @file{/dev/vcs*} to draw to the console screen. -These are available only from kernel 1.1.81 onward. If you miss those -device nodes, you should create them using @code{create_vcs} in the -distribution directory. The tool won't run with kernels older than 1.1.81, -because they lacked a full screen dump/restore capability. Available command line options are the following: @@ -1961,14 +1952,6 @@ Allowed strings are @samp{shift}, @samp{anyAlt}, @samp{leftAlt}, @samp{rightAlt}, @samp{control}. -@item -u - Deny using user-specific configuration files. With this - option on, only @file{/etc/gpm-root.conf} will be used as a source - of configuration information. This option - is intended for those system administrators who fear security could - be broken by this daemon. Things should be sufficiently secure, but - if you find a hole please tell me about it. - @item -D Do not automatically enter background operation when started, and log messages to the standard error stream, not the syslog @@ -2167,9 +2150,8 @@ %M .SH BUGS -Known bugs have been fixed. In particular, if you invoke @code{gpm-root} -right after @code{gpm}, it will delay a few seconds before trying to connect -to the daemon. +Anyone with access to the console may cause @code{gpm-root} to run any of +the commands given in @file{/etc/gpm-root.conf} as root. @ignore .SH AUTHOR @@ -2179,7 +2161,6 @@ .nf /dev/gpmctl The socket used to connect to gpm. /etc/gpm-root.conf The default configuration file. -$(HOME)/.gpm-root The user configuration file. /dev/vcs* Virtual Console Screens .fi diff -urN gpm-1.19.3.orig/gpm-root.c gpm-1.19.3/gpm-root.c --- gpm-1.19.3.orig/gpm-root.c Wed Apr 19 09:53:38 2000 +++ gpm-1.19.3/gpm-root.c Tue Jun 26 02:33:16 2001 @@ -1,3 +1,4 @@ +#error This should be re-generated from the .y file. /* A Bison parser, made from gpm-root.y by GNU Bison version 1.25 diff -urN gpm-1.19.3.orig/gpm-root.conf gpm-1.19.3/gpm-root.conf --- gpm-1.19.3.orig/gpm-root.conf Tue Jan 18 00:21:00 2000 +++ gpm-1.19.3/gpm-root.conf Tue Jun 26 02:36:27 2001 @@ -18,7 +18,7 @@ "tty 8" f.jptty "8" "" f.nop "more of them..." { - + "tty 9" f.jptty "9" "tty 10" f.jptty "10" "tty 11" f.jptty "11" @@ -33,7 +33,6 @@ "tty 17" f.jptty "17" } } - } button 2 { @@ -47,12 +46,10 @@ "%b %d %Y" f.time "%H:%M" f.time "" f.nop - "load: " f.load + "load: " f.load "free:" f.free "" f.nop - "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" - "print mail headers to tty" f.bgcmd - "grep '^From ' /var/spool/mail/$USER | tail" + "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" } button 3 { diff -urN gpm-1.19.3.orig/gpm-root.y gpm-1.19.3/gpm-root.y --- gpm-1.19.3.orig/gpm-root.y Wed Apr 19 09:48:41 2000 +++ gpm-1.19.3/gpm-root.y Tue Jun 26 06:47:19 2001 @@ -64,6 +64,8 @@ #define VCS_MAJOR 7 #endif +extern int close_all(void); + #define MAX_NR_USER_CONSOLES 63 /* needs __KERNEL__ */ #include "gpmInt.h" /* itz Thu Aug 13 14:10:26 PDT 1998 @@ -78,6 +80,7 @@ #include "wd.h" /* when debugging macros */ #define USER_CFG ".gpm-root" +#undef USER_CFG #define SYSTEM_CFG SYSCONFDIR "/gpm-root.conf" #define DEFAULT_FORE 7 @@ -117,7 +120,9 @@ /* provide defaults */ int opt_mod = 4; /* control */ int opt_buf = 0; /* ask the kernel about it */ +#ifdef USER_CFG int opt_user = 1; /* allow user cfg files */ +#endif @@ -134,7 +139,7 @@ typedef struct Draw { short width; /* length of longest item */ short height; /* the number of items */ - short uid; /* owner */ + int uid; /* owner */ short buttons; /* which button */ short fore,back,bord,head; /* colors */ char *title; /* name */ @@ -321,10 +326,18 @@ cfglineno++; } if (s[i]=='\\') s[i]=getc(cfgfile); + if (i>=sizeof(s)-1) + { + yyerror("line too long"); + if (s[i]!='\n') + while ((c=getc(cfgfile))!='\n' && c!=EOF); + cfglineno++; + break; + } + i++; } - /* get '"' as '\"' */ - while (s[i++]!='\"' && s[i-2] !='\\') + while (s[i-1]!='\"' && (i < 2 || s[i-2]!='\\')) ; s[i-1]=0; yylval.string=(char *)strdup(s); return T_STRING; @@ -342,7 +355,17 @@ } /* get a single word and convert it */ do - s[i++]=c; + { + if (i>=sizeof(s)-1) + { + yyerror("line too long"); + if (s[i]!='\n') + while ((c=getc(cfgfile))!='\n' && c!=EOF); + cfglineno++; + break; + } + s[i++]=c; + } while (isalnum(c=getc(cfgfile)) || c=='.'); ungetc(c,cfgfile); s[i]=0; @@ -447,9 +470,10 @@ /*====================================================================*/ void f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + if (setgid(pass->pw_gid) < 0 || + initgroups(pass->pw_name, pass->pw_gid) < 0 || + setuid(pass->pw_uid) < 0) + exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); @@ -525,7 +549,6 @@ /*---------------------------------------------------------------------*/ int f_bgcmd(int mode, DrawItem *self, int uid) { - int i; struct passwd *pass; switch (mode) @@ -545,10 +568,11 @@ if (!pass) exit(1); f__fix(pass); /* setgid(), setuid(), setenv(), ... */ close(0); close(1); close(2); - open("/dev/null",O_RDONLY); /* stdin */ - open("/dev/tty0",O_WRONLY); /* stdout */ - dup(1); /* stderr */ - for (i=3;iarg,(char *)NULL); exit(1); /* shouldn't happen */ @@ -683,22 +707,17 @@ FILE *f; double l1,l2,l3; - l1=l2=l3=0.0; - switch (mode) { case F_CREATE: /* modify name, just to fake its length */ - self->clientdata=malloc(strlen(self->name)+20); - self->name=realloc(self->name,strlen(self->name)+20); - strcpy(self->clientdata,self->name); - strcat(self->clientdata," %5.2f %5.2f %5.2f"); - sprintf(self->name,self->clientdata,l1,l2,l3); - break; + /* XXX: no failure checks */ + self->clientdata=strdup(self->name); + self->name=realloc(self->name,strlen(self->name)+3*20); case F_POST: if (!(f=fopen("/proc/loadavg","r"))) return 1; fscanf(f,"%lf %lf %lf",&l1,&l2,&l3); - sprintf(self->name,self->clientdata,l1,l2,l3); + sprintf(self->name,"%s %5.2f %5.2f %5.2f",self->clientdata,l1,l2,l3); fclose(f); case F_INVOKE: @@ -714,23 +733,19 @@ long l1,l2; char s[80]; - l1=l2=0; switch (mode) { case F_CREATE: /* modify name, just to fake its length */ - self->clientdata=malloc(strlen(self->name)+30); - self->name=realloc(self->name,strlen(self->name)+30); - strcpy(self->clientdata,self->name); - strcat(self->clientdata," %5.2fM mem + %5.2fM swap"); - sprintf(self->name,self->clientdata,(double)l1,(double)l2); - break; + /* XXX: no failure checks */ + self->clientdata=strdup(self->name); + self->name=realloc(self->name,strlen(self->name)+2*30); case F_POST: if (!(f=fopen("/proc/meminfo","r"))) return 1; - fgets(s,80,f); - fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l1); - fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l2); - sprintf(self->name,self->clientdata, + fgets(s,sizeof(s),f); + fgets(s,sizeof(s),f); sscanf(s,"%*s %*s %*s %ld",&l1); + fgets(s,sizeof(s),f); sscanf(s,"%*s %*s %*s %ld",&l2); + sprintf(self->name,"%s %5.2fM mem + %5.2fM swap",self->clientdata, (double)l1/1024/1024,(double)l2/1024/1024); fclose(f); @@ -751,6 +766,7 @@ { case F_CREATE: /* modify name, just to fake its length */ self->clientdata=self->name; + /* XXX: "format features" */ strftime(s,110,self->clientdata,broken); strcat(s,"1234567890"); /* names can change length */ self->name=(char *)strdup(s); @@ -832,20 +848,25 @@ /* the return value tells whether it has been newly loaded or not */ int getdraw(int uid, int buttons, time_t mtime1, time_t mtime2) { +#ifdef USER_CFG struct passwd *pass; +#endif struct stat buf; Draw *new, *np, *op, *pp; int retval=0; time_t mtime; gpm_debug_log(LOG_DEBUG,"getdraw: %i %i %li %li",uid,buttons,mtime1,mtime2); +#ifdef USER_CFG pass=getpwuid(uid); /* deny personal cfg to root for security reasons */ if (pass==NULL || !uid || !opt_user) { +#endif mtime=mtime2; uid=-1; strcpy(cfgname,SYSTEM_CFG); +#ifdef USER_CFG } else { @@ -853,6 +874,7 @@ strcpy(cfgname,pass->pw_dir); strcat(cfgname,"/" USER_CFG); } +#endif if (stat(cfgname,&buf)==-1) { @@ -926,7 +948,9 @@ "Usage: %s [options]\n",prgname); printf(" Valid options are\n" " -m modifier to use\n" +#ifdef USER_CFG " -u inhibit user configuration files\n" +#endif " -D don't auto-background and run as daemon\n" " -V increase amount of logged messages\n" ); @@ -972,12 +996,18 @@ int opt; gpm_log_daemon = 1; +#ifdef USER_CFG while ((opt = getopt(argc, argv,"m:uDV::")) != -1) +#else + while ((opt = getopt(argc, argv,"m:DV::")) != -1) +#endif { switch (opt) { case 'm': opt_mod=getmask(optarg, tableMod); break; +#ifdef USER_CFG case 'u': opt_user=0; break; +#endif case 'D': gpm_log_daemon = 0; break; case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); @@ -1201,10 +1231,9 @@ int evflag; int recursenow=0; /* not on first iteration */ - prgname=argv[0]; - setuid(0); /* if we're setuid, force it */ + prgname = argv[0] ?: "gpm-root"; - if (getuid()) + if (getuid() != 0 || getuid() != geteuid()) { fprintf(stderr,"%s: Must be root\n", prgname); exit(1); @@ -1285,7 +1314,13 @@ } if (!vc) { - oops("can't open mouse connection"); + fprintf(stderr,"%s: Can't open mouse connection\n",prgname); + exit (1); + } + if (gpm_fd == -2) + { + fprintf(stderr,"%s: Can't run in an xterm or rxvt\n",prgname); + exit(2); } conn.eventMask=~0; /* grab everything away form selection */ diff -urN gpm-1.19.3.orig/special.c gpm-1.19.3/special.c --- gpm-1.19.3.orig/special.c Tue Jan 18 00:34:00 2000 +++ gpm-1.19.3/special.c Tue Jun 26 02:33:16 2001 @@ -38,6 +38,8 @@ #include "gpmInt.h" +extern int close_all(void); + /* * This function is only called at button press, to avoid unnecessary * overhead due to function call at every mouse event @@ -67,7 +69,7 @@ */ int processSpecial(Gpm_Event *event) { - char *command=NULL; int i; + char *command=NULL; FILE *consolef; if ((event->type & GPM_TRIPLE) @@ -151,10 +153,11 @@ case 0: /* child */ close(0); close(1); close(2); - open("/dev/null",O_RDONLY); /* stdin */ - open("/dev/tty0",O_WRONLY); /* stdout */ - dup(1); /* stderr */ - for (i=3;i #include #include -#include +#include #include #include native/Owl/packages/gpm/gpm-1.19.3-rh-doc.diff0100640000022700002260000000067407315753741020343 0ustar buildsourcesdiff -ur gpm-1.19.3.orig/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.orig/doc/doc.gpm Tue Jul 18 16:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Tue Jun 26 01:41:26 2001 @@ -1294,7 +1294,7 @@ @item int gpm_hflag Used to signal if a character has been generated by a mouse handler. - @xref{Handling Functions} + @xref{Handling Functions}. @vindex gpm_handler @vindex gpm_data @item Gpm_Handler *gpm_handler; void *gpm_data native/Owl/packages/gpm/gpm-1.19.3-rh-gpm-root.diff0100640000022700002260000000351207315753741021334 0ustar buildsourcesdiff -ur gpm-1.19.3.orig/gpm-root.y gpm-1.19.3/gpm-root.y --- gpm-1.19.3.orig/gpm-root.y Wed Apr 19 09:48:41 2000 +++ gpm-1.19.3/gpm-root.y Tue Jun 26 01:55:18 2001 @@ -50,6 +50,7 @@ #include /* VT_ACTIVATE */ #include /* K_SHIFT */ #include +#include #ifdef HAVE_SYS_SYSMACROS_H #include @@ -623,11 +624,7 @@ case 0: /* child: exec getty */ sprintf(name,"tty%i",vc); -#ifdef __alpha__ - execl("/daemons/getty","getty","38400",name,(char *)NULL); -#else execl("/sbin/mingetty","mingetty",name,(char *)NULL); -#endif __alpha__ exit(1); /* shouldn't happen */ default: @@ -1045,6 +1042,12 @@ static int postcount; static Posted *activemenu; +#if __BYTE_ORDER == __BIG_ENDIAN +#define bigendian 1 +#else +#define bigendian 0 +#endif + Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) { Posted *new; @@ -1062,9 +1065,9 @@ lines=dump[0]; columns=dump[1]; i=(columns*dump[3]+dump[2])*2+1; /* where to get it */ if (i<0) i=1; - new->colorcell=dump[4+i]; + new->colorcell=dump[4+i-bigendian]; gpm_debug_log(LOG_DEBUG,"Colorcell=%02x (at %i,%i = %i)", - new->colorcell,dump[2],dump[3],i); + new->colorcell,dump[2],dump[3],i-bigendian); /* place the box relative to the mouse */ if (!postcount) x -= draw->width/2; else x+=2; @@ -1078,7 +1081,11 @@ new->y=y; new->Y=y+draw->height-1; /* these definitions are dirty hacks, but they help in writing to the screen */ +#if __BYTE_ORDER == __BIG_ENDIAN +#define PUTC(c,f,b) (*(curr++)=((b)<<4)+(f),*(curr++)=(c)) +#else #define PUTC(c,f,b) (*(curr++)=(c),*(curr++)=((b)<<4)+(f)) +#endif #define PUTS(s,f,b) for(curr2=s;*curr2;PUTC(*(curr2++),f,b)) #define GOTO(x,y) (curr=dump+4+2*((y)*columns+(x))) native/Owl/packages/gpm/gpm-1.19.3-rh-install-no-root.diff0100640000022700002260000000074607315753741022637 0ustar buildsources--- gpm-1.19.3/Makefile.in 2000/07/22 06:50:28 1.1 +++ gpm-1.19.3/Makefile.in 2000/07/22 06:50:45 @@ -142,7 +142,7 @@ for i in mev gpm-root; do \ $(INSTALL_PROGRAM) $$i $(bindir)/$$i ;\ done - $(INSTALL_PROGRAM) -o root -m 755 disable-paste $(bindir)/disable-paste + $(INSTALL_PROGRAM) disable-paste $(bindir)/disable-paste # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional # headache in cases like this native/Owl/packages/gpm/gpm-1.19.3-rh-no-ps.diff0100640000022700002260000000060507315753741020624 0ustar buildsources--- gpm-1.19.0/doc/Makefile.in.nops Thu Jan 20 22:52:46 2000 +++ gpm-1.19.0/doc/Makefile.in Sun Mar 19 00:37:35 2000 @@ -93,7 +93,7 @@ # Main portion -all: $(srcdir)/gpmdoc.ps $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) +all: $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) $(MANPAGES): $(srcdir)/doc.gpm $(srcdir)/manpager cd $(srcdir) && gawk -f ./manpager doc.gpm native/Owl/packages/gpm/gpm-1.19.3-rh-owl-socket-mode.diff0100640000022700002260000000065507225560415022600 0ustar buildsources--- gpm-1.19.3/gpm.c.orig Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/gpm.c Sat Jan 6 10:10:41 2001 @@ -1012,8 +1012,9 @@ oops(ctladdr.sun_path); maxfd=max(maxfd,ctlfd); -/* is this a bug in the new kernels? */ - chmod(GPM_NODE_CTL,0777); +/* only allow the console user to access. */ + if (chmod(GPM_NODE_CTL,0600)==-1) + oops(GPM_NODE_CTL); /*....................................... get screen dimensions */ native/Owl/packages/gpm/gpm.init0100750000022700002260000000232507315753741016472 0ustar buildsources#!/bin/sh # $Id: gpm-1.19.3-8owl.tar,v 1.2 2002/05/28 19:13:54 nico Exp $ # # chkconfig: 2345 85 15 # description: \ # gpm provides mouse support to text-based Linux applications as \ # well as console cut-and-paste operations using the mouse. # # processname: gpm # pidfile: /var/run/gpm.pid # config: /etc/sysconfig/mouse # source function library . /etc/init.d/functions OWL_STARTUP_ENABLE=1 MOUSECFG=/etc/sysconfig/mouse case "$1" in start) if [ -f "$MOUSECFG" ]; then . "$MOUSECFG" else MOUSETYPE="none" fi if [ "$MOUSETYPE" = "none" ]; then echo "Not starting gpm (no mouse is configured)" exit 0 fi if [ "$MOUSETYPE" = "Microsoft" ]; then MOUSETYPE=ms fi if [ -n "$MOUSETYPE" ]; then GPM_ARG="-t $MOUSETYPE" else GPM_ARG="" fi if [ "0$OWL_STARTUP_VERSION" -ge 3 ]; then daemon --pidfile /var/run/gpm.pid --expect-user root \ -- gpm "$GPM_ARG" else daemon gpm "$GPM_ARG" fi ;; stop) if [ "0$OWL_STARTUP_VERSION" -ge 3 ]; then killproc --pidfile /var/run/gpm.pid --expect-user root gpm else killproc gpm fi ;; restart|reload) $0 stop $0 start ;; status) status --pidfile /var/run/gpm.pid --expect-user root gpm ;; *) echo "Usage: gpm {start|stop|restart|status}" exit 1 esac exit $? native/Owl/packages/gpm/gpm.spec0100640000022700002260000001161107316222406016443 0ustar buildsources# $Id: gpm-1.19.3-8owl.tar,v 1.2 2002/05/28 19:13:54 nico Exp $ # this defines the library version that this package builds. %define LIBVER 1.18.0 %define BUILD_GPM_ROOT 'no' Summary: A mouse server for the Linux console. Name: gpm Version: 1.19.3 Release: 8owl License: GPL Group: System Environment/Daemons Source0: ftp://ftp.systemy.it/pub/develop/%{name}-%{version}.tar.gz Source1: gpm.init Patch0: gpm-1.19.3-rh-install-no-root.diff Patch1: gpm-1.19.3-rh-no-ps.diff Patch2: gpm-1.19.3-rh-doc.diff Patch3: gpm-1.19.3-rh-owl-socket-mode.diff Patch4: gpm-1.19.3-rh-gpm-root.diff Patch5: gpm-1.19.3-owl-gpm-root.diff Patch6: gpm-1.19.3-immunix-owl-tmp.diff Patch7: gpm-1.19.3-owl-liblow.diff Patch8: gpm-1.19.3-owl-warnings.diff Prereq: /sbin/chkconfig /sbin/ldconfig /sbin/install-info /etc/rc.d/init.d BuildRequires: bison BuildRoot: /var/rpm-buildroot/%{name}-root %description gpm provides mouse support to text-based Linux applications as well as console cut-and-paste operations using the mouse. %package devel Requires: %{name} = %{version}-%{release} Summary: Libraries and header files for developing mouse driven programs. Group: Development/Libraries %description devel The gpm-devel package contains the libraries and header files needed for the development of mouse driven programs for the console. %if "%{BUILD_GPM_ROOT}"=="'yes'" %package root Requires: %{name} = %{version}-%{release} Summary: A mouse server add-on which draws pop-up menus on the console. Group: System Environment/Daemons %description root The gpm-root program allows pop-up menus to appear on a text console at the click of a mouse button. %endif %prep %setup -q %patch0 -p1 %patch1 -p1 %patch2 -p1 %patch3 -p1 %patch4 -p1 %patch5 -p1 %patch6 -p1 %patch7 -p1 %patch8 -p1 %build autoconf CFLAGS="-D_GNU_SOURCE $RPM_OPT_FLAGS" \ lispdir=%{buildroot}%{_datadir}/emacs/site-lisp \ %configure rm gpm-root.c doc/*.[178] doc/gpm.info make CFLAGS="" CPPFLAGS="" %install rm -rf %{buildroot} mkdir -p %{buildroot}%{_sysconfdir} PATH=/sbin:/usr/sbin:$PATH mkdir -p %{buildroot}%{_datadir}/emacs/site-lisp %makeinstall lispdir=%{buildroot}%{_datadir}/emacs/site-lisp install -m 644 doc/gpm-root.1 %{buildroot}%{_mandir}/man1 install -m 644 gpm-root.conf %{buildroot}%{_sysconfdir} install -s -m 755 hltest %{buildroot}%{_bindir} make t-mouse.el t-mouse.elc cp t-mouse.el* %{buildroot}%{_datadir}/emacs/site-lisp pushd %{buildroot} chmod +x .%{_libdir}/libgpm.so.%{LIBVER} ln -sf libgpm.so.%{LIBVER} .%{_libdir}/libgpm.so gzip -9nf .%{_infodir}/gpm.info* popd mkdir -p %{buildroot}%{_sysconfdir}/rc.d/init.d install -m 755 $RPM_SOURCE_DIR/gpm.init %{buildroot}%{_sysconfdir}/rc.d/init.d/gpm %clean rm -rf %{buildroot} %pre rm -f /var/run/gpm.restart if [ $1 -ge 2 ]; then /etc/rc.d/init.d/gpm status && touch /var/run/gpm.restart || : /etc/rc.d/init.d/gpm stop || : fi %post if [ $1 -eq 1 ]; then /sbin/chkconfig --add gpm fi if [ -f /var/run/gpm.restart ]; then /etc/rc.d/init.d/gpm start fi rm -f /var/run/gpm.restart /sbin/ldconfig /sbin/install-info %{_infodir}/gpm.info.gz %{_infodir}/dir %preun if [ $1 -eq 0 ]; then /sbin/install-info %{_infodir}/gpm.info.gz --delete %{_infodir}/dir /etc/rc.d/init.d/gpm stop || : /sbin/chkconfig --del gpm fi %postun /sbin/ldconfig %files %defattr(-,root,root) %{_bindir}/mev %{_bindir}/hltest /usr/sbin/gpm %{_datadir}/emacs/site-lisp/t-mouse.el %{_datadir}/emacs/site-lisp/t-mouse.elc %{_infodir}/gpm.info* %{_mandir}/man1/mev.1* %{_mandir}/man8/gpm.8* %{_libdir}/libgpm.so.%{LIBVER} %config %{_sysconfdir}/rc.d/init.d/gpm %files devel %defattr(-,root,root) %{_includedir}/* %{_libdir}/libgpm.a %{_libdir}/libgpm.so %if "%{BUILD_GPM_ROOT}"=="'yes'" %files root %defattr(-,root,root) %config %{_sysconfdir}/gpm-root.conf %{_bindir}/gpm-root %{_mandir}/man1/gpm-root.1* %endif %changelog * Wed Jun 27 2001 Solar Designer - Disabled packaging gpm-root by default. * Tue Jun 26 2001 Solar Designer - Moved gpm-root to a separate subpackage. - Disabled support for ~/.gpm-root because of too many security issues with this feature, updated the documentation accordingly. - Fixed many gpm-root reliability bugs including the format string bug reported by Colin Phipps to Debian (http://bugs.debian.org/102031) and several other bugs which were about as bad. * Sun May 27 2001 Alexandr D. Kanevskiy - hack to avoid double use of $RPM_OPT_FLAGS * Sat Jan 06 2001 Solar Designer - Updated the patches for fail-closeness in many cases. - Re-generate gpm-root.c at build time, to avoid maintaining two patches. - /tmp fixes in the documentation (don't suggest bad practices). - More startup script cleanups. - Restart after package upgrades in an owl-startup compatible way. * Fri Jan 05 2001 Alexandr D. Kanevskiy - import mktemp patch from Immunix, fix strncpy * Sun Dec 24 2000 Alexandr D. Kanevskiy - import from RH gpm-1.20.4/patches/done/old/gpm-1.19.3-8owl.tar.gz010060000017500001750000000253200760216311400177000ustar00niconico00‹ňÖó<gpm-1.19.3-8owl.tarě[isŰFŇöWńWŒ‘8"EđŔC˘"—KvœX’K˛“l%Y HD ŔĹ!šëhű>=3 ÁK>ÖIöÝ×(Ű$gş{zş{ú8´S˙–7.§Acb;7ö'ádÜxđ ŸfłŐ춛řl6MłŤ>;âS=š]Ëě´Í–Ńj?híŚŃzŔÚţ„'KR;fěÁ ó÷¸$Ęb‡'ţǞp‹ţŸüpÝř őßju?ë˙ŻÖ˙UĽŸD˙FłŮiÝŁŤUĐ?ŕŒŽŐ´°ćgý˙áOv|Mƒ^cyĂšMčo ՗|~ţçŸ{Ď?ŸD‰ŸFńě>˙Śąrţťmëóů˙SžUĹ>ôŸĎ~ţĎÂ4ö?ÉżăüâűRţ×Ŕçó˙g<¤ěšQ7ęV͏łĐSC6PKǓşë{^sk;eßŮ!cÖ<čái1ŠkÔn˘FŠH‚Pé'ĺ9žŮx•qö]2řVŻŮîľZ÷ŕţ ˆŚ‹Ő? {jÇĄ“ÁG57r6c6{–Ń3ścŽnűŃý†ľ0úO¨{’|$.I/‰œžÖƑ˷ŠßĄî •şú)`ťŰWT€É„;ě4~äŽě aöÚ­đôsúËý˙;ܧô˙v—üżiśŰ&~˜4Šţ˙ě˙˙ř‡”ÉjYĚ ŻGą?l\œžŸ†ŐHŠVŤmޑ‡?`Ć>3:= žÂ 3Ý,UŤŐuJ;żb_ 7sć |,´ ÎX`')@’(N™Ÿ€ ăĚÍƝ çťAŔěä†ů)›`Á(Dź1ßcĎaˇ¤n;(m=Č čoލܖ ÏFa~ĺ|´,eđk磈łrH̞Ń^ÉłŢeUőIDŽá„DśŰcˆW§bԋ9ď‰AŒŇ1ZË Ła4)Ő0čúRFLJFCXfěw&¤[‹CöXڑ›iĽęűŁä6ChěřŽTŐ¤PłĹŽßŢ/|™gxŃŞ¤ňń­âĎ–äßí™p8[ĺ?GZS€iźTÇěÔ§T€x6kANmT…œÚ¤9óáJů ź%͈çN}ޏšžŢ­&˛ÝI˛A˘râ>EIˆՔÂZS•UP•ŐęUŠOR•i4ŮŹŹi•VˇËe!ńJËj2ӁI…VLKRĄŸ’LťiĐüBŤ•Vť´źR§Ů&RSeT–ŠŞ ËJUđľÝ ,–jƒňď˜"ľáŠĂżń7WzؐDw› x'RuZAç[PńKęŕţž<[M“äÚcŽ1í7¸XMN˜&ÉÃăĆ"eŚ]Č,弍€$~Ťůa9殜kY$ˆ"!‰ŹbD Ďx€z°RbŞm‹#ĚaźF@t[]hšÎ â{/kMߤ[Ě 3ď˛W€|ŒÁښŶŒb ´ œ‹üü˙î\†“°îe)6*GĚŹ„Ű&ý٨ ˝˘Šf6ž´ŚĽ-}JU nH}‡ÝF>„ďŒ¸sÓG™ôŒ‡Č<Ë4 “}K"VÎ…$؟ř.%Děç_Ů{öňźqyzÖ?}~Ĺ4pő“x´CňVĚNëWŕ‡)óÜC’âÓç/Îö˜7Í&ha¤6ĺ‡ă›”'ĺ"z•ňŽ€‡ĺââ•JE˛ËXM’˛Ś+ZE,U đsóWĹ^:[‘¸žuG:KüňČ+BWXD_lě–=ß$ŤLƒťŁ#œ b˛Zd2YpIvĹ{žˇ×ȡ_ń˘ v[äR›j řđˆ]ź~ńBŃ,ŔťÁs×áäÁšÄź`]{äţjú§ ]ŽH.áQłĹ´ 3 b˙'ę˙ľžŢ§í˙Z-Ó0Š˙k´ťÝ`Q˙măsý˙§Ö˙k>ôÜžátTeaxŁë-Ěżˇ^Ǒ D$p¨‘: 7ÜnR<˙’ .ą/Řš ţ&ˆ5¨{(á†Y} m˛8CŮIŽđŮőŐkĘé)‚Pű(ZFýHßđ-úŽđ˜gĄâÓI^Ş WœgŒ2}0đúěň›ď@čË2Qě՝ŁzTAĽ;ȆA4ŹG€QĽ\A^эŁ,ᵔ'ioG,-‰ ‹D´Č—ĺ—W—Ď*˝ŔŸvКŸÝŢÎ|TA$QýŘř}/ ‚ăŢ<rĐ…oOžTŘńőĺ‹Ó§/Nž]Ż üö˜ýRÚnAË"˕˝Ýh?‹éWŁLFdC4î›ř̃îšůQŚŢ„\uSˆľú…:Aćrö5Âv’şőŃă⠏ă0c4ęšÜcý~ŕ‡Ů›~ż'†?öÓD’ŕ!DBhœo}0§2‚*"͎ŒÚ:ŰoDčŰÁXF2Kœ(ôĘýë'ý˗gýó“Ÿ(6îPŘ ŻÚAbg'F AfU37łˇŔ`W‚–@“˨‘Ă"Ť;HٙŒ˝Ö!x"1‡oŐŞˆŽ;‚¤ jn…}ő˘ĐxöÍÉéSąŔc;w‚˛BNR˝ťÇXţ˘öĘňĺPťŰ3ş…ܲDţŽr8' 5¤b.„ÍúAGý*Ń9ŹěŽ%ľŸˆËŚ~:˘Őeoˁ=’g4•FLb°'Q˜ĆQP;§łÎř-ӄŚÝ؞˛13,ʎ™ƒ”>”==věD.›đťźGŠSÇ Db…œť ťáqČ!˜şQďZԔ ůޣĎßÄÜ[˝´+ľ9ŁŽó6˛đK ÓÉ&uW‘0 ŮÝ+cŸô§8NەÂ;h5)WŽVŢՍşź“şĘ=Hš<ń‡áűˆŚ´A6‹ş’”$ÚÁYĄŹ‹ľm'Íě@˘•j65EŻq€53Ń4 =˜Ĺśh>ŠtٗԱ|ź›0zMŠš~Ěz3Š(Ő^J…QJI$ÄŤ;“ZŔžPIƒxAGuĄRMhD‡Ź›ö9‰ščZ+Ő%ŒjhÔTăܤxüp“šŔ~ę#ŘŐbţ ̉ÝÚÖőRumł˛_žş]ÓÇŰOEŠ*ó>‚ťŤŻjœ&‚Œhđćˆ.żmÜ:ÉŢÝ܂UˇD’(Xśa앳om?°Ľa3ćĹѸhľűƧvěÖŮsOô‚Ç~BKĂ•jXqňwŠËLłÉ(ʐ`[脯$,Š9Ţ“wJť ‚ ŃdB ýŠýŚQ°iîŚ ćŠ‰ş€ÚCĹŠ^ŞĺZípҧŽ6EŘ\{ԖnĈéÔŁžkP^QœĚes5&Ż!zů‘č‡'B\Bćő<°Š^ž9t Ýhщk›ĘcĺĎ Á‚ Ú#Ýw‘ăÄOŢ&#ßKďtőËg'ÁâgŔ˝Tü^P’˘ńR„tä16R;öQ”ÁĎĎ 씇3Ľ:G5‘0yTŰŽ`Rg?’€Ó‘Ÿ,Dę6 ÔĽ…l5Rhbpébmşš{–ˇ˛,5zăąřN ‡#’Ë-P„›K/A“bĽ°<ŠŘ´QŰű”C€Z'l:Š˜ÇmşQ‚˙VąŹqA Ě âčf N!ů=›ŐÚ¤ež€K2RňáðgA‹ŰŒgňŒŚ[!‰;›<˙ 'πB\ů•z.u…ˇâ’á(ɂ™íŃ>ç“0g?•äňŔŚ€ŕń) > ]Š„ÔÚdi<#CĆ1ÂQ”jjłJĽęI8Ł)<…í pLV ݒI/ą-TœŔQ„Ľ–ŞęZ“A†¨ÖÉ^ďą˜źřEŇ;F4Ç%!Óׯž˝źR˘îŠÖ"Dn(OQ˝žôœ4J%ç'ß ™g,jËô•ŞŕŹń ńTR´á„Ăż,{y~ViÔsDľ9‡lV ÷Ÿ?řąçO”LŻ…sEÉW÷|l{śš`wš˜né*ćÓ;ôöĘÉ$F9BŻÄ´­žľżĽľ8Gšˇ41t‹J“–ŹLäI~há b^ň!š ŠdőY.H˘9aßřI$BBůÄŘF‘" çŹĚpfáwŘł‹× X]ż"~™í÷éxă.1ńŃBŠ‚âĺ>˝űcTŘÝ/˝9ÖB€žYLŐ÷EŚžż¸EĘÇŘžF]đß&âÓöEűYÓrű‘]pÓš–Iă¸^Żky+%Œět ErځV˜3šKsřYœ4–' M^I‰ňb^]ěäĐ]­ÜÍ{ć˛i~§cĹŰSüĹVW7LVmutŁ™ âр=rŮŁż R,/~}Ű{tž_ĚGľĹŮZ\Ż]60qĺű!×ĚĹŰĺ˜Sť†-Žȕü‹î–Żţľ|‰ Ń|…eűŁ{ Żđ­élN TŰaÚ ąÝż?%ăߕwɉ\ƒ0_žž>ťÂ )~Č+ě÷ŕk+[lů*űíűœ˘ŮFSŸÝ~f+ާľŻŽŒśžŮŇÉAaÜU—SňätZÔnÂż2â~ˇMŮćOŽűç'ß]^ít1(Đ;ƒx˛ ­ jEĚąĎO~ę_\őIĆý'—ח/ÎŽYÇ"Ľ:&T‘ŤĘ¨ß˙ţěęâěEżĎö˘Ż—÷Wčţŕy˜ÖGÚҋ/ ă§˙dÔ!:Ɇ̰˜Ń˘7ąĂ—§Ż ›ƒ}ąšî>mn?o.ČNÝ9IĐ)hĹ )°m'Ž’œľ%š—§ĎȜçQ –ó˝äͧם~uv.PđRx*.D–˝šV\âôěéÉëŻúO/ŻÎXWuťÂą™MUB ~QÝúî<ÄJVI'H[űăČű:bŹu¸,3•¤/2/oŽ€ÓË2dT!–ç‘„ž7ŰÎé‰.éŤô¨Q!ŢŞ˘QËíkŢľZ˛ó’_|Śł §ő>fH>NŠŞ—11eln::\y; +<"ƒc˘I)ąô—öŸŁŽ8%‚‡k¨´ń0Ŕ,Đ MđZËń2ß=\{! xČOBť’×sá–!çźH’ŽBNGž3ĘÝKŇQ˛tîÍur‡‡RŃU"T\îĽ~đ "˘[|É4(pT-dŠ€\eÝ!Jł}K7QÎw›ÝEŘŁ÷źŘž',ŰĽk‚ŔĐS,őÚW`ćQ`5ëđ­ľuCVAK ę?í?š:;yuÖ#~ă{3&}ÎoY"Z}ž}ĂA“<Ł^ärŸN@=j×NíŁ1ĽůNY˝b&§ĹŤ˘Uł)]äĆč˝{1Ň߅œĆÎdV^]Z/Ŕ/ÁÚé:ŹĆľëŚWüW+`Š7źŠ<­RČĹžŔZŽŹĺO?ýÔc!‰Ď2şéĄ÷Ul”^ž wRýH‘Y{BhlIÓ//Ż_őJ…üăaŮ;ňÔCaé4¨—cßaÇąFoŞœĚ˜‡m/qěĐ+{şö(€čä_M˙ ů ůŞ(’du+–ö(Ů ą{‰ĺěŞ×ÖDńüâ‡ËďĎz˛S`´tÓÂYł,ÝČKmĘÚäé:œRÉĎűôúcá¤5˙{Ž˜őŸ1ë9bçlŒ(\Í$S{ň'­,]ޘ5˙kšg}ĚąƒčrĂąSŰüw{ĎÚÔś’ěgô+ć8řÄ6–-ůÁÄ9—I¨ĺU@˛{ęlĘ%l*lKDzo–ýíˇ3ŇȖ$ŮäÔ˝š[Íôź{ş{ş{.Œ ayĂ*_—ÄŠ×fëĽ Fý´9G.AG„zšxˇÖZ×Mˆžwˆe3=jôŠÉń)8^ĂÔsÜg2žÄcč]Űś{„´5ÖNâ„rÎŽŐÍőÖĆŚ•c‚ËIŞ‡Ć—n\i‘0 ĐWޢ¨€şnŁ^+׀ßhl”kMÉWčNŽž[g0ĺ“p<—wáÍ‘ZÓČ˝ĚîxnŸŁüI$…9†Ú+É80!EteŃ^żíäĎń‹"Ň%ŹF$ţŒŢŁŢ?”ÄDÉ:KPŃ2|đáăGĐKŹ4š)ˇ!˝]Ă. ˇť˙Şü\wwď͇wĺœl`[ä=úxźâąąŞ˛}˛][Š­Âf  ¸C–†^!EŐ}TüPć–$öĹăm<đ˝ô5 ŔŹ!*ˇđ„CüH@;H3#u˙ @Ľo%b. ľN´îĂ@5íp}ˇpÜ:Ś˜•°ŤA5hýÄ"ú%-“‚TŢWĹŃ´kÖé\ĄŐHŘĺĚA×ŮꅅĄ媚¨D•čA—ˆKÁÁDËó+Lb§ƒr(­R›lЏ Ka3)şÍ}Ŕă,ćPü!ľˆ>ĄŃB0ž’["ăĜ××Ս ­ ?ĚĄxĹŇqÓ›ĺ5ö=â&ŐĄ|ócžô^ŐMӘ2otí]x“eę!CNŒ{p7 `Ÿ”ˇPÇĹԔZPŇ­őf$AŤ°ƒîEđ< ÁŚĂ‘Œ°?ńAc§ ŁK]˙´FßľOĹRmÍޒ‘cbťŃŚ&˛œ!K˜WV@°ZÔĹ|MĆf=w0ŕRkť‡\ňҌş‹ŤłT=e'ƚˇj÷˘€l˛WÎ{˘ßE`–Íyw˛Ä˛lUYś˛ěĽi=–'ŽŽŚŐ é…üÂżG_O´*LFÄ]öK4!‹â^˜rŠcž&ŁĹjm‹}CŢŻujj\[lÍnmŘń‰ Ős֙mńÓďŮƒaF’ţ‘é"IH.і$ňÓ÷ƀ;Ža—Ů!:y§šv-ލ!);ľˆÝL)KĎ'Ž‘“ç;…^ů˛|‡…RÝ/­­;…ÂEńŐŤFq­pY,kŃ˝b¤’ ŇKäŐ@jş ”łB¨ \úcĘXë„[%zآb\ ŕQĘbœ˙Ýńůqáž<ăÓJFx­ąV+ łbI.ĄľÂ}3˙—ůż´Ëiž˙×jŹĎŃľőLţ˙cB’ŠKxâDj­jľŞľšĎÔ6V ٗœw.di4Łąů&ƒç¨❡{š&Ů}_üe Ť…ýŁłó탃.şł<Ý>,ŠŐUOŹ€č@mş*ţÚ¤}äu“’Á”z†ćP´šMôë€jFfŕŔ6ŞAJÄkiž–UŹź'Çgű˙ŇťF“ŠŤ,(6zŕűŞşŒ ŢĂ2ĘŹß8á5ĺŻU€ô!§ƒŚ[bŠŽŠ&SXĽî`ƾ冮ƒ}$œ~Ÿ°ť3 Ź¨eŕôŽÉ]R!tu‰ßşţăkĽţ+ňŤ9/˙j8[˙?|ý[$ŠŃ4úl #?Źč˝ÖnÖڍ´˝…Ě+gŔËĄ8Y@ź4Ź]or>҄$ß7ô™ćĘŐÎ`ÇiĂj Ç=Zmńʼn8žd!zô_-nlżŰ; aÚs’WÝč§CÉÇ☥3 ` ‘‹ëÇńhŠ}ĺÜÝóRT˘DB ŇţňűÚŐpßqý7›Ńý_ ťIűżeeë˙'ě˙äښd9ϸ=a¸p{ü%.˛Ŕë‰6Ąąk‰S|RĘěM°•+átÔ œÉ5ŸsűË~> ôT†T—lW`˘VkČ~t¨´_¤źrţ&Ďs{×0_ăkvÎĘVŤŐB>° J;ĽŃ=ó‘Ň9jô‘ßžŠňĺ‚g˝)ŕ`ŞJ]üřZ=sŐRĺinĺ$ÔşŁĐSvƏ]˙tŠă÷(׍štý×ęľšýß^o´˛ű_Hxń‹Tč3^ˆŐý~[[Ůć ý ôNů=ârŽU­fľałm×ńĆΑ×óĹŢ} VĄw}ĂĆmF_bŁ)ě&Äk÷šľŔą‚ťŚtbJqI8 Č˙ Üű‰yAŢłŮO˛ŻçHYFH î\şÎ-Zľ˝éÄZZ鑻ŇPę‚Dr™ ŐT*Ң¨’ÚŒQ|5H;žŽÄbĂdŤČ׼ôӎçŢЀ÷<;bíށw1Fŕ çŔ•TéWŐëĐ0Ž˙~Đ.ăôüĂIwďhűÍÁ^Ç6ŒĂăg{;oßuŇË!ÁpnŐÎĆ3ČkŃ@żě ]‘[UšsâÓŠÁ++=ŢX!QËĘ Ĺœ˙~˛×É!/.=C‚’éńmNt'Đ ş˝k_äŽü ű€ĹžĹŃ,Œ|9^Yě¸ýbł .źőĽB=”‰ű—˝¤¸–ĂPĎlŽ’ůăˆwˇOßur&pqЍÝŃűd‹­U}8>íĺ„ |[]ƒ. GLSÝŁ3?Qŕ•{¸˝‰I[qŸ˙„Œ+źÉB­eâI˜óoĄr+[[0Ć~P|f-oźÁg÷3ë‰k@U*A‘˛.čŹĆűßc—î?3VV-ő“đJVٙLCxÍ_S €R<ѤévĐgŽúoU.ĺ;'™m¸ĄÓ3 úąú[ŚTü}(´Ŕř^”ŔrNŔ&ľ/¤Öń`k(LäQ߸˙Ă.ČŽĚI€Î˛/š F†I€EŠäă‹zŠ‘çl+űoł­  qŁbŠhńćĂţÁnńăéńńůĘˑ˙Ň0ÎŚĂ!@o‹mEB¸c(Iúgw%í 郊qíőš:mÁ 5äm-6źꜶŻ“ăzâj‹3vôž7şőĆţ¨ňIu—OQ3šV[\N‚vľ Ÿv ?Ťx“j0˝@KŔ™A5˙ɍ3˙YöÇönĺę_†Mľ#˛Ű8q&˝k+1KäđœÔžO‹ě8Am>Ňéâ×őů×i,?'mĚ'Mh‡pšf"Í bœh=‘(íšqN×ZŚ™#p’…$ UăděŽÝ?~ŁSëˆL•żýÄOŐË$"Jl ]%‰8ă ÎŘS)ám‹ ô -#ń’%šÍAehjc“فÇÎéˆ6ž‘–D°ń|"ŘČŤ%HÓӈ[$k‹§ŹŃD…9+/´yˆ—Ý­nĽŐŁžtĹ,şâ”Óžę˛Ęö˜œ×ËËC`ŃËĹľË iUE0“ý$+‰âqœéW„CĐŤ­ƒŚĄœÔJĄŻaˇo(ôЏ‹Eń|j#\a#ÔX.˙9‰‘rNîĺĚ _ć⎥áţŠ~CgNżoŇľ č|{ú9 ’—ßD5|e%ť–ŞŠz–¨0u˝ ‰FćJCšHŕí>ޢŽ3Tm8|ĽCŚč ŸxpCŘV<ŇBÝŔČŁEr Ě?ąÇŰ 3°ĺł­=×´çşöÜО›ÚóşöÜҞ7čŮČÓş4ĐšŤßĄË̀e€Ń<úĐ=;ţpşł'VOadOÎťô6‡düŔ ƒž7îä?G+ű!˙™Tń úĄę^X ˝‰kbR̒!cŹyŕďĄäˇZŞüaˇ6>‰ÄÖhC!T•rbçäD=ăĚcĄ°ĚńĽĐ+b o ĐB1W=ÉDb ădűü}‡\ť: Çü´ŠąĆRËÚg乎˛J♝c*Ł9@ăŠNŕţąçë€ć…žíůœÉ[ žĐú(_¨ŽŻxŤŢ|>Ý{ŕĄŔÝń% ›řągôígéÉ]fÓđşŸ8’)Šľ{Qœ€˝(c|Ő^ţ3“DĆXĎđR¤źJĎj\ýËƒĺľ ˝‚ďqzQ5×J,ěžń”™“ŘľţÇN¤•ÂŤo|$‡O‡éaj÷ ŽR'6a zs™d!% hwźj#\‹áůóɔţú+ŕą) Ó4€hđÓ^šßř=Šň¨×—ďţ)l­ü9RĂ4‘ů Y•Đ&ľüG›_č’$Yc¤5i(ŃD<|pďOG‰FZó|d}§¸@•ĚńXO§ô$@R=Ƀ5œkł‘§MŸ8g2Ě2Î'ú(ń2ŻÝ[ý'ă#B4?ż°ŚŤ1xb˛ž‘žçđVŹbĎGoP† Šţ˛;xtá1iÄäŐŇž’*Ź"­h'ľ:OĄ•¸x"A–”žŢä•3ÚřŠ Ýď.Ľ˜adxUI Ć2Šóľ2âĚǛdwůFÂąxâď˙Až-ôďčÂQřÚ0Ĺ.ëô%E*E˘LK]̔ę*Ў%Ąé8?łC˙ÖíÇp‘ 1pЀx† IuVôú(VŠŘ˙hw-ŠűéđÂßC4Ì\qya8……s§î`SîŕĘbôéö!˘žýމJöGăôzţ¸Ž×ńFDń/äb°Q™@çzň–;žż‹'•bK¤ë96ÄÂßÇÂWîřo$NŽ˝ t×˝@uŰÂő„˜n„WéS\Ĺ_ĄĂ=Ťn‘0B4uÂ'ßoT2“Ňw¨áĘwZ AˆÓ§bĽ…Y4 śî=€1ވż9#÷6źńfâՍÓO%T݌˝H˙ź˛Ť“4%&OM­gφÚPu+™.ôxi’ź†žŹpH!Gć4žEJ§GÉĄ şç@c^͝Éř*ä­h”î|UBŞ“N7Ż…ęü59% ěr+œ^ѽпŔW úuĎ ‹šĐc—w3ŕ˜DLYUŢůŠ6ĹTM`Mú\(ô‰)$ ýRgFŁůvěq7żj4˝!-Ÿá Ţ1ύçË´öYXQĆŔ9;ę35{vݞ¨‘%Łő•ĺQ§ď3éu˛…,d! YČB˛…,d! YČB˛…,d! YČB˛…,d! YČB˛…,d! Yxjř_TŤPŘČgpm-1.20.4/patches/done/old/imps2autodetect010060000017500001750000000154730760216311400174170ustar00niconico00From - Fri Jul 27 00:24:34 2001 Return-Path: Delivered-To: nico@schottelius.org Received: (qmail 18456 invoked by uid 0); 4 Jul 2001 10:24:59 -0000 Received: from dns.pcsystems.de (HELO pcsystems.de) (217.89.38.234) by dns.schottelius.org with SMTP; 4 Jul 2001 10:24:59 -0000 Received: (qmail 23917 invoked by uid 577); 4 Jul 2001 10:18:19 -0000 Delivered-To: nicos@pcsystems.de Received: (qmail 23914 invoked by uid 0); 4 Jul 2001 10:18:18 -0000 Received: from unknown (HELO morgana.systemy.it) (194.20.140.51) by dns.pcsystems.de with SMTP; 4 Jul 2001 10:18:18 -0000 Received: (from rubini@localhost) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) id MAA15398 for nicos@pcsystems.de; Wed, 4 Jul 2001 12:21:26 +0200 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id TAA21587 for ; Fri, 29 Jun 2001 19:29:57 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 29 Jun 2001 19:29:58 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id SAA13158 for ; Fri, 29 Jun 2001 18:28:04 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105] (may be forged)) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id QAA15187 for ; Fri, 29 Jun 2001 16:26:32 GMT Received: from gateway.riverstone.com (unknown [206.31.85.126]) by spock.linux.it (Postfix) with ESMTP id 7CA5E196B9 for ; Fri, 29 Jun 2001 18:26:28 +0200 (CEST) Received: from ozemail.com.au (IDENT:steveb@ganges.riverstone.com [192.168.1.2]) by gateway.riverstone.com (8.9.3/8.8.7) with ESMTP id LAA28233 for ; Fri, 29 Jun 2001 11:22:12 -0500 Sender: rubini@gnu.systemy.it Message-ID: <3B3CABF1.D82BC05D@ozemail.com.au> Date: Fri, 29 Jun 2001 11:25:21 -0500 From: Steve Bennett X-Mailer: Mozilla 4.61 [en] (X11; U; Linux 2.2.17-14smp i686) X-Accept-Language: en MIME-Version: 1.0 To: rubini@linux.it Subject: Patch for gpm Content-Type: multipart/mixed; boundary="------------335CB4A2F62766DD7699430A" X-Mozilla-Status: 8001 X-Mozilla-Status2: 00000000 X-UIDL: 994242300.18459.suppe This is a multi-part message in MIME format. --------------335CB4A2F62766DD7699430A Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi, Are you the maintainer for gpm? I have a patch which you may be interested in including in the next version. I use a laptop which has a builtin touchpad which emulates a standard PS/2 mouse, but when I'm not on the road, I use an Intellimouse PS/2 mouse. The problem is that I have to reconfigure the mouse each time I switch. With this patch, gpm mouse type "imps2" will auto-detect whether the type is imps2 or ps2. The patch is against an older version (1.17.9), but I could update it to be against the latest version if necessary. Cheers, Steve -- Steve Bennett Email: msteveb@ozemail.com.au Web: http://members.ozemail.com.au/~msteveb/ --------------335CB4A2F62766DD7699430A Content-Type: text/plain; charset=us-ascii; name="gpm-imps2-detect.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="gpm-imps2-detect.patch" diff -u gpm-1.17.9/mice.c --- gpm-1.17.9/mice.c.orig +++ gpm-1.17.9/mice.c Mon Jun 25 13:17:49 2001 @@ -57,6 +57,7 @@ #include /* MAJOR */ #include +#include #ifdef HAVE_LINUX_JOYSTICK_H #include @@ -1147,17 +1148,109 @@ return type; } -/* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ -static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +#define AUX_SEND_ID 0xF2 +#define AUX_ID_ERROR -1 +#define AUX_ID_PS2 0 +#define AUX_ID_IMPS2 3 + +/* + * Sends the SEND_ID command to the mouse. + * Return one of AUX_ID_... + */ +static int read_mouse_id(int fd) { - static unsigned char s1[] = { 243, 200, 243, 100, 243, 80, }; - static unsigned char s2[] = { 246, 230, 244, 243, 100, 232, 3, }; - write (fd, s1, sizeof (s1)); - usleep (30000); - write (fd, s2, sizeof (s2)); + unsigned char c = AUX_SEND_ID; + unsigned char id; + + write(fd, &c, 1); + read(fd, &c, 1); + if (c != AUX_ACK) { + return(-1); + } + read(fd, &id, 1); + +#ifdef DEBUG + fprintf(stderr, "Returning mouse id %d (ack=%d)\n", id, c); +#endif + + return(id); +} + +static int write_to_mouse(int fd, unsigned char *data, size_t len) +{ + int i; + int error = 0; + for (i = 0; i < len; i++) { + unsigned char c; + write(fd, &data[i], 1); + read(fd, &c, 1); +#ifdef DEBUG + fprintf(stderr, "Wrote: %02X, Read: %02X\n", data[i], c); +#endif + if (c != AUX_ACK) { + error++; + } + } usleep (30000); tcflush (fd, TCIFLUSH); - return type; + return(error); +} + +/* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ +static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +{ + int i; + int id; + static unsigned char basic_init[] = { AUX_ENABLE_DEV, AUX_SET_SAMPLE, 100 }; + static unsigned char imps2_init[] = { AUX_SET_SAMPLE, 200, AUX_SET_SAMPLE, 100, AUX_SET_SAMPLE, 80, }; + static unsigned char ps2_init[] = { AUX_SET_SCALE11, AUX_ENABLE_DEV, AUX_SET_SAMPLE, 100, AUX_SET_RES, 3, }; + + /* Do a basic init in case the mouse is confused */ + write_to_mouse(fd, basic_init, sizeof (basic_init)); + + /* Now try again and make sure we have a PS/2 mouse */ + if (write_to_mouse(fd, basic_init, sizeof (basic_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed init"); + return(NULL); + } + + /* Now try to switch to 3 button mode */ + if (write_to_mouse(fd, imps2_init, sizeof (imps2_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed (3 button) init"); + return(NULL); + } + + /* Now read the mouse id */ + id = read_mouse_id(fd); + if (id == AUX_ID_ERROR) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed to read id"); + return(NULL); + } + + /* And do the real initialisation */ + if (write_to_mouse(fd, ps2_init, sizeof (ps2_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed setup"); + return(NULL); + } + + if (id == AUX_ID_IMPS2) { + /* Really an intellipoint, so initialise 3 button mode (4 byte packets) */ + gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected intellimouse PS/2"); + + return type; + } + if (id == AUX_ID_PS2) { + gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected standard PS/2"); + for (type=mice; type->fun; type++) { + if (strcmp(type->name, "ps2") == 0) { + return(type); + } + } + /* ps2 was not found!!! */ + return(NULL); + } + gpm_debug_log(LOG_ERR, "imps2: Auto-detected unknown mouse type"); + return(NULL); } static Gpm_Type *I_twid(int fd, unsigned short flags, struct Gpm_Type *type) --------------335CB4A2F62766DD7699430A-- gpm-1.20.4/patches/done/old/imps2autodetect.gz010060000017500001750000000051630760216311400200310ustar00niconico00‹Kx<imps2autodetect­XkwÚHý<úϙ]HčÁSŽ3Ć'Ě`Çě${ź9!5Đc!iĽVfŽ÷ˇoUKźž$3ąc§éGUÝ[ŽöE.@…‹˜Ă/Šf tÝ6ëśUS× ĺ-i¨×Ž˜Űđ"N'<ŕ§ł Ւe"ŘbŠqńRé1Ÿb1óԛІ€ťáiâÎC!p>M´0žĄ—áφŇ÷Áh×MŕÁ§đžy0YBĘ=ĐËÇPĎ Aĺ`HSPuüڒ1%Ť˝ Ń"7ł#Ń<Ľ×ýá؞*CÉ4ZZťŁYmÍ´ęeH,\Ěatysýuä(LŤc´Š(­ÖŁm+)űt%§ŰVVS˙2Y¤¤}˜Ź4¸‡ çhˆŔŮr"2etꚩkF]×ĆS;?IÓaÝ%Š<?t&˘Źü€˛÷€R[CWŐ˛ß=6áNP{uu[„{Ůí ŤÓV~˜†ń֎á=óŞ;V™śiŘf*şšĎČÚ(íƒ;Ăli:~żÝVIQŸ8"łoş]Óh´[™ŮŤ Ęĺ˝<ŚĚŤ‚ŮAŤƒÜęŽmvěFë°ŐQIƒŚL¸sŠ ľŽ5ľ:\żšśŤ€Rƒ™ĎT/ŁňÓ ŰpŮÝő­o?0wˇ<ŚţąLąƒŚřÂďýśŠ$Đˇ˛ŰvϤŞm›m[ŻŚ*‰B÷^óy~ÎĚŢý|×45ŁŐŇ ÍĐĄ´p–0adÁŒyĺĚí‡Đo`´‹0ţE!j}ý MŒPŰ2áŐĺů3G°gŠĹT.Lsqş´Jć;Soj–Ąľša6óP-¾ƀžňĎE[[çÝFßč4Ď:ťÖŽ>Ĺ7šŰÎř†Ň9Lšhtř;ُ$K5'…Ҡ׿şą‘‚OlrŠ9cIFú˘ŮF_˜9Ч Ż’Ž­ľŠˆ†˜imÓ˛žVÓ6L,[ ŒŸ <Űpđ–S.Y’83ŚzxZgÖy÷ěÂĐzmóě\oôNwa㝈ěĂ*X–r•Ș #"ÎX0!ŕĹ"'Ť(ňƒz‰ÉÂËđwîű`îpÇ ß†q ˇÇ0$ź`jÜŞQOđfťYĆÓ]×e‘P‡čƒ‘ŘŔĺrpŮWß!Ĺ< l04]Ą;ŠŔ2J'ż1W؀}€;—Y:‹ĘyőfĄ´Eę 9ą¨-řgć+0 ÓŔsâĺɑşőeYółzןhš­fł×k5;şĽw`L G¤‰ męAŠÓŚ zţ…kˇƒŢĐaÖMKÇ„EGKŇ(bŠr3ç ŕ?'łN%ó`‘yďS řgáMQŐŻ1ł€Z°Ď˘ůŽÁ;qÂÄIš¨NâržŮ;A2eąÚÜĐĂrlCk‚ź*ŻyUQş1ƒe˜‚˜3@‡XźbůgesăÁH˛˙0çř›ä% O`7Aă$¸~J:č‰ ĐBř”šXCaiB˛|'a” ›;DŃ$ĺČ Sw9^žČ: fڑ‡ęÁő¨f*‹EUń˜Ŕ,€Á?„ÂLo:xçúp­ô}.Éó ‡Ü̙ĹáÄg r•˜;rČ"„˜ša0ĺłI’ÉóĚAĂ_0ܙ`pçšňžŞ ‡KžŞD^ž] Ťŕˆ/˘Ä<ÂŞáűŕ¤"T=&0ŞÉx”Kńr'OšĐřŸFqÄrö)˜fč ěTčcĹX‘‹-&Ö)gœ Ŕ S߃4ň>ŔZŒp&LY'u’Řľw€OŃ[.…gźD­çs† UEÖăSŮŠJŸĘ&ŢÁzĄźgćBDv­ś`‹ Óv7Őţ—Ž)Šňýk@ŕ,ŘÉşB•”ćœk’ĚŁ/&Čj˝ÇńZK¸UŠX˜ʞb5üsůŠÇ§S5Ľ`P3÷`yrń6!´űłřŕ3ĽRŠě/ýp‰’…ź†e-ťŢÉI§§ 6ZUl4ńw NOPŕÇ,źe´vďąOcĄÍ_Bí96łżźy Ďkśąĺ$ÄÍJĽ¸šcZ§5Šaęą)źîžë‡ƒŤŰă_Ţü{t38˙uüz_đo!Ţe[™Hń#*RŃ`ž•˝UJŠUĚڍp=ug,p˘:¸öÓńđŠX2P+źŠcŠx>KG•P"Lą@¤AÂgÖŽdbqžúÎ,ŠbĽ‰SLÍÍ1˛§ŒŒ bt>tí¨Őz ž0wW˝q˙í[daî­\L„ úŢÂŕR.YJEŠÔž+xÔ$2SWĘ0o„sy]Ž4š7{*cőcNW25M.֔JNÁŽ™ăĺÉ1÷r"đÁő‡˘äŰÖŹPJAbÜ}„řĚşUĽ˜Ťf#c=jăŕńřićZ@OXňX}GŠeVÁZ yˆ9–Źů'1đ‡˙ÎS)1Ęešž&>c”,ş„Ë{GĚ­#&Š@Á ­Ůňá;ˆ MKÁRî?\46“Fç°z–\x– îž˙ZFF+°钚ď{ÜŔ˝\ĺ›Ě¨^˙ěömšF1zgZJ–ů¸ G™érÍ.l;ň ä¸÷'?yĺ˙GU q.‰űc‡O3 šÜŁ…GšŰ  p,Â,$öCŇń/'Łu,ë&ƒ„GŰůńj„fâĽuşœĄ˘ÄĺGŕđ‚Žá RY3SpĘq6ťĹ8i˝ă×bžČÚŢŢÇ!ľĂ?éć‡*&ŠăecIŘZĹk$ćI‡B†łRÉmzĚÜ ű‰Súi2ĎBóć|p1ź˝Îbv§ÖmÜ$…Ż=ő7Ş_ĺ;Wż—iňDÖOœ„ťcěäEžýÄc˙Ş{6ě{ýwŐ<oĆŁîĺő°/+€§äIӋňśĎËĘt@čţd^ŻžŇô”žóî°oŐŻ˛™|Ű­J›LFth/¤~—čRC­˛ë$Ű&öyÔxâГž„bš’÷6o ŢfŽ\Ţ(ź @ÄËŹw”Ą˛pî$ÔÖ>°Uƒżi‹s”A/匾ÎědĆ›¤łąÎJĂ7ŻčrŹćý°˝­tJďKORr´Éw™WˇĂáş|@á]˜5á4˛¨ůĹ;ŠôžcO›šż Ł´2ĽüMˆ¨ŔmÂĘ˙88)\ÝSosóĐňÉN÷ń×-—ď´‚{_ctŁÉËÚ<ĺK°ÜńyâPżüç.ŘwŔwŁiôEű÷¨“]ŘZkú*Ç÷—ôÚĘËpâ 7HY!ěJu˜,˝ŮÜ{&’rNÂ!Wo°cîo€t7/C™ …WëŃ*Š÷oÇƒxśŃ|Ťö÷öšJyŤ“Öz˜KԗÓ4Ȇ[×{fŢ&î"*eŰ轄ęč%\&+ő­Ík/Éëćx5ý¸uÉJĐřŕ$ňą?Ľżń<{ölÍđ!G1zvaŻţžšyꕎďç\ś|œŔ+V<ŹŰęoźażň Œ/qEů?ˆţ?;gpm-1.20.4/patches/done/old/imps2autodetect.patch010060000017500001750000000070570760216311400205140ustar00niconico00diff -u gpm-1.17.9/mice.c --- gpm-1.17.9/mice.c.orig +++ gpm-1.17.9/mice.c Mon Jun 25 13:17:49 2001 @@ -57,6 +57,7 @@ #include /* MAJOR */ #include +#include #ifdef HAVE_LINUX_JOYSTICK_H #include @@ -1147,17 +1148,109 @@ return type; } -/* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ -static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +#define AUX_SEND_ID 0xF2 +#define AUX_ID_ERROR -1 +#define AUX_ID_PS2 0 +#define AUX_ID_IMPS2 3 + +/* + * Sends the SEND_ID command to the mouse. + * Return one of AUX_ID_... + */ +static int read_mouse_id(int fd) { - static unsigned char s1[] = { 243, 200, 243, 100, 243, 80, }; - static unsigned char s2[] = { 246, 230, 244, 243, 100, 232, 3, }; - write (fd, s1, sizeof (s1)); - usleep (30000); - write (fd, s2, sizeof (s2)); + unsigned char c = AUX_SEND_ID; + unsigned char id; + + write(fd, &c, 1); + read(fd, &c, 1); + if (c != AUX_ACK) { + return(-1); + } + read(fd, &id, 1); + +#ifdef DEBUG + fprintf(stderr, "Returning mouse id %d (ack=%d)\n", id, c); +#endif + + return(id); +} + +static int write_to_mouse(int fd, unsigned char *data, size_t len) +{ + int i; + int error = 0; + for (i = 0; i < len; i++) { + unsigned char c; + write(fd, &data[i], 1); + read(fd, &c, 1); +#ifdef DEBUG + fprintf(stderr, "Wrote: %02X, Read: %02X\n", data[i], c); +#endif + if (c != AUX_ACK) { + error++; + } + } usleep (30000); tcflush (fd, TCIFLUSH); - return type; + return(error); +} + +/* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ +static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +{ + int i; + int id; + static unsigned char basic_init[] = { AUX_ENABLE_DEV, AUX_SET_SAMPLE, 100 }; + static unsigned char imps2_init[] = { AUX_SET_SAMPLE, 200, AUX_SET_SAMPLE, 100, AUX_SET_SAMPLE, 80, }; + static unsigned char ps2_init[] = { AUX_SET_SCALE11, AUX_ENABLE_DEV, AUX_SET_SAMPLE, 100, AUX_SET_RES, 3, }; + + /* Do a basic init in case the mouse is confused */ + write_to_mouse(fd, basic_init, sizeof (basic_init)); + + /* Now try again and make sure we have a PS/2 mouse */ + if (write_to_mouse(fd, basic_init, sizeof (basic_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed init"); + return(NULL); + } + + /* Now try to switch to 3 button mode */ + if (write_to_mouse(fd, imps2_init, sizeof (imps2_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed (3 button) init"); + return(NULL); + } + + /* Now read the mouse id */ + id = read_mouse_id(fd); + if (id == AUX_ID_ERROR) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed to read id"); + return(NULL); + } + + /* And do the real initialisation */ + if (write_to_mouse(fd, ps2_init, sizeof (ps2_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed setup"); + return(NULL); + } + + if (id == AUX_ID_IMPS2) { + /* Really an intellipoint, so initialise 3 button mode (4 byte packets) */ + gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected intellimouse PS/2"); + + return type; + } + if (id == AUX_ID_PS2) { + gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected standard PS/2"); + for (type=mice; type->fun; type++) { + if (strcmp(type->name, "ps2") == 0) { + return(type); + } + } + /* ps2 was not found!!! */ + return(NULL); + } + gpm_debug_log(LOG_ERR, "imps2: Auto-detected unknown mouse type"); + return(NULL); } static Gpm_Type *I_twid(int fd, unsigned short flags, struct Gpm_Type *type) gpm-1.20.4/patches/done/old/imps2autodetect.patch.gz010060000017500001750000000024660760216311400211320ustar00niconico00‹Kx<imps2autodetect.patch­WűOŰHţůüW Š8ĹŘy8ĄĽR ĽiĂCz=ő*Ëx×Ég7˛×Mš*˙űÍŽŰyp}"Mö13ß7Ż aAPK`4ÔœşłWßoL˜OëžQŤŐÖWë"b#òŹő­?·7 ‡ÖSpÚÎŢÁî>´šMÇ8:‚ÚÓ=űXřšGGđ„q?L…!ăɗĆ=ĄŸ]Yż„Ćœwß\^ĂNcĂ1úp'źˆŕAĂZݜúŽÚW{ÚB@hŻťďzî qűŢ}sů÷đŚňÖ}˝Žř“xˆ%óďŐeĺ°ăěîŮÎX(<ˇćžö ˘2‰8ȇ)í0GC5t˜qIÐMDSŚq >Ó(f‚Ŕ1ĺpxČłÇ œ4Wa2šSřjąôĐ*œM'î Ş„žË&xżŠ! 6$ąƒ˙ě_Š˜Şącšz?‰CJ§Pm7ńĎ\ťŇ*]iŠ+Ź8äŁ7Ľn8ÁHG"SŹőţ飳Š6EáęCs>lĽŠť'oMdԂ<ĽŤľěÜ|Y#™Uoş˘N{ǡgęP00:A5–„F‘ •4̏ŇŔŁ“°M ęů÷‡ŰÄü‡WlPę|Ľî ć R ™Œ¨šZ+ĽƒčJ‘ŚÄzah:vˆ'˝”VWBH9ƒ†§ŽłÎBB7E„Ü6őJ€r•éŻŔŕ…ş†‚eĺĚŹĽ“Ž–WV?°9Ǜ˜_emoEBŇŘnśŢŰX(IeMXnb‰5ĽćрBŠÓ˛2ŸćiXa=1qIúA˜Äă45oNúݎĂ×iÎ.őş"LZyŠ_č~Öoî~ŽË䑪żób滌3™UżâąwŃ=ôÜÓŢ;;ŤŔwŘ=żôt'P ŕ1}ÚőU}ĺűş3mPşž˜őŤÇ,=fç¤;č9Žý=@ŠĹëŢpŃÚt1b@Ox)= ĚŕřÖsŢҁĹŘęy€"ё„Ő2UŃ+.^ąfš…Á 1=€7ňЖJ•‰wO!N" 3 cď3EŽ†Vf?ľŠ*ŕ'쪚ićՂ/—Đťdä†bT\žŠáˆEŠĂyP6x,DźJIĽ¨w]ˇƒAŢ>W@á,ŒgLúc%ľá.‘ŸJAžŁČ§FąöË0Ş WĚB¤\9ńGápet¤˜ $$i.new; \ + mv $$i.new $$i; \ + done; # why gpmdoc.ps and gpm.ps gpmdoc.ps: gpm.ps diff -Naur gpm-1.19.6/doc/manpager gpm-1.19.6-new/doc/manpager --- gpm-1.19.6/doc/manpager Sun Sep 23 20:00:03 2001 +++ gpm-1.19.6-new/doc/manpager Thu Jan 3 23:37:35 2002 @@ -1,6 +1,5 @@ -#! /usr/bin/gawk -f - -# Warning: this uses gnu-awk features +#! /usr/bin/awk -f +# Copyright (c) 1998-2001 Alessandro Rubini BEGIN {IN=0} @@ -23,18 +22,32 @@ { gsub("^%M ?",""); } -# itz Wed Sep 30 10:28:58 PDT 1998 +# Use gensub for converting tags: itz Sep 30 1998 +# +# However, the gensub function is gawk-specific, and we want things +# to work with original-awk too (for portability). +# Therefore, use a normal gsub, even though it's a subobptimal solution +# as it may step in extra braces. The good solution will be piping to sed, +# or match, extract subesxpression, replace, reinsert -- bleah... +# (ARub, Oct 10 2000) /@b\{/ { - $0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + #$0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + gsub("@b\{","\\fB"); + gsub("\}","\\fP"); +} + +/@var\{/ { + #$0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); + gsub("@var\{","\\fB"); + gsub("\}","\\fP"); } /@(samp|code|file)\{/ { - $0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + #$0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + gsub("@(samp|code|file)\{",""); + gsub("\}",""); } -/@var\{/ { - $0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); -} /@xref\{.*\}\./ { gsub(/@xref\{.*\}\./,""); @@ -55,6 +68,7 @@ } /^@table/ { TABLE=1; } +/^@itemize/ { TABLE=1; next} /^@item/ { gsub("^@item *",""); @@ -63,6 +77,7 @@ } /^@end table/ {TABLE=0} +/^@end itemize/ {TABLE=0} # discard other texinfo commands @@ -78,9 +93,10 @@ gsub("\\%","%"); } + # remove leading blanks -/^[ \t]/ {gsub("^[ \t]*","");} +/^[ \t]/ {gsub("^[ \t]","");} # put a .LP at blank lines diff -Naur gpm-1.19.6/doc/mktxt gpm-1.19.6-new/doc/mktxt --- gpm-1.19.6/doc/mktxt Sun Sep 23 20:00:03 2001 +++ gpm-1.19.6-new/doc/mktxt Thu Jan 3 20:08:31 2002 @@ -1,6 +1,6 @@ -#! /usr/bin/gawk -f +#! /usr/bin/awk -f -# Warning: this may use gnu-awk features +# This shouldn't contain any gawk specific features anymore # Program to create ascii from info; # Missing: table of contents @@ -29,7 +29,7 @@ NODELINE==5 { printf "\t\t\t\t"; NODELINE=0} -/^* Menu:$/ { KEEP=0 } +/^\*\ Menu:$/ { KEEP=0 } gpm-1.20.4/patches/done/old/patch-awk-only-nonmakefile010060000017500001750000000045640760216311400214260ustar00niconico00diff -Naur gpm-1.19.6/doc/manpager gpm-1.19.6-new/doc/manpager --- gpm-1.19.6/doc/manpager Sun Sep 23 20:00:03 2001 +++ gpm-1.19.6-new/doc/manpager Thu Jan 3 23:37:35 2002 @@ -1,6 +1,5 @@ -#! /usr/bin/gawk -f - -# Warning: this uses gnu-awk features +#! /usr/bin/awk -f +# Copyright (c) 1998-2001 Alessandro Rubini BEGIN {IN=0} @@ -23,18 +22,32 @@ { gsub("^%M ?",""); } -# itz Wed Sep 30 10:28:58 PDT 1998 +# Use gensub for converting tags: itz Sep 30 1998 +# +# However, the gensub function is gawk-specific, and we want things +# to work with original-awk too (for portability). +# Therefore, use a normal gsub, even though it's a subobptimal solution +# as it may step in extra braces. The good solution will be piping to sed, +# or match, extract subesxpression, replace, reinsert -- bleah... +# (ARub, Oct 10 2000) /@b\{/ { - $0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + #$0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + gsub("@b\{","\\fB"); + gsub("\}","\\fP"); +} + +/@var\{/ { + #$0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); + gsub("@var\{","\\fB"); + gsub("\}","\\fP"); } /@(samp|code|file)\{/ { - $0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + #$0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + gsub("@(samp|code|file)\{",""); + gsub("\}",""); } -/@var\{/ { - $0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); -} /@xref\{.*\}\./ { gsub(/@xref\{.*\}\./,""); @@ -55,6 +68,7 @@ } /^@table/ { TABLE=1; } +/^@itemize/ { TABLE=1; next} /^@item/ { gsub("^@item *",""); @@ -63,6 +77,7 @@ } /^@end table/ {TABLE=0} +/^@end itemize/ {TABLE=0} # discard other texinfo commands @@ -78,9 +93,10 @@ gsub("\\%","%"); } + # remove leading blanks -/^[ \t]/ {gsub("^[ \t]*","");} +/^[ \t]/ {gsub("^[ \t]","");} # put a .LP at blank lines diff -Naur gpm-1.19.6/doc/mktxt gpm-1.19.6-new/doc/mktxt --- gpm-1.19.6/doc/mktxt Sun Sep 23 20:00:03 2001 +++ gpm-1.19.6-new/doc/mktxt Thu Jan 3 20:08:31 2002 @@ -1,6 +1,6 @@ -#! /usr/bin/gawk -f +#! /usr/bin/awk -f -# Warning: this may use gnu-awk features +# This shouldn't contain any gawk specific features anymore # Program to create ascii from info; # Missing: table of contents @@ -29,7 +29,7 @@ NODELINE==5 { printf "\t\t\t\t"; NODELINE=0} -/^* Menu:$/ { KEEP=0 } +/^\*\ Menu:$/ { KEEP=0 } gpm-1.20.4/patches/done/old/patch-awk-only-nonmakefile.gz010060000017500001750000000021430760216311400220340ustar00niconico00‹Kx<patch-awk-only-nonmakefileUmSŰFţlýŠ­ ƒ$Ë/c0f˜OK ēĐɇ(LĎŇYžAžÓčNâřżw÷dŒ‰!mj|ťĎ˝gc1™€Ŋ’l桭ŁĆAŤ(˜1™ą„ožű’ĎŸŮß÷_ĂU>>ň Úh7űMü§‡fËq]÷GA+×Óţ`ý;ýÎażÓ%`Ű Ŕoyŕśź. Žżó …΃ąAÂćˇŕOáËĽIĚTh(4אČÂ'— gŚČšvÜMô ěîŔ[•=ä"™¨Euhő|b §)ךÉ8WđĄ@ˆpŔłáoçW°8ż:i.ń7lwźVÜvŰ봉$zU`őY@˘‹q­zł{ żV˝jľ~ „CĆÂ|…O<śë4ĄŐěˇ{ýnFďŽ- ˘ö—ćp‰!`˘rˆ”źăšÁ:Á°D÷mŒG| !ÔďjÎŃĎĂ^<Á Ą$`w¨qžÎx$&"ňK„9‡9“†ş'ęs•ßÂ\˜)(쏐,ľý4JAčd*7l,Raę Â\OyÎŃÂ=zŔ@Ş|ĆRې“ÄŞHŚH|OŁĎŐ83‚œ´J bH˜F˜ąĐËř˝ÉŒsqÝ D(ŻAH3MaĚ!™mÍcb!Ń3ŃÔ+cD†˛r}ŸáHh„zó,Ÿô ¤Ćů8ĺlÚhŘşj§¨€÷ˆm5i2›u‚Á8\°p|€7M8YuşfĎkŸo–_Üz¸ <¨†ř™œ…aË>Œp œÇŘůżŔrŞ€‡äôě<\–§#{şÇuÜ`pÇň’đvbkÚN}ţƒÔňŻÉ“őŞŚŮ,űИ›ˆ”×_iÝśŰ3V‡a{ďőţý$zUÉ6Şź¨ß•T–CwwŁ•[üçNúšÇ+.űá2lPHXeýÎR ˝évIzŢĄU›JeiÝ đ2Ś_Wö ŤÄkń|‚ľvmčŘJĹŹěWŸČtˆĚáᎪ˛&´(ł5K&dZły2!nbĄ#–Ç Pťr0ü^ȉBá›á˛ˆőJq{޸G¨ťÍUÖŐ{ w‘ÚŽ}S%—bć|Śî8ŕ…ŽIĆ)“ˇÚžČ›Ďš/AeąŞĎţ\•gš–öuG6Ý˝,íŹ0(g‹0S&€THNYâ×î­š7/.F2ź¸jÉđó{Ö˘6—,BzýNkkÉźşd_ڝ°˝xI˛Iú_Ř˝(Úč Q˙ÓXîZf†Ą˛3ů`7¸řEĐë9Ŕň<†Ś.Ӂ(ˇC á‚B?–aŘĄZ53ˇ…gÇçÇoO>n;ŕ,żĆ@6h c& –ńŇń›^ƒ?„ œ gVŽŰxI7T%¨‰-•2AdÍ]Áu°OĎAĆüĺc5ŃÜ7\ŁŃ!ƀ4řmÁä66|ëđjë3|ŮŮ Ă ~%E€|VÖ㛙€ţW’üNšÓŃ,Ȣ¸ ĐÎB7jŃŕق™Ÿó‰+]śZ*3]ăăDÂG^ŕEăÇ­V}×ĎÖÉÜńq‘töăÎî˘H"oÜČŰĽ ńׁp˘Ë°/dXߞăŁ>ąR ™Ĺ`FB2Ž!“ŸL†œ™IÉľă.{×Îî:üފťRd#Ít˘ƒƒŽO¨á8çZ#™Ľ‚tDö듷§çpz~ÔzŔwŘîxQÜvŰë´m;Ѐús™žô›kW›gđۚˇśś}䇈…ů ÔYÄX§Q+nwăÝ.\źš´ ÚߚCĆ%†*šTÉ^<'–éŘƘůW.äő‡šr´ó‹…űDŚF( Čç낧b(RĎÖ˔ÔICěɌ˜Ł`ŞĘk˜ 3…üÉr˧Q š§PĽa}‘ sˇĎ列5ÜŁR•c–[<@L¨I6Bŕ[X¨€rŐ/Œ #­ň !¤@LŁvęhƒÇĂF㡌dĐ/YŠ F‰ Sj0wB˜y}…(,=ŠšĘŁXtĚL:ňŞ8Ç0+ס–„FWJ^ä—„ÔH0`‘÷sÎFA`ĎŐ<ţ@ ľ¨2[8^Â^?šáŢń6ZpT3Ý´ňć竇/îvňz°–ŕgř:I"űpea8.Ŕú˙uŹŞŠPHFäÉC%˝°Ňp\Ç {7ŹŹŻ&śŞŐÔ§/¤ś.?L˜ˆŤŚfăâ[Şü­†íg¨[5{„ęŸ$io=ĎßOz×'YőŞőť#UÇĄŢ]˘rĺ˙™IĆĚ-śLrě$I@!ĄÎúŚ@ófw—&â^w'M›FăÁşęa3ć<œOžËă×ďNŽ"8.j…ácńľÖ/i%śĹ,لóŮľ4Çę)f `gmfŻC`ö÷WŔpœ*s@÷UśV…„Ts4 •]eĄSV@áě*Áđ[ťěS5Će1ĐőÄÝďzŕŕÜmŐYë{J6ÚŚ˝Š ‰K1K>V7°Ą4ú9“×Ú^äŐgH̗°q_ŸĎžÖÇłX+ýœ‘eł™•…]L ŽłŕÝ0S%€\HNY^X¸×ô›ĺŠĹHŠ'W-)~~ĎZŻĺ%‹.ݸ­,Ů˝g—ěSťV/lýOě^Úh qţçšeh™†“É;ť‘`ś‘ćN¤ă6Šă‹Re%ÓlOK4ÁŁS!`XŞ1P™’Ő™ŔŠnńPńÚD\]-ëúÉiżŠrÎßż9ywz~rt´KMQ”Bš!öŹŠţÖU…RŃěŔ—“x#$—żNN.ŽZU%;ɓŞ ‚áQĽ gpm-1.20.4/patches/done/old/securitypatch004070000017500001750000000000001076632743500171745ustar00niconico00gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-immunix-owl-tmp.diff010060000017500001750000000065760760216311400245000ustar00niconico00diff -ur gpm-1.19.3.orig/README gpm-1.19.3/README --- gpm-1.19.3.orig/README Tue Jul 18 16:39:11 2000 +++ gpm-1.19.3/README Sat Jan 6 10:31:18 2001 @@ -159,9 +159,9 @@ better "ldd /usr/sbin/gpm"). And the compiler messages, obviously. * When a program hangs or segfaults, please reinvoke the program under strace: - strace -tf -o /tmp/trace.gpm gpm -t msc + strace -tf -o /var/run/trace.gpm gpm -t msc ^^^^^^^^^^ put your true cmdline here. -Then send me /tmp/trace.gpm* (they may be one or two files, according +Then send me /var/run/trace.gpm* (they may be one or two files, according to the strace version), and a description of how you reproduce the problem. The last resort is a core dump, but I'll ask it personally if I have real diff -ur gpm-1.19.3.orig/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.orig/doc/doc.gpm Tue Jul 18 16:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Sat Jan 6 10:32:15 2001 @@ -2012,7 +2012,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" @} button 3 @{ diff -ur gpm-1.19.3.orig/doc/gpm.info gpm-1.19.3/doc/gpm.info --- gpm-1.19.3.orig/doc/gpm.info Tue Jul 18 17:21:19 2000 +++ gpm-1.19.3/doc/gpm.info Sat Jan 6 10:32:22 2001 @@ -1626,7 +1626,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" } button 3 { diff -ur gpm-1.19.3.orig/doc/gpmdoc.ps gpm-1.19.3/doc/gpmdoc.ps --- gpm-1.19.3.orig/doc/gpmdoc.ps Tue Jul 18 17:21:19 2000 +++ gpm-1.19.3/doc/gpmdoc.ps Sat Jan 6 10:32:32 2001 @@ -3466,7 +3466,7 @@ 2190 y("")477 b(f.nop)430 2294 y("load:)46 b(")191 b(f.load)430 2398 y("free:")237 b(f.free)430 2501 y("---------")45 b(f.nop)430 2605 y("disk)h(usage")g(f.bgcmd)94 b("du)47 -b(|)g(sort)g(-rn)g(>)g(/tmp/du")334 2709 y(})334 2916 +b(|)g(sort)g(-rn)g(>)g(/var/run/du")334 2709 y(})334 2916 y(button)g(3)g({)430 3020 y(name)g("jump")430 3228 y(foreground)e (black)430 3332 y(background)g(red)430 3435 y(border)h(bright)g(yellow) 430 3539 y(head)h(bright)f(yellow)430 3747 y("tty1")94 diff -ur gpm-1.19.3.orig/doc/gpmdoc.txt gpm-1.19.3/doc/gpmdoc.txt --- gpm-1.19.3.orig/doc/gpmdoc.txt Tue Jul 18 17:21:19 2000 +++ gpm-1.19.3/doc/gpmdoc.txt Sat Jan 6 10:32:41 2001 @@ -1589,7 +1589,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" } button 3 { diff -ur gpm-1.19.3.orig/gpn.c gpm-1.19.3/gpn.c --- gpm-1.19.3.orig/gpn.c Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/gpn.c Sat Jan 6 10:30:20 2001 @@ -223,13 +223,17 @@ static void check_uniqueness(void) { - static char tmp_pidfile [] = GPM_NODE_DIR "gpmXXXXXX"; + static char tmp_pidfile [64]; + int fd; FILE* fp = 0; - if (!mktemp(tmp_pidfile + strlen(GPM_NODE_DIR))) { - oops("mktemp()"); + tmp_pidfile[0]; + strncat (tmp_pidfile, GPM_NODE_DIR "gpmXXXXXX", sizeof(tmp_pidfile) - 1); + + if ((fd = mkstemp(tmp_pidfile)) == -1) { + oops("mkstemp()"); } /*if*/ - if ((fp = fopen(tmp_pidfile,"w")) != NULL) { + if ((fp = fdopen(fd,"w")) != NULL) { fprintf(fp,"%d\n",getpid()); fclose(fp); } else if (getuid()) { gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-immunix-owl-tmp.diff.gz010060000017500001750000000024160760216311400251040ustar00niconico00‹Kx<gpm-1.19.3-immunix-owl-tmp.diffĺWmoŰ6ţ\ýŠŤ€aRlŮzłťH‘I‡i7t6 ËY˘d͒¨‘”3/Íߑ”Ĺ/m˛Ż˘0ş{îx|ž#Ľ$yš‚Ó0ČęŇńŢt (ËłáÇó7gďĎ;ćÖb8ŽsüâSCŕ]S€w ŢxLgžžëşFŻ×ŰÍôâçHŔť¨ƒçÎo†q÷ŒÓSpźŃ´?…žNO ˜!łH6œ ů<݆˜Ő´oŞĂ@LË:/WÎŁŒđ>Đů*§ /Ö 8‚_¤‚jF3•°ˆŞŒeŔI–FM!0¤.HÄ 0’W+ş$*óßT Śç‚E1™Î ý8y¤0e=T––&(ylôś‘Ťˆ YSíGÓŽ?î/¨kŠB †*ÄeRäad`8Ÿä’9AŽJ˛UâX¸ş5”Ń)ŠAȅ¸Ą"ČEǔ%y•˝ÇivęF*T‘ÚR˛"Œç´˛‚É#HY^ ´MaAoäÚP!iâ{Ać)•ŞXᔠČ9fÁÉ$MY÷aŽě\|_ń%äjœVQQŹ!Oá›`%ĺŽ #9´!Ë{#ÔŚ—;ć˝[ŁăßÚaĐ6üÎţčĆlmć6‰ďz~˝v”Űp‡Đ(™)$ČeM!3eDŤ|PVgs™h­hm8hLrdŠ‘ŰGZçv“´6đťŤŕľî٤1ŢÓC6=#ĂŕôNJ‡Ň”9€ÓŰŻ“śA^Ľt›Šý ýŔ#ţ'3œéAţďƒvđýÎ)5öÇR€vÔ¨kż ÚľW íÚ§‡ö<_”gĹ=RF]wíŘ÷:}[&Ůť5ßèv|M(xŽRmԎTAGŞ +ŠÚQJĺ{S֖iÚádsK1n‡ ž? ĽG‰h‡ctšś7őH% Óc ӂÚ~ łČGfäzŇ˙ ŞŽŒÇ3Ý‘„H™ě…Ľ…˛3Ť•ĘĆ:pî¤Á gn}A—” żĆ{#ş!řwŠ ďôĂÔ˝CaÍ„â“ÖáޡŞćŔő%oUT´™âkj‡ďK>RüryŮćěŕ&ť8˝ąj†Ě§î›ß%żWf?#S[śŽqA9AŔŚ,Rŕ?rD6 ‰Éţî:ť~ gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-owl-gpm-root.diff010060000017500001750000000342120760216311400237440ustar00niconico00diff -urN gpm-1.19.3.orig/Makefile.in gpm-1.19.3/Makefile.in --- gpm-1.19.3.orig/Makefile.in Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/Makefile.in Tue Jun 26 02:33:16 2001 @@ -50,7 +50,7 @@ # Main portion: regular build rules -GSRC = gpm.c gpn.c mice.c special.c twiddler.c synaptics.c +GSRC = closeall.c gpm.c gpn.c mice.c special.c twiddler.c synaptics.c GOBJ = $(GSRC:.c=.o) debuglog.o @@ -112,6 +112,7 @@ mouse-test: mice.o twiddler.o synaptics.o $(PROG): libgpm.a +gpm-root: closeall.o libgpm.so.@abi_full@: $(PICS) $(CC) @SOLDFLAGS@libgpm.so.@abi_lev@ \ diff -urN gpm-1.19.3.orig/closeall.c gpm-1.19.3/closeall.c --- gpm-1.19.3.orig/closeall.c Thu Jan 1 03:00:00 1970 +++ gpm-1.19.3/closeall.c Tue Jun 26 02:33:16 2001 @@ -0,0 +1,27 @@ +#include +#include + +#ifdef __linux__ +#include +#endif + +int close_all(void) +{ + int fd, max; + + max = sysconf(_SC_OPEN_MAX); + if (max <= 0) + return -1; + +#ifdef __linux__ + if (max < NR_OPEN) + max = NR_OPEN; +#endif + + for (fd = 3; fd < max; fd++) { + if (close(fd) && errno != EBADF) + return -1; + } + + return 0; +} diff -urN gpm-1.19.3.orig/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.orig/doc/doc.gpm Tue Jul 18 16:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Tue Jun 26 03:57:17 2001 @@ -133,7 +133,6 @@ As of release 0.96, a default-handler is released with gpm, and can be used to handle Control-Mouse events to draw menus on the screen. -The @code{gpm-root} program, however, needs kernel 1.1.73 or newer. @xref{gpm-root}. Release 1.00 has been an incompatible one (is is incompatible with @@ -1940,17 +1939,9 @@ The program @code{gpm-root} is designed to handle Control-Mouse events to draw menus on the background of the current tty. The actual menus -are described by a configuration file in the user's home directory. - -Please note that @code{gpm-root} needs to run with Linux 1.1.73 or -newer, because previous kernels lack some screen handling capabilities -required by the program. +are described by the configuration file, @file{/etc/gpm-root.conf}. The program uses the files @file{/dev/vcs*} to draw to the console screen. -These are available only from kernel 1.1.81 onward. If you miss those -device nodes, you should create them using @code{create_vcs} in the -distribution directory. The tool won't run with kernels older than 1.1.81, -because they lacked a full screen dump/restore capability. Available command line options are the following: @@ -1961,14 +1952,6 @@ Allowed strings are @samp{shift}, @samp{anyAlt}, @samp{leftAlt}, @samp{rightAlt}, @samp{control}. -@item -u - Deny using user-specific configuration files. With this - option on, only @file{/etc/gpm-root.conf} will be used as a source - of configuration information. This option - is intended for those system administrators who fear security could - be broken by this daemon. Things should be sufficiently secure, but - if you find a hole please tell me about it. - @item -D Do not automatically enter background operation when started, and log messages to the standard error stream, not the syslog @@ -2167,9 +2150,8 @@ %M .SH BUGS -Known bugs have been fixed. In particular, if you invoke @code{gpm-root} -right after @code{gpm}, it will delay a few seconds before trying to connect -to the daemon. +Anyone with access to the console may cause @code{gpm-root} to run any of +the commands given in @file{/etc/gpm-root.conf} as root. @ignore .SH AUTHOR @@ -2179,7 +2161,6 @@ .nf /dev/gpmctl The socket used to connect to gpm. /etc/gpm-root.conf The default configuration file. -$(HOME)/.gpm-root The user configuration file. /dev/vcs* Virtual Console Screens .fi diff -urN gpm-1.19.3.orig/gpm-root.c gpm-1.19.3/gpm-root.c --- gpm-1.19.3.orig/gpm-root.c Wed Apr 19 09:53:38 2000 +++ gpm-1.19.3/gpm-root.c Tue Jun 26 02:33:16 2001 @@ -1,3 +1,4 @@ +#error This should be re-generated from the .y file. /* A Bison parser, made from gpm-root.y by GNU Bison version 1.25 diff -urN gpm-1.19.3.orig/gpm-root.conf gpm-1.19.3/gpm-root.conf --- gpm-1.19.3.orig/gpm-root.conf Tue Jan 18 00:21:00 2000 +++ gpm-1.19.3/gpm-root.conf Tue Jun 26 02:36:27 2001 @@ -18,7 +18,7 @@ "tty 8" f.jptty "8" "" f.nop "more of them..." { - + "tty 9" f.jptty "9" "tty 10" f.jptty "10" "tty 11" f.jptty "11" @@ -33,7 +33,6 @@ "tty 17" f.jptty "17" } } - } button 2 { @@ -47,12 +46,10 @@ "%b %d %Y" f.time "%H:%M" f.time "" f.nop - "load: " f.load + "load: " f.load "free:" f.free "" f.nop - "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" - "print mail headers to tty" f.bgcmd - "grep '^From ' /var/spool/mail/$USER | tail" + "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" } button 3 { diff -urN gpm-1.19.3.orig/gpm-root.y gpm-1.19.3/gpm-root.y --- gpm-1.19.3.orig/gpm-root.y Wed Apr 19 09:48:41 2000 +++ gpm-1.19.3/gpm-root.y Tue Jun 26 06:47:19 2001 @@ -64,6 +64,8 @@ #define VCS_MAJOR 7 #endif +extern int close_all(void); + #define MAX_NR_USER_CONSOLES 63 /* needs __KERNEL__ */ #include "gpmInt.h" /* itz Thu Aug 13 14:10:26 PDT 1998 @@ -78,6 +80,7 @@ #include "wd.h" /* when debugging macros */ #define USER_CFG ".gpm-root" +#undef USER_CFG #define SYSTEM_CFG SYSCONFDIR "/gpm-root.conf" #define DEFAULT_FORE 7 @@ -117,7 +120,9 @@ /* provide defaults */ int opt_mod = 4; /* control */ int opt_buf = 0; /* ask the kernel about it */ +#ifdef USER_CFG int opt_user = 1; /* allow user cfg files */ +#endif @@ -134,7 +139,7 @@ typedef struct Draw { short width; /* length of longest item */ short height; /* the number of items */ - short uid; /* owner */ + int uid; /* owner */ short buttons; /* which button */ short fore,back,bord,head; /* colors */ char *title; /* name */ @@ -321,10 +326,18 @@ cfglineno++; } if (s[i]=='\\') s[i]=getc(cfgfile); + if (i>=sizeof(s)-1) + { + yyerror("line too long"); + if (s[i]!='\n') + while ((c=getc(cfgfile))!='\n' && c!=EOF); + cfglineno++; + break; + } + i++; } - /* get '"' as '\"' */ - while (s[i++]!='\"' && s[i-2] !='\\') + while (s[i-1]!='\"' && (i < 2 || s[i-2]!='\\')) ; s[i-1]=0; yylval.string=(char *)strdup(s); return T_STRING; @@ -342,7 +355,17 @@ } /* get a single word and convert it */ do - s[i++]=c; + { + if (i>=sizeof(s)-1) + { + yyerror("line too long"); + if (s[i]!='\n') + while ((c=getc(cfgfile))!='\n' && c!=EOF); + cfglineno++; + break; + } + s[i++]=c; + } while (isalnum(c=getc(cfgfile)) || c=='.'); ungetc(c,cfgfile); s[i]=0; @@ -447,9 +470,10 @@ /*====================================================================*/ void f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + if (setgid(pass->pw_gid) < 0 || + initgroups(pass->pw_name, pass->pw_gid) < 0 || + setuid(pass->pw_uid) < 0) + exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); @@ -525,7 +549,6 @@ /*---------------------------------------------------------------------*/ int f_bgcmd(int mode, DrawItem *self, int uid) { - int i; struct passwd *pass; switch (mode) @@ -545,10 +568,11 @@ if (!pass) exit(1); f__fix(pass); /* setgid(), setuid(), setenv(), ... */ close(0); close(1); close(2); - open("/dev/null",O_RDONLY); /* stdin */ - open("/dev/tty0",O_WRONLY); /* stdout */ - dup(1); /* stderr */ - for (i=3;iarg,(char *)NULL); exit(1); /* shouldn't happen */ @@ -683,22 +707,17 @@ FILE *f; double l1,l2,l3; - l1=l2=l3=0.0; - switch (mode) { case F_CREATE: /* modify name, just to fake its length */ - self->clientdata=malloc(strlen(self->name)+20); - self->name=realloc(self->name,strlen(self->name)+20); - strcpy(self->clientdata,self->name); - strcat(self->clientdata," %5.2f %5.2f %5.2f"); - sprintf(self->name,self->clientdata,l1,l2,l3); - break; + /* XXX: no failure checks */ + self->clientdata=strdup(self->name); + self->name=realloc(self->name,strlen(self->name)+3*20); case F_POST: if (!(f=fopen("/proc/loadavg","r"))) return 1; fscanf(f,"%lf %lf %lf",&l1,&l2,&l3); - sprintf(self->name,self->clientdata,l1,l2,l3); + sprintf(self->name,"%s %5.2f %5.2f %5.2f",self->clientdata,l1,l2,l3); fclose(f); case F_INVOKE: @@ -714,23 +733,19 @@ long l1,l2; char s[80]; - l1=l2=0; switch (mode) { case F_CREATE: /* modify name, just to fake its length */ - self->clientdata=malloc(strlen(self->name)+30); - self->name=realloc(self->name,strlen(self->name)+30); - strcpy(self->clientdata,self->name); - strcat(self->clientdata," %5.2fM mem + %5.2fM swap"); - sprintf(self->name,self->clientdata,(double)l1,(double)l2); - break; + /* XXX: no failure checks */ + self->clientdata=strdup(self->name); + self->name=realloc(self->name,strlen(self->name)+2*30); case F_POST: if (!(f=fopen("/proc/meminfo","r"))) return 1; - fgets(s,80,f); - fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l1); - fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l2); - sprintf(self->name,self->clientdata, + fgets(s,sizeof(s),f); + fgets(s,sizeof(s),f); sscanf(s,"%*s %*s %*s %ld",&l1); + fgets(s,sizeof(s),f); sscanf(s,"%*s %*s %*s %ld",&l2); + sprintf(self->name,"%s %5.2fM mem + %5.2fM swap",self->clientdata, (double)l1/1024/1024,(double)l2/1024/1024); fclose(f); @@ -751,6 +766,7 @@ { case F_CREATE: /* modify name, just to fake its length */ self->clientdata=self->name; + /* XXX: "format features" */ strftime(s,110,self->clientdata,broken); strcat(s,"1234567890"); /* names can change length */ self->name=(char *)strdup(s); @@ -832,20 +848,25 @@ /* the return value tells whether it has been newly loaded or not */ int getdraw(int uid, int buttons, time_t mtime1, time_t mtime2) { +#ifdef USER_CFG struct passwd *pass; +#endif struct stat buf; Draw *new, *np, *op, *pp; int retval=0; time_t mtime; gpm_debug_log(LOG_DEBUG,"getdraw: %i %i %li %li",uid,buttons,mtime1,mtime2); +#ifdef USER_CFG pass=getpwuid(uid); /* deny personal cfg to root for security reasons */ if (pass==NULL || !uid || !opt_user) { +#endif mtime=mtime2; uid=-1; strcpy(cfgname,SYSTEM_CFG); +#ifdef USER_CFG } else { @@ -853,6 +874,7 @@ strcpy(cfgname,pass->pw_dir); strcat(cfgname,"/" USER_CFG); } +#endif if (stat(cfgname,&buf)==-1) { @@ -926,7 +948,9 @@ "Usage: %s [options]\n",prgname); printf(" Valid options are\n" " -m modifier to use\n" +#ifdef USER_CFG " -u inhibit user configuration files\n" +#endif " -D don't auto-background and run as daemon\n" " -V increase amount of logged messages\n" ); @@ -972,12 +996,18 @@ int opt; gpm_log_daemon = 1; +#ifdef USER_CFG while ((opt = getopt(argc, argv,"m:uDV::")) != -1) +#else + while ((opt = getopt(argc, argv,"m:DV::")) != -1) +#endif { switch (opt) { case 'm': opt_mod=getmask(optarg, tableMod); break; +#ifdef USER_CFG case 'u': opt_user=0; break; +#endif case 'D': gpm_log_daemon = 0; break; case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); @@ -1201,10 +1231,9 @@ int evflag; int recursenow=0; /* not on first iteration */ - prgname=argv[0]; - setuid(0); /* if we're setuid, force it */ + prgname = argv[0] ?: "gpm-root"; - if (getuid()) + if (getuid() != 0 || getuid() != geteuid()) { fprintf(stderr,"%s: Must be root\n", prgname); exit(1); @@ -1285,7 +1314,13 @@ } if (!vc) { - oops("can't open mouse connection"); + fprintf(stderr,"%s: Can't open mouse connection\n",prgname); + exit (1); + } + if (gpm_fd == -2) + { + fprintf(stderr,"%s: Can't run in an xterm or rxvt\n",prgname); + exit(2); } conn.eventMask=~0; /* grab everything away form selection */ diff -urN gpm-1.19.3.orig/special.c gpm-1.19.3/special.c --- gpm-1.19.3.orig/special.c Tue Jan 18 00:34:00 2000 +++ gpm-1.19.3/special.c Tue Jun 26 02:33:16 2001 @@ -38,6 +38,8 @@ #include "gpmInt.h" +extern int close_all(void); + /* * This function is only called at button press, to avoid unnecessary * overhead due to function call at every mouse event @@ -67,7 +69,7 @@ */ int processSpecial(Gpm_Event *event) { - char *command=NULL; int i; + char *command=NULL; FILE *consolef; if ((event->type & GPM_TRIPLE) @@ -151,10 +153,11 @@ case 0: /* child */ close(0); close(1); close(2); - open("/dev/null",O_RDONLY); /* stdin */ - open("/dev/tty0",O_WRONLY); /* stdout */ - dup(1); /* stderr */ - for (i=3;i>˛Ř>LY¨ŃÍd~5Ľ¨zFÁ̈4.Ä%dú~¸@ŚzićĐ=6ułEwÔP+}Ň\¤‚x ĆÉ ˇŚłO|âšńŁŽ~YÁňÔĎú̍Ĺď“|€ąwgÚŇM…'^Œ7’’‘Bł`ŠT@~dˆ„Éőě-Čkđ 8žxE:°FaƒSŹĽšó\Ąç!E.°’8$ؘŹ,DŤ.ÔSÂZLp[Q̜‚]; Ǹ ç֘ńÔéqfŕ çRž€‚C)1ÚĄhIńxÉJŘoĂ2Š X UžM%€ž Ć ć(ęőŒ’,,—ř̢9{ą´ ‡ům.[ŕĂŔĄĐ%Ł%22ˆĂŠ’Ą˜Uz,UOƒ%í"RXśÍ8_‚SÄ.ŁÄúnĄö tE´ÔRU‰@ŔaěáH1kˇýŁÉ‹_$˝ÜM‘⒐á黇oŰ]JmP䦊ľŔ-ˆÝˆĎŽ}ĄT ~<Äřg‹b™žR5€04H8•mńp4ÄĘ?Ţ^_Tk) ZŒ‚ĂVČśČ_ď˝HlçgJŚ÷"¸bÉWs=dwś™“[L óŃ­šfţxď”Ĺé,ÂręÝŢQł×ܞj@>[š˜z“J“–ŹL¤§ˆ8”G‚ˆcR˘ý‘ ŁśLĺƒBќÂ+‡Â8ĺS ‹1;#e‰>‹q.oފɘ)r’´Yk}•ĐHÇ[šÄ_ΐ˘ ý˛XŐ5L*ě>/˝ *ŕqŻQLŐ;"S祥@Ô Ł¸ľÎÄĐ:šx¤Ľöăւp&†Śä×2iœÖj5 kaą„3%şnÖŐ ĎĚúĘ3üY|hŽ>45A´,/˛ęb/Ý֊“ŰZdKâMFżJ´ĨšŇK[mÝl@ľuŹ›őTĎFđ́gż boĘä菽gך’B6Şĺž%eƒki~h9=Đä ý@Šl\ôŔ^Š—~(ź9şˆQťS,ţݡ %: MíЃ“œţ†ż0öŕLËǗr†@0‹¨€žb’†öÉŘ/3%c´1.ű˙óšŒçVtČg˜Čäáďî/îp…h‚ŸŻ k'Y+Ęh˘2žÂ‹–[M}ůy˙YŽ…žV§×2?ď<ËĎÁ‹Ünî9Ç-j7áťÜqŸbŘŚlóýŮýđúô§Űť˝6ĘFę}Äý’6 Öľ"2čëÓ_‡7wC’ńđěöćţöę⎛˘TDŽ*˛ÉKU ‡?_ÜÝ\\ ‡pp(úziEC6ŢqmR°L|!/ţP‡č4ƒŮłŐ31–ĂŰó”Mˇ#˜kwˆšNÚ0ĚŃ.œ %â)hōicŸZvň”Œäĺő%™sśkĄĺ<Ĺ숚Ůăŕţˇű‡‹k‚_Q ŻĎß܁śŐ´âçŻOß]= _ßŢ]@[uŰ"°5ꪄôbý5÷œl‹•¤’N0mNCGđ5hőWeŚ’ô•éŁÄM§×׌[č ´É¨B,Í# D}Cţť÷ç`°˙Çűßǘ3–™EŽMďĺ€{˙bĄ[ćĂŹŹOjJnŇś\ŠÜŠŹ‰ŠËvĄwms‰"eO˛`ż˛m č1ą,—íUš+ˆú ö“ÁĹíëíKŹČjËóCśűŕ§´Ö5FájU°Ź ęńˇŃřžHí—Í łPöŕćýĽ@de•şb%І—ĺҟ[~Mv!ei™üé$3TtTˇřax˙p÷ć沯âAłŐŠŇŃľ‹v™Ů›Vűˆš‘č˛ĺ˜ŕځKÍvÂ\6R$ť ‡ăú˘9n˜âW›áLđűďs†ˇÍčV n‹@21+’R6ň‚C>ŃtMźśŚ“Ń/­hʧŰÜÍťŤŤ L⍋-LŹň)ëQšušzËův˝o{Żß\]Ŕ+,ŮĽcßÔý†î7ÉjѲ}sŕ7~sPŻal56 YmZrŁ NńëáŮÝĹéĂEčÁ9žťsţ™pŃęs­ wPžfÔyn!ů´}ęQ;Vl Ś”ćŰgqnY>&d•jŁ.CdFト)ˆlH˙pŮłey}i˝0eŽoÎŐŕŮQ­áßľ”h2¸+4­cHŞC­îŹ(Ë_ýľ‰Ďó:é™0űWŐÁV鼚P‘“ęwŠŹy „+š~{{˙Đ+ň'ewŕ*ĂÂŇ>¤^Ž5ŁGZ ^ĺdfśmťÜśˇěęÚ3E'˙iúsČs”Čó˘HžQŐPÚ3žEcŸE–’ŤŽ-lˆâÍÍű۟/z˛S`śôF}­ŮÔÍ´ÔŚŹMzW?+¤řďúŸ+žVď˙÷¸Xóßqąć˙‹]Ăwájúƒ/ŹŮ7zZYş Ş"űÚřŻuťĆAó{Ü…Dç[ÜNąébÍË\ďÔuˇ˛c¸ôMŽţr€“ţó=áŸßÖř6mĽ‚K—Č 'Aöçî$ĂIŠ˙~čĆ×E—mĆş…EP Fn™‡f˝ŃoÍw„#zŽč ŽÚ>>ÖóÚöߎ°ËŇ3Ś7 ¤ʙ)ť‚XĹgÚbŽ@ę'ńŃKP:ôöIoĂ\ąJÜՐ á?y‹~gŞńÁ|ÎŇĺ„Ů5ĹšBťĽťQk؋eő†c¤“´C-[1ôX숍ĆA\€yŽŚQ ¨U ŞŰ řQí˘+tW[ˇÚ;:ÎB5sř]Ý"úó@ÓgŃXmu¤D5€÷–ď9ĹëF8ˇˆŢŒ)źÝq#Œ Âň’dOąÉŁëP!ľů nťT ˆ’mE™Lź‘ďşŔ%ć˝gϡ!tÄĺ-şăb.ľP{P\ľHoŕlăô=ź˜łhr´SĂa~l˝$é]^›"ŚXž0ŒÇDŇű/Ť¨Tźęś‶Ű-4ŘŐɉĐBꯈl(I‚ĽŰĘv–.ˇłż”ąŕ´uTÚxŽkÓ^rţž×Ăl‚*`Ńś|*LšúUŔ›°šź?ećŹŇ^/´€?ĺ_Ĺś?ÝďAz:EĄbjńCő1ÄtŮí:İ‘Ľr;­F˘KRtd ÔXÎŕÖlBN?§ébÍÁÖŚżÇéĹţu!€˛9óĄ:€r Ŕ?Ŕ„9vúSuüŤ(ľ›ş’gWĘ D‹Ŕ §< •ýNeIހŹË̓ǂíc,‡u ť6KOń2 (…ţѧŽň|S:‚ĆŞcUI›™é@Öş)ŕwŚŚŻZ„›&_˘éB‰WŽ)Ą;.¸$&X‰L+-)ÎΑ<ĢÍlfÁî1–OćvśŹJ\ĂpĆË&űąč&É˙V‘ŢfB™şóŰH<Ű šJŤ9ÁPÎRÖÇLhhKtĎ}ŞĄšłŸžź.)O\ÂŚó÷)e*ŃÇyźseŃ%Le"JW¤ś&.O_Łç ţ–Ö5ŽŹ]ŠŽ–1]<ka-É@Ś”zIćČLv_fČ˙ßKáćA6¸ő*CötíPłľëĐÄŽ;TMq֏ďéŐÁ-—žâ ĂáĘë@Ţžr“@ n„Ň­SşIˇJÓ<îisJC°Ä!CBFA;@´hB.Ę‚“ˆű$FÂDx„ô•I ýČΟ8ő?NOżł”” EÄ~/%RžDcş 8°io[&ËęŇ ČĄúiżťşőiŢXT×Ý~ž{”nă%ÁĂs¸|{=|¸{óöęBśÄÍ#Ű0)R-ń<‰ľ. {B˙'+Ż(žĐâŢhü~ĄËýĽFńzŁťŘ ţrŻ;+›żŚŮůßÓďţž^÷ˇ÷šówNíŽ6wVvuş•%môšW#÷ÎVˇŞůţʍ:ƒŠ8gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-owl-liblow.diff010060000017500001750000000017000760216311400234640ustar00niconico00diff -ur gpm-1.19.3.orig/liblow.c gpm-1.19.3/liblow.c --- gpm-1.19.3.orig/liblow.c Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/liblow.c Tue Jun 26 06:40:01 2001 @@ -416,7 +416,9 @@ Gpm_Close(); return 0; } - gpm_debug_log(LOG_NOTICE,"Read too few bytes (%i) at %s:%d",count,__FILE__,__LINE__); + if (count != -1) + gpm_debug_log(LOG_NOTICE,"Read too few bytes (%i) at %s:%d", + count,__FILE__,__LINE__); return -1; } #endif @@ -433,10 +435,10 @@ #endif /* * avoid to send the message if there is no data; sometimes it makes - * sense to poll the mouse descriptor any now an then using a + * sense to poll the mouse descriptor every now and then using a * non-blocking descriptor */ - if (count != -1 || errno != EAGAIN) + if (count != -1) gpm_debug_log(LOG_NOTICE,"Read too few bytes (%i) at %s:%d", count,__FILE__,__LINE__); return -1; gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-owl-liblow.diff.gz010060000017500001750000000007120760216311400241050ustar00niconico00‹Kx<gpm-1.19.3-owl-liblow.diffĽRakŰ0ý˙ЎŽ@R[‰Őtٚ2H)YČ)Œ~7J,{˘ś$šĄĐţ÷–¤IÇ5†;Ý˝{§{§\XcQŽkĆ{üŞ7čŤĘ~Ľ–•ŮôVG‰×XÄ;YĐşo$ž7řđá( ?.Ň4â8ţŰŽ@ăbB_ŚŁ”‡Ç`—|˜|FĚĆă‡oşŽłŰĘ8Ůé^Ç­ôŐH‚/Ű:Ô?Ëĺ˛)łĘ”ůÝ4[ÜÝĎn'ÉŮ)rxcPČ –O^:tÚŞ áŃvŁv~–ŹLŁ}’eßfóI–‘3Ÿ-ČĄćń–\čüáĂW0ލâÖű:AŤuşíŰyßE^"|”:WĹVŔÁ á))8řlp—Ý•÷Ď_u:‡x4*\ Ž0đ?%jéœ(eŽŽ–m /ŽáL-˝"”G-¤Ű M\DádŕZ›ŞÚr™†"št+ŤÖŢXýDd˛!ŻŃ8ĽKˆ˝ ˙F"ĽÝÓäoyƒiŁ˝ˇŐCHŠˆţţćlĎϐÖŇČtœÜLof‹îɅ㽠Ç.üM­4ĘŔgpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-doc.diff010060000017500001750000000006740760216311400225620ustar00niconico00diff -ur gpm-1.19.3.orig/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.orig/doc/doc.gpm Tue Jul 18 16:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Tue Jun 26 01:41:26 2001 @@ -1294,7 +1294,7 @@ @item int gpm_hflag Used to signal if a character has been generated by a mouse handler. - @xref{Handling Functions} + @xref{Handling Functions}. @vindex gpm_handler @vindex gpm_data @item Gpm_Handler *gpm_handler; void *gpm_data gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-doc.diff.gz010060000017500001750000000004300760216311400231670ustar00niconico00‹Kx<gpm-1.19.3-rh-doc.diff…OMO„0=oĹ;‹Eʒ]/=éĆłžM—ĐZSĘfńż[<¨M&y_™ŃŚŽÁGćľç"‡t›:ošíŞŠŇˆŻ¸5Ě8çŮ6O#áqě n!veą-c“gYƒ$ů%sńXä;d˘,D›čLJp‘Šë=’ĺ—’Aš@=Œ SŕK[wŞaŘ<¤ÓXŐÁÔP¨ZĺUČŁUND Yň*Ž–Ó[Ôôn(ňVwäS0Žĺɋ§úý8Ć6¸mŒłĂKţ•¤qËłąš.óŽsúOPŤ žyˆóqájĺ¸ĂŮ=C_úO}îńŁźgpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-gpm-root.diff010060000017500001750000000035120760216311400235530ustar00niconico00diff -ur gpm-1.19.3.orig/gpm-root.y gpm-1.19.3/gpm-root.y --- gpm-1.19.3.orig/gpm-root.y Wed Apr 19 09:48:41 2000 +++ gpm-1.19.3/gpm-root.y Tue Jun 26 01:55:18 2001 @@ -50,6 +50,7 @@ #include /* VT_ACTIVATE */ #include /* K_SHIFT */ #include +#include #ifdef HAVE_SYS_SYSMACROS_H #include @@ -623,11 +624,7 @@ case 0: /* child: exec getty */ sprintf(name,"tty%i",vc); -#ifdef __alpha__ - execl("/daemons/getty","getty","38400",name,(char *)NULL); -#else execl("/sbin/mingetty","mingetty",name,(char *)NULL); -#endif __alpha__ exit(1); /* shouldn't happen */ default: @@ -1045,6 +1042,12 @@ static int postcount; static Posted *activemenu; +#if __BYTE_ORDER == __BIG_ENDIAN +#define bigendian 1 +#else +#define bigendian 0 +#endif + Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) { Posted *new; @@ -1062,9 +1065,9 @@ lines=dump[0]; columns=dump[1]; i=(columns*dump[3]+dump[2])*2+1; /* where to get it */ if (i<0) i=1; - new->colorcell=dump[4+i]; + new->colorcell=dump[4+i-bigendian]; gpm_debug_log(LOG_DEBUG,"Colorcell=%02x (at %i,%i = %i)", - new->colorcell,dump[2],dump[3],i); + new->colorcell,dump[2],dump[3],i-bigendian); /* place the box relative to the mouse */ if (!postcount) x -= draw->width/2; else x+=2; @@ -1078,7 +1081,11 @@ new->y=y; new->Y=y+draw->height-1; /* these definitions are dirty hacks, but they help in writing to the screen */ +#if __BYTE_ORDER == __BIG_ENDIAN +#define PUTC(c,f,b) (*(curr++)=((b)<<4)+(f),*(curr++)=(c)) +#else #define PUTC(c,f,b) (*(curr++)=(c),*(curr++)=((b)<<4)+(f)) +#endif #define PUTS(s,f,b) for(curr2=s;*curr2;PUTC(*(curr2++),f,b)) #define GOTO(x,y) (curr=dump+4+2*((y)*columns+(x))) gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-gpm-root.diff.gz010060000017500001750000000017440760216311400241770ustar00niconico00‹Kx<gpm-1.19.3-rh-gpm-root.diff•TýOŁHţYţŠ÷z1ÇŔ`kW‹ťÚUď<ÝŘęĹ\ Ą0”ÉR 0h›ýç÷Ą_ŢíŢeI`†÷ăyŸ÷c&ćIVSÁʜ[΁srpxPT|֕˙UQˆƒĺŽjGŞY–őN{ą†eÎ Ř'ƒŢń ç€kŰśfšć÷÷& ƒß›Ü>ŘÎŕčhŕKG;?ëČŚ}0ńűÎĎ5ř•çQÖÄ N3ž7‹îŤ8HĎ }ş>OFÁýĂĺč|_ţß\ŁťË›áZ``ž3˜ňYŰspP¨Şń-u2QÍÔ61%Q—Ü’˜Â§›[˄Âežă—*â‹vYśK„M*2F4ř*밆ËٛˇŞB߼'˛ ý#\epžYíÇÍźüŰ~ń#kćůJŕźx҄űúJl(ńዩV÷…Žé¨nźĽŹb 9qŔ…jz& óS› „ƒ=@.Ö‚UÄ˛ŹŇ39Ć1¨´6ĺjéŕ ÄlÚĚ‚Ź˜éˇ÷WÁĺčăăí\l\÷mwz(`ŸÓ}>ޤC%÷Ďűˆt•]eI9Qź~ÎgK—xí@byĘ,Œ°<)öžX@ŲPޕʗ”Í‹Ođśdżl’Ŕ,dÇ­ł7‹´ëz § ŚďŽűúáďěëą#ąŠçŇ_zíîŮ_š-LĘř,–łe‡P '§BlfĚ+ź;Ň0úRS˜6Bšá?ËJœ6xŤĐ4Ÿ­S¨ŁŠľgđ'ÎČçÇɅфN Ń =jŞĘ4‰ŻëSrzÚ#Śžş#ŽY&řčď$ٜş]”ą^ŻQ’˘RŽŽ_{†Úx*L ç"ž˛$[˙ŤűÉ˝ž K˘fD™Š6{Śkčú’Ť#dę "ľo'•L2Jgpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-install-no-root.diff010060000017500001750000000007460760216311400250560ustar00niconico00--- gpm-1.19.3/Makefile.in 2000/07/22 06:50:28 1.1 +++ gpm-1.19.3/Makefile.in 2000/07/22 06:50:45 @@ -142,7 +142,7 @@ for i in mev gpm-root; do \ $(INSTALL_PROGRAM) $$i $(bindir)/$$i ;\ done - $(INSTALL_PROGRAM) -o root -m 755 disable-paste $(bindir)/disable-paste + $(INSTALL_PROGRAM) disable-paste $(bindir)/disable-paste # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional # headache in cases like this gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-install-no-root.diff.gz010060000017500001750000000005240760216311400254670ustar00niconico00‹Kx<gpm-1.19.3-rh-install-no-root.diffąnÂ0†çä)~Š@Š“’ŇÂşTHPtčPŠ:° Ž&Ś*o_']Z‰É˛˙űž;c EU˛A4xŒîâĹ^*IíĽI’ÄÉ(NS$÷ă,§ž+óĂ0źf~žƒ †éíáď‘ç>ź˝Š!!5JńŐŮjcěÜŕÝĽ^Л˝l^§óůÇj˝|^O}DĐŰJÍeݏŰۤ-ĺF Ÿ]˜A++1Ę2pŮĐV VQcĹÓżw?źdş…wƒŐr3{C->O˛ ěA &]˜=í§•1śÚÍ]Vö ŇOÔ:>žQG’2ş˜ŕ¤cOšŹPg§#ëFÚĺÄš´ŇhRzÄi纼î¨q%Â1˛ń(ˇƒćgpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-no-ps.diff010060000017500001750000000006050760216311400230430ustar00niconico00--- gpm-1.19.0/doc/Makefile.in.nops Thu Jan 20 22:52:46 2000 +++ gpm-1.19.0/doc/Makefile.in Sun Mar 19 00:37:35 2000 @@ -93,7 +93,7 @@ # Main portion -all: $(srcdir)/gpmdoc.ps $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) +all: $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) $(MANPAGES): $(srcdir)/doc.gpm $(srcdir)/manpager cd $(srcdir) && gawk -f ./manpager doc.gpm gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-no-ps.diff.gz010060000017500001750000000003750760216311400234660ustar00niconico00‹Kx<gpm-1.19.3-rh-no-ps.diffŽËjĂ0E×ÖW\h ŞdŮnŹ•ł(…‚K!ůáWDIČÉçW}ĐşB6ƒćpĎ\1ĆĐšKx’sלŠKľoZÝ7\nŹ˘íîˆWe ¤Š\¤ňiŢBJé9Ú Jĺ‘äBf+™-ž˝˘ËłÇč×, ‚ťŐÎúQ[S}/q˙0řŞÖ~‡ŚĐŔÝ🅦Ö^ĆĆó`š~{_ż"ÎU…gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-owl-socket-mode.diff010060000017500001750000000006550760216311400250250ustar00niconico00--- gpm-1.19.3/gpm.c.orig Tue Jul 18 16:06:06 2000 +++ gpm-1.19.3/gpm.c Sat Jan 6 10:10:41 2001 @@ -1012,8 +1012,9 @@ oops(ctladdr.sun_path); maxfd=max(maxfd,ctlfd); -/* is this a bug in the new kernels? */ - chmod(GPM_NODE_CTL,0777); +/* only allow the console user to access. */ + if (chmod(GPM_NODE_CTL,0600)==-1) + oops(GPM_NODE_CTL); /*....................................... get screen dimensions */ gpm-1.20.4/patches/done/old/securitypatch/gpm-1.19.3-rh-owl-socket-mode.diff.gz010060000017500001750000000005010760216311400254320ustar00niconico00‹Kx<gpm-1.19.3-rh-owl-socket-mode.diffO]KĂ0}^ĹyěÖ&MŚěK†a8Üűˆiúi2š–éż7Š>úŕĺr?¸çÎ%„ :ľ„SžŚ™ФśkŞÉaPŘ |žŘ°˜3Ƣ$I~Q&/˘ÇN`Î6>/y@ó(ĎA8ăót…děkäy„ݰöäbŮkQuƒ9žD_OŻÂšďeąő5§ÔŁĘ"œ"’ÍĐ8ôľ/ŻC…ĆřMÁ¨3ŢTg”vטedÝÚ"žŢŸnďŽ7‡‡”-—KŻ“xkô„Öö<ňĽ5Îj…ÁŠ˝…R9GƒT4%âżäŒMˇ[§ôýŇOÄčٌţ/PŠNvJMŤŒkź­ŕŃ'O­gpm-1.20.4/patches/done/old/securitypatch/gpm.init010070000017500001750000000023241076632743500207240ustar00niconico00#!/bin/sh # $Id: gpm.init,v 1.2 2002/05/28 19:13:55 nico Exp $ # # chkconfig: 2345 85 15 # description: \ # gpm provides mouse support to text-based Linux applications as \ # well as console cut-and-paste operations using the mouse. # # processname: gpm # pidfile: /var/run/gpm.pid # config: /etc/sysconfig/mouse # source function library . /etc/init.d/functions OWL_STARTUP_ENABLE=1 MOUSECFG=/etc/sysconfig/mouse case "$1" in start) if [ -f "$MOUSECFG" ]; then . "$MOUSECFG" else MOUSETYPE="none" fi if [ "$MOUSETYPE" = "none" ]; then echo "Not starting gpm (no mouse is configured)" exit 0 fi if [ "$MOUSETYPE" = "Microsoft" ]; then MOUSETYPE=ms fi if [ -n "$MOUSETYPE" ]; then GPM_ARG="-t $MOUSETYPE" else GPM_ARG="" fi if [ "0$OWL_STARTUP_VERSION" -ge 3 ]; then daemon --pidfile /var/run/gpm.pid --expect-user root \ -- gpm "$GPM_ARG" else daemon gpm "$GPM_ARG" fi ;; stop) if [ "0$OWL_STARTUP_VERSION" -ge 3 ]; then killproc --pidfile /var/run/gpm.pid --expect-user root gpm else killproc gpm fi ;; restart|reload) $0 stop $0 start ;; status) status --pidfile /var/run/gpm.pid --expect-user root gpm ;; *) echo "Usage: gpm {start|stop|restart|status}" exit 1 esac exit $? gpm-1.20.4/patches/done/old/securitypatch/gpm.init.gz010070000017500001750000000011551076632743500213440ustar00niconico00‹óÖó<gpm.initS]oÓ0}ŽĹ%ÍE¤i:*N*¨T“śśÚ:bhr§ľ–Ú‘í”NŒ˙Îu’ś ¤ńfßă{Κn˝ˆ–BFfMZœ'X囎ÂžŢBÜéAŻŰíEÝ~Ô;…ří >ôű S0Ţ同ąő=S2ŤôNŢôá´qă 7L‹Ü %pKZRCŽŐV UŚČsĽ-X–ďl¸¤†'p!dąšç™`Ôĺ Ś¤řγ̝QШŒ+lHećÔX*çş~_!W`ןę”NQœqc$Ýđ˛PI*2źF[Ş#]ČČ5ŁŽ°şŞˆ[™SÝŁ’ nTĄ‡´Ě‰B&–šęŇŠ2\;I´‡ !łĎw׋ŃŐâf~7žŽŢ_Œ‡1!—ł›ëń‡“áßuśü öAHb,ŐśM<‘ÂWSŒďł}řvćę•Äó:Í8ńx†<žWF_ćăĄ/•䤂ÔTő{‡ú0„ęAƒ‘łľŞ,”\oÝ4_JUR˜ş]…ćIŰw);aĄű/‘KÁ´2*ľMĽŁËi&‡ňiţ1c2żź]M†~hĄńâP÷Zq7hŽăÓřęú|6ő!\q8i°'”opśaXoĘ‹‚ßĺœŮű A+lŇ-&zaXöČjGG5çď(šóÎÎpĆ*o?Óĺ˝Č2ˇÝĎôéţŔŢԁ˘ Ö^4/çý¨yŚh‚Ž‚.8őĄÚ2ľ…A¸:ü dy…Ő˘ÝşŞž(ü¨ 8ŃÇ˝›Jĺ§k¨[˛˜pC!ĺ%xG~DąDĎÔgpm-1.20.4/patches/done/old/securitypatch/gpm.spec010060000017500001750000000116100760216311400206730ustar00niconico00# $Id: gpm.spec,v 1.2 2002/05/28 19:13:55 nico Exp $ # this defines the library version that this package builds. %define LIBVER 1.18.0 %define BUILD_GPM_ROOT 'no' Summary: A mouse server for the Linux console. Name: gpm Version: 1.19.3 Release: 8owl License: GPL Group: System Environment/Daemons Source0: ftp://ftp.systemy.it/pub/develop/%{name}-%{version}.tar.gz Source1: gpm.init Patch0: gpm-1.19.3-rh-install-no-root.diff Patch1: gpm-1.19.3-rh-no-ps.diff Patch2: gpm-1.19.3-rh-doc.diff Patch3: gpm-1.19.3-rh-owl-socket-mode.diff Patch4: gpm-1.19.3-rh-gpm-root.diff Patch5: gpm-1.19.3-owl-gpm-root.diff Patch6: gpm-1.19.3-immunix-owl-tmp.diff Patch7: gpm-1.19.3-owl-liblow.diff Patch8: gpm-1.19.3-owl-warnings.diff Prereq: /sbin/chkconfig /sbin/ldconfig /sbin/install-info /etc/rc.d/init.d BuildRequires: bison BuildRoot: /var/rpm-buildroot/%{name}-root %description gpm provides mouse support to text-based Linux applications as well as console cut-and-paste operations using the mouse. %package devel Requires: %{name} = %{version}-%{release} Summary: Libraries and header files for developing mouse driven programs. Group: Development/Libraries %description devel The gpm-devel package contains the libraries and header files needed for the development of mouse driven programs for the console. %if "%{BUILD_GPM_ROOT}"=="'yes'" %package root Requires: %{name} = %{version}-%{release} Summary: A mouse server add-on which draws pop-up menus on the console. Group: System Environment/Daemons %description root The gpm-root program allows pop-up menus to appear on a text console at the click of a mouse button. %endif %prep %setup -q %patch0 -p1 %patch1 -p1 %patch2 -p1 %patch3 -p1 %patch4 -p1 %patch5 -p1 %patch6 -p1 %patch7 -p1 %patch8 -p1 %build autoconf CFLAGS="-D_GNU_SOURCE $RPM_OPT_FLAGS" \ lispdir=%{buildroot}%{_datadir}/emacs/site-lisp \ %configure rm gpm-root.c doc/*.[178] doc/gpm.info make CFLAGS="" CPPFLAGS="" %install rm -rf %{buildroot} mkdir -p %{buildroot}%{_sysconfdir} PATH=/sbin:/usr/sbin:$PATH mkdir -p %{buildroot}%{_datadir}/emacs/site-lisp %makeinstall lispdir=%{buildroot}%{_datadir}/emacs/site-lisp install -m 644 doc/gpm-root.1 %{buildroot}%{_mandir}/man1 install -m 644 gpm-root.conf %{buildroot}%{_sysconfdir} install -s -m 755 hltest %{buildroot}%{_bindir} make t-mouse.el t-mouse.elc cp t-mouse.el* %{buildroot}%{_datadir}/emacs/site-lisp pushd %{buildroot} chmod +x .%{_libdir}/libgpm.so.%{LIBVER} ln -sf libgpm.so.%{LIBVER} .%{_libdir}/libgpm.so gzip -9nf .%{_infodir}/gpm.info* popd mkdir -p %{buildroot}%{_sysconfdir}/rc.d/init.d install -m 755 $RPM_SOURCE_DIR/gpm.init %{buildroot}%{_sysconfdir}/rc.d/init.d/gpm %clean rm -rf %{buildroot} %pre rm -f /var/run/gpm.restart if [ $1 -ge 2 ]; then /etc/rc.d/init.d/gpm status && touch /var/run/gpm.restart || : /etc/rc.d/init.d/gpm stop || : fi %post if [ $1 -eq 1 ]; then /sbin/chkconfig --add gpm fi if [ -f /var/run/gpm.restart ]; then /etc/rc.d/init.d/gpm start fi rm -f /var/run/gpm.restart /sbin/ldconfig /sbin/install-info %{_infodir}/gpm.info.gz %{_infodir}/dir %preun if [ $1 -eq 0 ]; then /sbin/install-info %{_infodir}/gpm.info.gz --delete %{_infodir}/dir /etc/rc.d/init.d/gpm stop || : /sbin/chkconfig --del gpm fi %postun /sbin/ldconfig %files %defattr(-,root,root) %{_bindir}/mev %{_bindir}/hltest /usr/sbin/gpm %{_datadir}/emacs/site-lisp/t-mouse.el %{_datadir}/emacs/site-lisp/t-mouse.elc %{_infodir}/gpm.info* %{_mandir}/man1/mev.1* %{_mandir}/man8/gpm.8* %{_libdir}/libgpm.so.%{LIBVER} %config %{_sysconfdir}/rc.d/init.d/gpm %files devel %defattr(-,root,root) %{_includedir}/* %{_libdir}/libgpm.a %{_libdir}/libgpm.so %if "%{BUILD_GPM_ROOT}"=="'yes'" %files root %defattr(-,root,root) %config %{_sysconfdir}/gpm-root.conf %{_bindir}/gpm-root %{_mandir}/man1/gpm-root.1* %endif %changelog * Wed Jun 27 2001 Solar Designer - Disabled packaging gpm-root by default. * Tue Jun 26 2001 Solar Designer - Moved gpm-root to a separate subpackage. - Disabled support for ~/.gpm-root because of too many security issues with this feature, updated the documentation accordingly. - Fixed many gpm-root reliability bugs including the format string bug reported by Colin Phipps to Debian (http://bugs.debian.org/102031) and several other bugs which were about as bad. * Sun May 27 2001 Alexandr D. Kanevskiy - hack to avoid double use of $RPM_OPT_FLAGS * Sat Jan 06 2001 Solar Designer - Updated the patches for fail-closeness in many cases. - Re-generate gpm-root.c at build time, to avoid maintaining two patches. - /tmp fixes in the documentation (don't suggest bad practices). - More startup script cleanups. - Restart after package upgrades in an owl-startup compatible way. * Fri Jan 05 2001 Alexandr D. Kanevskiy - import mktemp patch from Immunix, fix strncpy * Sun Dec 24 2000 Alexandr D. Kanevskiy - import from RH gpm-1.20.4/patches/done/old/securitypatch/gpm.spec.gz010060000017500001750000000036720760216311400213230ustar00niconico00‹óÖó<gpm.specX_WŰ8FŸâ† -[Űq€BłĂœmKŰa–N9@gfçp[NtbKŽ$'döłď•d'ŽZÚ"ÉW÷˙˝ú]~€łtă˛uɒg3ˆĂ úýAÔ?ŒÇżĆűĂĂC<‘đ涄B~3áR–qÁ4nä|¤¨ZŔŒ)ÍĽŔ3j„—PČJ3ĐLĄ$ȤrŇĎš¨n!‘B˜…ä7Z0gůÝŤ3Dłâá>šd9Ł?ËyNÎy„ݽť8'Ę!\-´aź3ޤ(˜0Ń)e˛&W˛R ë!3ĺ0Šđo¨ő"ä&*ŤQ”˛ËeőîŞpôîj܇†ŞpüWÍ#ö.ç‚rAM2靃Ŕk¨IŔ…64Ď!%Ľ Sžež4î’"IŠ[ƒ.A*“ÖçýîgôD e2e&(dĘZ¤]Rťë¨s¸Fcym zžFċ˘üÖ›˘lŃ}Ć ó*—óÉńg$sŞăĆŠ)öi‘q%“)fEĆÇő>Oל—šČ$DĚ$‘BWE6.aJ^ٌ˝dŸ*ޘˆk)ęC4ĘŠ*ăRŰšź źÝ›Ó:Qź4˜ľ†RÉÇĂ&‹Ť˛” ëD‚aˇ&ajŚu2Ó˛ĚyBíU TÜĺ9ţ’:É!ŠL@E”3dÉTM[it†Ť '$D5štéIVŐÚ ŹsVů"š_•ÝšŤnŽŠŁH˜0šÚâă9ŘŹÓŢĘő†ĽŠĎ˜°ćŽ-°čëâ:ő„ŽŞ–<×ýT+yúŰ8ťÝ˛‡ ń†bĐZ-gŁR‚ą”Ľ¤iéJ,ČlłŽË^˛ě"¤Ç3ŘîÝ­w¤ű퓓íÝÓťŰ+Çşp‡_;팦i€˜Ox2Aýčť§,ƒŞT˝ŇŕújKĂŻˇŹu×:5ĎÚMc=`ČŽ4ĚJLBF••K]†6˘‰kî¨ ŚčÔş”Ö†Œ*c¤Ŕ&ĎVŁM=ĹJŇÓĚ Űŕ“ő˜ív”q˝Ž[ëAk˝ßZ´Ö‡­őóÖú¨ľ>vkŇsuIhe¤­zňúíůËwW'ŰFóˇ7W>^ž~;—Ů×7îë6ü—lĺ\—)W'˝ťeeß÷înRj(ßGŹ ‰Ž47,°¤öJĎ÷•J1˘ŠĽĂ°ůF{áńŃńŸníű~&IA§ •śáőĹEłś™ç“ĺ¨ ڊbŠJ …ĐQß"Ť„Ր‹—׿œ¸&7Œ*­üjǞ’‚ýřŘÁށ-wţÓö Aśşˇ˝xĂ`űńGěcśÓM áďżařŕ}YúIݒĎ>Aܒ߁A€ÜÁOźęî<`Đ×M@Ł‘Ç\˛kČXł)!‰ŽăďýJŹŮďů(ΞÚ9CTŇń5Oođ$rj<郀vl&=÷čť ‚ŁžĎl>š?OÉŞĚŁ‚ÍÚ[ßȲ=şüüBMGŤ>đH˛„lŽĆNŸłŠ…q÷řŘ]8vÇ_jőË_-<<źzĐW\$y…ŘɲŘ$šnTç1Xɋwäé› Yëúíř5>sçęuŮ[‘dBĹQŕ˜ěÁe˙Z ŮQ7†+™#Ę9eš°Ÿ´Ý˙ g‹qľ˜cÂŁđâgŔ)×t”ăuü,â]bŠŃÂNÄ´Ę bÇ=¸Ž˜ňü[…ź—3–ŽřZ†ईđíĚ0ŞQgŘÖ§%,Šý_Ž”b ľŔ 1š‘Đ? ä•TŠ›p­+,œ97?Ťg ›ŚbĎ *1˝‘­CĎ2Š,¨tóĐ$‘*EĂó…Uŕ-żE2Çv)q.§#ž[ŁjŹÁ'U3– ŠâGm”=A‚uG>čÂ×2ç.&ź,=e#N<™7t[~aęÎBŠĆQÜô÷ă§v S[Ń$JQ^˛‡Ňs Ždeě$5˘Š Đç=],łŕeÎn‘ Ć(„SÁfzĘđӔŚŁ4Á(¸ŘĚ$OŃIĆjWŻcJ' -ţíčs6|l…ÂĄŰzčĘ(σ$—š Ś­}œ0´Ě%ĂgR0—4-<Šz¸' /0ĐK œŤělĺ˘4—(Ë)Â!Ť[ć¤|žOR)v1 ŐxlAúç šž0ý4t ţwďN~Ş˛VŐ?‡43č‹f¨ŞJMR/=çţMQó@× ~Üz|N.šo÷>üŽhň•O1ĹIŞôĆCŚdgţŸĎŹlΊ¤\4ŮsĘXyýď”çD\ţBţ¤Neˆgpm-1.20.4/patches/done/refused004070000017500001750000000000001075432545600151625ustar00niconico00gpm-1.20.4/patches/done/refused/001_logging_000010060000017500001750000000125130760216311400175370ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/debuglog.c gpm-1.19.5/src/debuglog.c --- gpm-1.19.5.orig/src/debuglog.c Sat Sep 15 16:55:06 2001 +++ gpm-1.19.5/src/debuglog.c Thu Oct 4 23:31:24 2001 @@ -43,6 +43,8 @@ #include #include "headers/wd.h" +extern int errno; + #ifndef DEBUG int gpm_debug_level = LOG_NOTICE; @@ -54,6 +56,9 @@ int gpm_log_daemon = 0; +int +gpm_log = 1; + void gpm_debug_log(int level, char* fmt, ...) { @@ -62,10 +67,14 @@ va_start(ap, fmt); #ifdef HAVE_VSYSLOG vsyslog(level | (gpm_log_daemon ? LOG_DAEMON : LOG_USER), fmt, ap); -#else - vfprintf(stderr, fmt, ap); - fputs("\n", stderr); + if (gpm_log) { + vsyslog(level | (gpm_log_daemon ? LOG_DAEMON : LOG_USER), fmt, ap); + } else #endif + { + vfprintf(stderr, fmt, ap); + fputs("\n", stderr); + } va_end(ap); } /*if*/ } @@ -85,13 +94,17 @@ va_start(ap, s); #if(defined(HAVE_VSYSLOG) && defined(HAVE_SYSLOG)) - pri = LOG_ERR | (gpm_log_daemon ? LOG_DAEMON : LOG_USER); - syslog(pri, "oops() invoked from %s(%i)",f, n); - vsyslog(pri, buf, ap); + if (gpm_log) { + pri = LOG_ERR | (gpm_log_daemon ? LOG_DAEMON : LOG_USER); + syslog(pri, "oops() invoked from %s(%i)",f, n); + vsyslog(pri, buf, ap); + } else #endif /* always print to stderr as well */ - fprintf(stderr,"gpm: oops() invoked from %s(%i)\n",f, n); - vfprintf(stderr, s, ap); - fprintf(stderr,": %s\n", strerror(errno)); + { + fprintf(stderr,"gpm: oops() invoked from %s(%i)\n",f, n); + vfprintf(stderr, s, ap); + fprintf(stderr,": %s\n", strerror(errno)); + } va_end(ap); } /*if*/ diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpm.c gpm-1.19.5/src/gpm.c --- gpm-1.19.5.orig/src/gpm.c Thu Oct 4 23:31:29 2001 +++ gpm-1.19.5/src/gpm.c Thu Oct 4 23:31:24 2001 @@ -364,6 +364,7 @@ return data; } gpm_debug_log(LOG_DEBUG,"Error in protocol"); + gpm_debug_log(LOG_DEBUG,"Data %02x",data[0]); return NULL; } @@ -393,6 +394,7 @@ if ((data[1]&(m_type->proto)[2]) != (m_type->proto)[3]) { gpm_debug_log(LOG_NOTICE,"Skipping a data packet (?)"); + gpm_debug_log(LOG_DEBUG,"Bad %02x %02x %02x (%02x)",data[0],data[1],data[2],data[3]); return NULL; } gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x (%02x)",data[0],data[1],data[2],data[3]); diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpn.c gpm-1.19.5/src/gpn.c --- gpm-1.19.5.orig/src/gpn.c Sat Sep 15 16:52:24 2001 +++ gpm-1.19.5/src/gpn.c Thu Oct 4 23:31:24 2001 @@ -178,6 +178,7 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" + " -e output messages to stderr instead of syslog\n" " -V verbosity increase number of logged messages\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); @@ -290,7 +291,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TveV::23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -309,6 +310,8 @@ /* itz Wed Jul 1 18:37:59 PDT 1998 */ /* run as a daemon unless told otherwise */ gpm_log_daemon = 1; + /* Run with logging to syslog unless told otherwise */ + gpm_log = 1; while ((opt = getopt(argc, argv, options)) != -1) { @@ -366,12 +369,14 @@ break; case '2': opt_three=-1; break; case '3': opt_three=1; break; + case 'e': gpm_log=0; break; default: exit(usage("commandline")); } } - openlog(prgname, LOG_PID, gpm_log_daemon ? LOG_DAEMON : LOG_USER); + if (gpm_log) + openlog(prgname, LOG_PID, gpm_log_daemon ? LOG_DAEMON : LOG_USER); check_kill(); loadlut(opt_lut); @@ -444,14 +449,12 @@ /* report should be here and nothing else! */ -#if 1 /* was: "if (!defined(HAVE_SYSLOG) || !defined(HAVE_VSYSLOG))" */ - if (!freopen("/dev/console","w",stderr)) /* the currently current console */ - { - oops("freopen(stderr) failed"); - } -#else - fclose(stderr); -#endif + if (gpm_log) { + fclose(stderr); + } else if (!freopen("/dev/console", "w", stderr)) { + // currently current console + oops("freopen(stderr) failed"); + } if (setsid()<0) oops("setsid()"); if (chdir("/")<0) oops("/"); diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/headers/wd.h gpm-1.19.5/src/headers/wd.h --- gpm-1.19.5.orig/src/headers/wd.h Wed Sep 12 17:07:34 2001 +++ gpm-1.19.5/src/headers/wd.h Thu Oct 4 23:31:24 2001 @@ -41,6 +41,9 @@ extern int gpm_log_daemon; +extern int +gpm_log; + extern void gpm_debug_log(int level, char* fmt, ...); gpm-1.20.4/patches/done/refused/001_logging_000.gz010060000017500001750000000035060760216311400201600ustar00niconico00‹Kx<001_logging_000ŐXësÓ8˙Üü‹Ŕnœ‡ójŁP ĐÇM[¸&ĺ†)Œkˉ§Žĺłä´˝Ň˙ýV˛’:!Ęđ…|ˆőÚŐŽöˇÉƒ*iv •k8r/iFTś=á8K Şçz“b"ŰŰŐ3gg÷\6ÇÉ´ĆÓmŸyՄ:âZč^%eLT=Ůă&͊FžšvŞNˇÚޞ4×xęŐ|z‘#†"ŚWfJ•Jĺ;Ä[WŔ€&ŕ´Áév›Ô;ШםRš\ŢĚyk8Éŕ˝'ZĐh’ŚC­œěŐ+¨´švĘřż Ż^•ŕq{QćSxNÓ4fŐɋ˜1ĄŽOS^ťňŤŁĽ2˝4!Œ¨ő˝RYŽbŸpĐ}úś¤&KRź‘’iэ`ßżżž{Óď)IÚ-)Iťcw•$H–SĄ#߼S#Q˝'ˇ•se=‡ƒŽÚvĆBi66ĺŢj?ꉛnC06TŤUŤˇj×NĂvęPîěŘNKí+3w„†M…é&ś$ązJ+ŠÔŸűűŁƒO_/ć7\î•ëőĚĄ_*MöűG¨Îé bŮš0n‚Ü+iÄiŠ˘řIŠr&xŘéŇ29$™ŕŚń96lȗŕLY΄Ábs ŐScżF>Ĺꔐđ˜Ć>nůčý>›ĺÖ+6K~ˇ8wäm*ľam; śk%œ—śÚmŰNĘݖíě([­ąל2ŃXaL}łh0 ž>…Ľ =nĺG‹ h`öONpTÚ2ú ‘‹ c 7-„ńŒ]R‚”Má 7Ÿ„–a6Äs˘Y‘ę" ŠGśŢ ?/ĽfđP9W€´NŇlÔśÁŽÜ  ˜68¸ŽhZUŁy 4ęB`łL;K§ˇ :žě*ËĚ rŃčKq€ĽŚŠZÖ\‹Ű{¤ţŹT›œŻşÂĂ$ť+€}­‹řżG*”œżĘ‚jpcTłk’XwcîŰDQH{͎Ę6ň“‡’­”Š S™ď OvKG$XI(Ęłd^łž4˘!ÎóXdܛw#Ѳ‡'őĆľa˝ÎęçšĺOKp|zx¸“vWňvUžnvçňÎÊŘ8çOÍéHÜ$´ňB‰c5Î-x´ŤĂÍskÎűvłŠy^śÁe˜$a<W $ŽwI˜/­Qöľë+] ŚüˇĘŰZúüŰĐßć÷ĺGŽř§śýmü(^çGń7ý(ţş†l,źb­Ĺßó#ÔTâR~îqŠ~ŹűrŠXŠY\Ą×!Tć„'˜´:ŽÂgŹ0ŁäłaɄ1F šá* ŒŤŒ+ĂƂrA-š)Ë8ĹhĚŔ‹BÜŻŁŸ­Đçyj†Őmˆ)ԍ}@ŐÎĺ-MBWHX&° )ĺÜS^HraŒŞĄ$,ĐšvĺnŒ‡â&÷ćŘCńń|âlzASIŒ”cĚ4óT‚(đ9č˙1ÚóŚhŤćëýӃź5č˙}Ú?FV˝ƒţáp?oßéÁĂÓĄ˝Âjđf˙PĎö>ĚŰĂOúV^˘7şu4sšŃu´ľóÚޛú–TŞÚvÓą—۰˝™Ş´1Ť!–<^~vžg¸dŸ ňšřä`L&!šŒČ”1’¤ä„NDáě#!ŚĄbÍOr sęŒ`ń‚LT]M„žĚšü6—:Œ{Z~4pď8ý÷ě ..o šŮF?­vgǸłó]ďŞíÔőU dŠ˙ŕ4á_Y8ť¤šCÚ]řp0§ŰݕePž0ÍbYÉ8ŤŠ¸,ŽĐꈊa$&4˝ ůňŻnEŽ:är‚\ŽB1Qȑq[bR!p3Ăň‚aÎI!ěj"ÞiâIá(ş"6ĚܜҨöÜ–J2G'•[\;śÓŮľ[źUĺż ůeď~ēÖxF$ˑ˜¤”îUœŢ†uÍĽu÷ËĘ[ů<Ĺy­Í^ýk&XűťY$HQ éçf&Ě4<6˘ďK4–U Ôĺ€LLje–Đ8Ż„Çą;ĹX#Óχwč})ŋŐ}žK_yRę]Ž.Ă(2-mΈš~” iÎ~ľ;ˇZ-iŸrŤŐ•öĘoT‹4aŠ>a‚傢…ޘ#r$Źdą˙HĄŻŽ¨‡#ÉŽ\NŔZ=Zwǂ/_ŕŃÚ[™e,ŽŠ:HŠ< Ó¨ůtVĂÜĘYDŃĺŽ [_-š‚ź,M1ÄG7óčĺ Ž‡˛e oĚůkf¸vߘߤ™‹ňŔ‹§ćâĆZÉ/9ßş˘­’îHßT¤Ž°Pňć kľÍŞÎ×|Ošĺ‹„ƒSÁCß´ž×-M=1ćŕ—Ëź‰Ś(ŞQXX3~ŸbŠřlľZăç6–NĹE[2œŤ ŞÎŠďćć j‰đŰďpŽz‡sôëWáamőʎüđśxS`züaoa’ă˙ŚšôKgpm-1.20.4/patches/done/refused/gpm-1.19.3-devfs.patch010060000017500001750000000007700760216311400206710ustar00niconico00--- gpm-1.19.3/gpn.c.devfs Sun Jan 28 12:16:19 2001 +++ gpm-1.19.3/gpn.c Sun Jan 28 12:17:07 2001 @@ -440,9 +440,8 @@ #if 1 /* was: "if (!defined(HAVE_SYSLOG) || !defined(HAVE_VSYSLOG))" */ if (!freopen("/dev/console","w",stderr)) /* the currently current console */ - { - oops("freopen(stderr) failed"); - } + if(!freopen("/dev/tty", "w", stderr)) /* Try harder */ + fclose(stderr); /* Yuck, this is bad, but not really a reason to abort */ #else fclose(stderr); #endif gpm-1.20.4/patches/done/refused/gpm-1.19.3-devfs.patch.gz010060000017500001750000000005320760216311400213040ustar00niconico00‹Kx<gpm-1.19.3-devfs.patcheP]OÂ0}Ţ~Ĺąźlě‹!/óÁhŒ‰žLŮZXœíŇv"ţwW`‰bÓ¤çöœ{îɍ˘›ć#Jăt_'›FÄE\˛OŽe+đHĆ3¤ă,˝ÉŇ9ĆŁQęAđŻçR=ÍFӓ:ĎM&ŁpŽŔ>3äš ƒŠ#E2ÄŽę ¤ŤźŤ’ńJ°Ň{¸}˝{[Ž–OĎ÷>ü%^όO0L\ŘsěćŠÉ† $]ţ¤B˚‘ěH¨Mɔň};ĎlŠV)&L˝ďÎrë-ńŐ@ĘF{¤÷?›ÓŞf%ń˝đŰ œŠ_1fOBŘřăEíąĽŞű°3ÇáE-5ëÝVłj‹÷° \itwMËëÖ@HĹhÝŧh)`$čZ*s\ɀ՚6sáj9QVÜýŽŃ6řgpm-1.20.4/patches/done/refused/gpm-1.19.3-noworldwrite.patch010060000017500001750000000016610760216311400223210ustar00niconico00--- gpm-1.19.3/gpn.c.old Mon Feb 5 07:10:04 2001 +++ gpm-1.19.3/gpn.c Mon Feb 5 07:52:32 2001 @@ -223,11 +223,16 @@ static void check_uniqueness(void) { - static char tmp_pidfile [] = GPM_NODE_DIR "gpmXXXXXX"; + char *tmp_pidfile; FILE* fp = 0; - if (!mktemp(tmp_pidfile + strlen(GPM_NODE_DIR))) { - oops("mktemp()"); + umask(022); /* make sure file will not be world-writable */ + + tmp_pidfile=(char *)malloc(strlen(GPM_NODE_DIR) + strlen("/gpmXXXXXX") +1); + strcpy(tmp_pidfile, GPM_NODE_DIR); + strcat(tmp_pidfile, "/gpmXXXXXX"); + if (!mkstemp(tmp_pidfile)) { + oops("mkstemp()"); } /*if*/ if ((fp = fopen(tmp_pidfile,"w")) != NULL) { fprintf(fp,"%d\n",getpid()); @@ -248,6 +253,7 @@ if (fp) { int old_pid = -1; fscanf(fp, "%d", &old_pid); + unlink(tmp_pidfile); gpm_oops(__FILE__,__LINE__,"gpm already running as pid %d", old_pid); } else { oops(GPM_NODE_PID); gpm-1.20.4/patches/done/refused/gpm-1.19.3-noworldwrite.patch.gz010060000017500001750000000010420760216311400227310ustar00niconico00‹Kx<gpm-1.19.3-noworldwrite.patchmRao›0ý<~ĹiH€4í–(R>¤"ĽYUŠŇ¤m˛0Šc†FŐÔ˙žłIéć/ óť÷Ţ=_°+ó F_†ăŃŽ”ĂdXˆôĂ]!á–m&^OŁp^B†‘ĺyŢ?ďГx:Ž[ôbAý(Ď|Ż`ą°@Ő´ć <<ľ ybɞ4’˙n˜dJ9şěZđÇ ŕ ™<Ń ęź$%O3.üřsřzG6ߖ7dšz]}7ǞY´-ƒ^ĎĚ€ŰŐúfY‰Ý!´ĎŔšČ÷5ËK§/áĄx%˜tú2ŽëśĆŠ˘TŽ}ltmר69U{'ŒcwŁätĎ@5CyŕB€,jŘâQ‰48TźŚ[źŒ,Oô̝v7§B‰ó?;K{Ô€ĺ¨őƒ—IůҟË?‹­CŃúuĆgPÇ Ôű¤L$^?Őe‚ŐWL‚g8 ´މ?+Jtݗ´6R]Ěaó¸^kNM‰oUqYgŘäŰӟŇöwŹĆÇEvł_—Ÿý+\ŻÉŘż6ŰGŹ<‘`Aր‹­ĹP<ˆfo™J¨4ô€üśŸŽ°vh})¸ÜŸ|jǐˆ›˝[„ř„ŹWýŁ7¨¨M_ j¤ärTś`”:!Cő L(ÖY6´§Çş_-řÚ0) ągpm-1.20.4/patches/done/refused/gpm-1.19.3-root.patch010060000017500001750000000007460760216311400205500ustar00niconico00--- gpm-1.19.3/Makefile.in 2000/07/22 06:50:28 1.1 +++ gpm-1.19.3/Makefile.in 2000/07/22 06:50:45 @@ -142,7 +142,7 @@ for i in mev gpm-root; do \ $(INSTALL_PROGRAM) $$i $(bindir)/$$i ;\ done - $(INSTALL_PROGRAM) -o root -m 755 disable-paste $(bindir)/disable-paste + $(INSTALL_PROGRAM) disable-paste $(bindir)/disable-paste # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional # headache in cases like this gpm-1.20.4/patches/done/refused/gpm-1.19.3-root.patch.gz010060000017500001750000000005070760216311400211620ustar00niconico00‹Kx<gpm-1.19.3-root.patchąnÂ0†çä)~Š@Š“’ŇÂşTHPtčPŠ:° Ž&Ś*o_']Z‰É˛˙űž;c EU˛A4xŒîâĹ^*IíĽI’ÄÉ(NS$÷ă,§ž+óĂ0źf~žƒ †éíáď‘ç>ź˝Š!!5JńŐŮjcěÜŕÝĽ^Л˝l^§óůÇj˝|^O}DĐŰJÍeݏŰۤ-ĺF Ÿ]˜A++1Ę2pŮĐV VQcĹÓżw?źdş…wƒŐr3{C->O˛ ěA &]˜=í§•1śÚÍ]Vö ŇOÔ:>žQG’2ş˜ŕ¤cOšŹPg§#ëFÚĺÄš´ŇhRzÄi纼î¨q%Â1˛ń(ˇƒćgpm-1.20.4/patches/done/refused/gpm-nops.patch010060000017500001750000000006050760216311400200070ustar00niconico00--- gpm-1.19.0/doc/Makefile.in.nops Thu Jan 20 22:52:46 2000 +++ gpm-1.19.0/doc/Makefile.in Sun Mar 19 00:37:35 2000 @@ -93,7 +93,7 @@ # Main portion -all: $(srcdir)/gpmdoc.ps $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) +all: $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) $(MANPAGES): $(srcdir)/doc.gpm $(srcdir)/manpager cd $(srcdir) && gawk -f ./manpager doc.gpm gpm-1.20.4/patches/done/refused/gpm-nops.patch.gz010060000017500001750000000003630760216311400204270ustar00niconico00‹Kx<gpm-nops.patchŽËjĂ0E×ÖW\h ŞdŮnŹ•ł(…‚K!ůáWDIČÉçW}ĐşB6ƒćpĎ\1ĆĐšKx’sלŠKľoZÝ7\nŹ˘íîˆWe ¤Š\¤ňiŢBJé9Ú Jĺ‘äBf+™-ž˝˘ËłÇč×, ‚ťŐÎúQ[S}/q˙0řŞÖ~‡ŚĐŔÝ🅦Ö^ĆĆó`š~{_ż"ÎU…gpm-1.20.4/patches/done/unknown_stat004070000017500001750000000000001075432545600162575ustar00niconico00gpm-1.20.4/patches/done/unknown_stat/000_misc-000010060000017500001750000000052010760216311400200520ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpm.c gpm-1.19.5/src/gpm.c --- gpm-1.19.5.orig/src/gpm.c Tue Sep 18 10:17:23 2001 +++ gpm-1.19.5/src/gpm.c Thu Oct 4 23:30:06 2001 @@ -315,11 +315,12 @@ goto scan; /* if not managed, use default mask */ - if (!(info.eventMask & GPM_BARE_EVENTS(event->type))) + if (!(info.eventMask & GPM_BARE_EVENTS(event->type))) { if (res) return res; else goto scan; + } /* WARNING */ /* This can generate a SIGPIPE... I'd better catch it */ MAGIC_P((write(fd,&magic, sizeof(int)))); @@ -777,7 +778,7 @@ #if !defined(__GLIBC__) int len; #else /* __GLIBC__ */ - size_t len; + socklen_t len; #endif /* __GLIBC__ */ struct sockaddr_un addr; /* reuse this each time */ struct stat statbuf; diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/headers/gpmCfg.h gpm-1.19.5/src/headers/gpmCfg.h --- gpm-1.19.5.orig/src/headers/gpmCfg.h Tue Sep 18 17:57:16 2001 +++ gpm-1.19.5/src/headers/gpmCfg.h Thu Oct 4 23:30:06 2001 @@ -53,7 +53,7 @@ #define DEF_ACCEL 2 #define DEF_SCALE 10 #define DEF_TIME 250 /* time interval (ms) for multiple clicks */ -#define DEF_CLUSTER 10 /* maximum number of clustered events */ +#define DEF_CLUSTER 0 /* maximum number of clustered events */ #define DEF_THREE 0 /* have three buttons? */ #define DEF_KERNEL 0 /* no kernel module, by default */ diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/mice.c gpm-1.19.5/src/mice.c --- gpm-1.19.5.orig/src/mice.c Sat Sep 15 16:53:38 2001 +++ gpm-1.19.5/src/mice.c Thu Oct 4 23:30:06 2001 @@ -284,7 +284,7 @@ /* (Frank Holtz) hof@bigfoot.de Tue Feb 23 21:04:09 MET 1999 */ int SUMMA_BORDER=100; int summamaxx,summamaxy; -char summaid=-1; +signed short summaid=-1; static int M_summa(Gpm_Event *state, unsigned char *data) { int x, y; @@ -475,10 +475,11 @@ if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ state->buttons = tap_active = opt_glidepoint_tap; - else if (tap_active) + else if (tap_active) { if (data[0]==8) state->buttons = tap_active = 0; else state->buttons = tap_active; + } /* Some PS/2 mice send reports with negative bit set in data[0] * and zero for movement. I think this is a bug in the mouse, but gpm-1.20.4/patches/done/unknown_stat/000_misc-000.gz010060000017500001750000000021260760216311400204740ustar00niconico00‹Kx<000_misc-000ŐUmoÚHţ\~ĹT•rźŮąID/„:]H# wŞĘZě5ŹŔ^ä]§IŞţ÷›Ybň&Ý}Ť…Ř—™yvgö™™PDXivÖ-ŒŮŠGbÍiČ$‹,-,ě€ËâzIóŞýÍmľżÓtą‰m‘Dr;e`oTaĄoőveĽRj; •Ň,ŢX[(žŒŘľÝSťiËT,UrQň¸Y˛,ëu“włŒĂ”oŔmƒëtÜV§q ÇqKľZíEźwłe_ p ŁÎ‘ÓqNr‹ł3°ŽÜfÝuĄfĆœ•€ž…ÔTŔ’n hç° "‚DjˆYÂ<ŹCŚ8„ß1Đ勔%+ř,×úžKÍĹ""C”x|ÔݎsÜqNaěÍŔ===5Ż@%túu<îűç_&ŸźIĎuœnž­˛8fȧŰúĂěŽ[˛‚%Ks‘{–‹UU‰–fPK™ę=‰)€"0`cßHĘĂMě{ÄC¨’i‘%[ƒ\ ™fXÜ>Ô÷Ű:Üĺá¸…-فš]ă~iŰęČč›ó˝×sŕŕäFű‹ľůF"‚ŻŮŚB*đϔnüEŒÚF^šÁ\—[ˇ\‡ ĽĎ-0 z/ vŠÁ˜ĆCwxT6íűĽýbwŢ]š˝kŇoŸď:÷[Ş…&ŽNO%ÖŞëéaˆ_ °ßaűÚŕS)ř!ôž`ć„96lĹ5śwŁóŞŔĐ➧2Żqň†Çřz6Ŕˆ˘ˆÄ{ˆ%Ă"ą k‰Kěu*Ľ×qj gpm-1.20.4/patches/done/unknown_stat/INDEX010060000017500001750000000004060760216311400171140ustar00niconico00 * devfs-1: solved myself another way * gpm.screen.diff: there is another patch in unified format * mktemp_secure_problem: applied * OPEN_MAX: solved with "include " * imps-autodetect.patch: applied * gpm-newmouse.patch: applied gpm-1.20.4/patches/done/unknown_stat/INDEX.gz010060000017500001750000000003070760216311400175330ustar00niconico00‹Kx<INDEX]ŽąjÄ0ű|ĹâňŔ iM¤H™\ĘëŒ"­â%ZIhWçóߟĂŽßźaŕŻAú—$Ç+zŕE0°)ë„fť<ÁĆý6â*b2žB`›Hhąę& -Q UreŤű˙šŒ‚ŽUKÍ?y[J\ѝ9|Ÿď—GËL:AGÉĹć^#Ľv{ŽÄ¤bڎnémÓěQŃŠůĎ8˜×ř>áĚš ;‡é†gpm-1.20.4/patches/done/unknown_stat/devfs-1010060000017500001750000000035340760216311400175170ustar00niconico00From - Thu Jun 7 00:06:04 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA24549 for ; Wed, 9 May 2001 15:40:20 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 09 May 2001 15:40:20 MEST Received: from mir.prosa.it ([217.57.75.5]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id PAA27471 for ; Wed, 9 May 2001 15:39:30 +0200 Received: by mir.prosa.it (Postfix) id C694511F; Wed, 9 May 2001 15:39:28 +0200 (CEST) Delivered-To: rubini@prosa.it Received: from fox.tamu.edu (unix.tamu.edu [128.194.103.25]) by mir.prosa.it (Postfix) with ESMTP id 93AB11A for ; Wed, 9 May 2001 15:39:27 +0200 (CEST) Received: from localhost (ers7067@localhost) by fox.tamu.edu (8.9.3/8.9.3) with SMTP id IAA01257 for ; Wed, 9 May 2001 08:39:26 -0500 (CDT) Date: Wed, 9 May 2001 08:39:26 -0500 (CDT) From: Eric Schendel To: rubini@prosa.it Subject: GPM patch for devfs Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-UIDL: d09ac3c5d4e5825e1ee94b1606b7c5c7 Status: RO Opps, the patch didnt go through as an attachment so I am just going to include it in the email. Eric --------------------------------------------- --- gpm-1.19.3/liblow.c Tue Jul 18 07:06:06 2000 +++ gpm-1.19.3f1/liblow.c Tue May 8 18:58:43 2001 @@ -235,7 +235,8 @@ if (!t && isatty(2)) t = ttyname(2); /* stderr */ if (!t) goto err; strcpy(tty,t); - if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) + if ((strncmp(tty,"/dev/vc/",8) && strncmp(tty,"/dev/tty",8)) + || !isdigit(tty[8])) goto err; conn->vc=atoi(tty+8); } gpm-1.20.4/patches/done/unknown_stat/devfs-1.gz010060000017500001750000000016150760216311400201340ustar00niconico00‹Kx<devfs-1•T]oÚH}îüŠŰ>T¸ŕaĆß6 ‚Rą *dˇR”‡Á`*ɧEęţ÷P€ŐîX2śgνçž{¸ˇE–€‹MT)€ „Ä ˆ!}ă!Ď< `UŸŒłĹ›Ź”Đ*ŞĽHĹŕĺË#5\LÔEŸ4ônš…$+Ö,e¸Ü–’'[,ĘĂ>6ťťűˆ/Kť_ž>hđSČ ŒçÓĹ DłáаlËGďVYWűTűxýüĹŁř0eۆ%P;°H`hő~N:Ďň†ĎŠËp“0ëv°łű™y9´J‘ŽcŽGE–kű|äRÂéxž8ϗˆçEV˛ŚâGƒşŘvąkcűIĹCń9ÓD]Ýún^Âľ\ Ç,Oń—ĺ0ýŔ|-Gݔr3Ő¸•řĽúĽ’Ý8žeSzťř:˘áí"BëF•­ĄU܂Gú" ŕŔnü\•Uö K–T˜G´ŞT˝*ëx˜úŚÄĆ}đĎEŞg ůćđ3ĽĂÓ>PýˇKqOKyŰçź(]â¸/Fߑ;-çČÖ{‚~“áPĂv˙ŕ?â5üЉÝđŐJ3Ƀ˙vôVń`\ˆćᆧáęPĉě}tŠmójůƒ‡2€/ł)äLýeóEüyU˘)/KśćúdŔŐL¤Ďďﰉ}GľŽ*>ńLÇś°OŒĄNI˝ÇRőŃt2ë*B"K ˜ ›,•<•úb›Ť"ăď‹îěn8ůڃpʒË뇹>œßL&čťţ0ÝŸ…fhGˇ=Ăć”sßZR‡8K7´CÍ%“UŔˇ{„îóźě€Üđ}9‘ˆR ëL}*˛j˝VKIÉÔ|PL Ě`,UYTłd†DĆUÄAšQ¤M<^O Őr#¤˙ŸŐ‡užčTY_š'Ë8ű‰CXT\ ă¨Äm†ąS÷› vť}XŃČnŐŔÚŕ)l`{eîŚř`şaÚeúúǃÁÁË+h˝—đń#ˆRаmšŽA=§,áę˝ÝOPʈ|ęžkJ&™Úîo–˛ómKĹéH­‡ôS˜ÚMĂ$oś?t•ĂşęéCÇÓŕ÷ox/ĘHŹ…Źw˝'MCíSôřsŘm઒7cŸÄŠ×Ĺ\''.–fiŞ÷ŸĂk&3Q۞vtŕo„ţ¸ĆP\gpm-1.20.4/patches/done/unknown_stat/devfs.patch010060000017500001750000000111230760216311400204500ustar00niconico00From gpm-request@prosa.it Thu Apr 27 12:07:30 2000 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id MAA19031 for ; Thu, 27 Apr 2000 12:07:29 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Thu, 27 Apr 2000 12:07:29 MEST Received: from giga.prosa.it (root@[213.255.48.147]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id NAA03517 for ; Mon, 24 Apr 2000 13:30:37 +0200 Received: (from lists@localhost) by giga.prosa.it (8.9.3/8.9.3/Debian/GNU) id NAA16706; Mon, 24 Apr 2000 13:30:35 +0200 Resent-Date: Mon, 24 Apr 2000 13:30:35 +0200 X-Authentication-Warning: giga.prosa.it: lists set sender to gpm-request@lists.prosa.it using -f From: "Adam J. Richter" Date: Mon, 24 Apr 2000 03:43:11 -0700 Message-Id: <200004241043.DAA28678@adam.yggdrasil.com> To: gpm@prosa.it Subject: Patch adding devfs support to gpm-1.19.2 Resent-Message-ID: Resent-From: gpm@prosa.it Reply-To: gpm@prosa.it X-Mailing-List: archive/latest/717 X-Loop: gpm@lists.prosa.it Precedence: bulk Resent-Sender: gpm-request@prosa.it X-UIDL: a6c102abee205325fb8ebf43077d9567 Status: RO The following patch fixes gpm-1.19.2 to allow use of the virtual console names built into devfs (at least for linux-2.3.99pre5.5). Although it is possible to add the old names (or some other names) to a devfs-based system, these names will always be present on all devfs-based systems, eliminating another potential incompatability. If you apply this patch, gpm should still work on all of the systems that it worked on before, although I have not tested it on a non-devfs system. I hope you will apply this patch or some variant of it for the next release. Adam J. Richter __ ______________ 4880 Stevens Creek Blvd, Suite 104 adam@yggdrasil.com \ / San Jose, California 95129-1034 +1 408 261-6630 | g g d r a s i l United States of America fax +1 408 261-6631 "Free Software For The Rest Of Us." diff -u -r gpm-1.19.2/gpm-root.c gpm/gpm-root.c --- gpm-1.19.2/gpm-root.c Tue Apr 18 22:53:38 2000 +++ gpm/gpm-root.c Mon Apr 24 03:35:00 2000 @@ -1868,6 +1868,10 @@ sprintf(dumpname,"/dev/vcsa%i",vc); dumpfd=open(dumpname,O_RDONLY); if (dumpfd<0) { + sprintf(dumpname,"/dev/vcc/a%i",vc); + dumpfd=open(dumpname,O_RDONLY); + } + if (dumpfd<0) { gpm_debug_log(LOG_ERR,"%s: %s", dumpname, strerror(errno)); return; } /*if*/ @@ -1888,6 +1892,10 @@ sprintf(dumpname,"/dev/vcsa%i",vc); dumpfd=open(dumpname,O_WRONLY); + if (dumpfd < 0) { + sprintf(dumpname,"/dev/vcc/a%i",vc); + dumpfd=open(dumpname,O_WRONLY); + } if (dumpfd<0) { gpm_debug_log(LOG_ERR,"%s: %s", dumpname, strerror(errno)); return; @@ -2090,9 +2098,11 @@ exit(1); } - if (stat("/dev/vcs0",&sbuf)<0 && stat("/dev/vcs",&sbuf)<0) + if (stat("/dev/vcs0",&sbuf)<0 + && stat("/dev/vcs",&sbuf)<0 + && stat("/dev/vcc/0",&sbuf)<0) { - fprintf(stderr,"%s: /dev/vcs0: %s\n",prgname,strerror(errno)); + fprintf(stderr,"%s: /dev/vcc/0: %s\n",prgname,strerror(errno)); fprintf(stderr,"%s: do you have vcs devices? Refer to the manpage\n", prgname); exit(1); diff -u -r gpm-1.19.2/hltest.c gpm/hltest.c --- gpm-1.19.2/hltest.c Mon Jan 17 13:34:00 2000 +++ gpm/hltest.c Mon Apr 24 03:35:32 2000 @@ -456,7 +456,11 @@ /* open your dump/restore buffers */ sprintf(devname,"/dev/vcsa%i",vc); - if ((dev_vcs=open(devname,O_RDWR))<0) + if ((dev_vcs=open(devname,O_RDWR))<0) { + sprintf(devname,"/dev/vcc/a%i",vc); + dev_vcs=open(devname,O_RDWR); + } + if (dev_vcs<0) { perror(devname); exit(1); } if (Gpm_Open(&conn,0)==-1) diff -u -r gpm-1.19.2/liblow.c gpm/liblow.c --- gpm-1.19.2/liblow.c Thu Jan 27 14:09:00 2000 +++ gpm/liblow.c Mon Apr 24 03:05:21 2000 @@ -226,6 +226,8 @@ { /* forced vc number */ conn->vc=flag; sprintf(tty,"/dev/tty%i",flag); + if (access(tty, F_OK) < 0) + sprintf(tty,"/dev/vc/%i",flag); } else if (flag==0) /* use your current vc */ { @@ -235,7 +237,8 @@ if (!t && isatty(2)) t = ttyname(2); /* stderr */ if (!t) goto err; strcpy(tty,t); - if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) + if ((strncmp(tty,"/dev/tty",8) && strncmp(tty, "/dev/vc/",8)) + || !isdigit(tty[8])) goto err; conn->vc=atoi(tty+8); } -- Bored? echo unsubscribe | mail gpm-request@lists.prosa.it gpm-1.20.4/patches/done/unknown_stat/devfs.patch.gz010060000017500001750000000036730760216311400211020ustar00niconico00‹Kx<devfs.patch­XioŰ8ţýŠY-ŹĆ’uřNŇľŰ$EťI$)şűv‹€–(›[YԒ”#íߥŸIşŔť2bYäpć™gR9|“tf úwFĽŚ‚Kb3p3Í`” đşŕz§;đđÇ1Žh@ٜ†ˆôę˜$žrŠ .˛1KŘp5ňĹőşśƒ÷Ťiě0ăbBb˅TtśĐ†ę=ťoűÍâű˜ŽIšď>~2ᎊ)œ\Ÿß\ á|4rűŽď{p¸męőÜĐhsĐ´„íőaßńvq§<Í!ETÓaąŐ˛;v ./.ý #͕¨K–Lbj…‚§ćs&ĎOŽoś-N؄ŘK‚ë‚s5üâšžíľŰvŤgť­îWBŰb?MýíoÓňq4rüśŰ…uV6×#5ç†sŕww¨Š1eRÉšEěśŕ?ś”Űé:cď)ËíĽeIeEđ3áß­QŚŚ(ϢOŹĎD$Á&śA$Uř—„T€âYžĎŻ|ÉtTÁŠŒSt~ľQHfđÁ†+L58$82\L&Ą ’ĹvŔgŻ'0;ţ ĺ\,§‹˜ĎŠ”dB­÷HîĄpZ^ËuZž}<y˝Nˇ7ÔĘí-ĺ7| /ëѸÎĆŃ}ť$˜Ż@ÂPcé‰ÁĄŔ#sćL¨ŒÄđDň˜BBf¸hœąXKpE’:QS‚= Ó@ž˛{Ëł}ťßOmŰmÓĹjĘłÉ0™ÄŞ—’QĽ6†€Ö ‡Ľ…:Öˇä3āă˘4sŃ¢5&’†P”}C/–Ô(–Ţą8FGîȁR@šVŕ‰öî‘Ő˛4f3–`‘%ƒ$…É”+]zč;K0G‘32Ć P tĺ} žI1WĐśöFSÚĐl˝D?¤Ň8î¸řV™ć‘ĆYYĹßHrĄE )˛GИzS2GŇ9&;ŚJąÂJʞruLyJ50Ł ` T”ΉŔöĽ4–,‡•Đ{‚ę(RŰ0śščëöśź­_8Đęő¸VtN oĽßŕM<p1EËßŘí(šŞ?Ą ;×5Iŕ—´oIĚ_Âôێס\Çoű.´œx×ętp›ŽŽď0ÁOů‘Ŕ ĆąO Ó´éjŔÔ@G3*°Ÿš‡MEnĄĽvŠŔ5ÔN‘]=Xœ ."ř$íVTȢŹ ,ąVAÍźdqŸł=şöhX–ő¸ŕŢMFónę"oĐĆ- W<ö÷÷ˇ´číĽčź-ÝwýöŔ))Ă!XnŻÓktĐ)}w tGŚë4އŮ,ŐőѨ51ošó@’ŹÖ˜ćÓÓQx„ ”ŹD/nŻŽ/>žýQˆ°ę…ŘĄcƒąĎŠš+ýšäĎ, Đýľm& rpŇq6šů¤~vńîöäęŞQ{ 5`ŠËNP!¸¨ăwÂÍ:`bŤL$ůĂhžbŃŤfIZŻ$­ďU¤ý˙´}žZ9ľňá?$nÝƏÇâóß§ÉňœžÓŔó%Ţ1ĂÜ2ʋŢ3UwŤU9$–ÄňŤ/tj—rœEćĄ/_ÂćäjÎ,Üv˝ąż÷Œ†GfƒŚłnĄűP@ŐWTĆE*܄EÁÔҰ&íϤÖHĹ$'m—łýĄ1ü\<§(äůţ“oˆKoj, ňWěRQqüÓ}F’BڎąÓdKË떖!|źšMc˝•­­zŘnlŐxŢŞ>`#Çłş>Öś–­Şjk’MÍ÷VM­Őî4đŘŽo˄kž] š‘'pˇx…;'žK"ô_÷fÓůSElŚEnq˘,łR^ˇ§ĎWf•Œ˙Jp§ŔˇlďÖ÷3 ˇÚb!™'îޤEʔKđýŹ `^|eéźĂpĄ5żÄ#\ŇpĚŁ#Ë5ŸqŒ2~W†¸zŘq5ž§_™uˆő+3ơżâĽäfˆöŔsW!öźŽîŔúÖŰh)y¨q˙Çc2Ś9$ŮlŒŮ­ƒťş´WÖëypĹdr°>S@ŠEI>ţŇÔkIÍě^Á °td.§ˇż™yŸÎ§W3škj–ö~T?iŒçg­YKaJh?ôĄ:ĎŘ BHŃŁuW 2üśÎwĎďn‘Q`ýEéŽÉ$A4uĎÄ1ţÖ €ĎÚPŃ(śh*›0áŘpz“)%‚t‘{¨Š’X_†łI0K7yŹ5z&|˙ż0˛ ŚŽ}é}5ÍU,ëĺéĺyo^M’]=ť Ŕăf6šŮŁ^-3ƒ(ÎôÂýŢf¸0ąÁxƒ}#üľ \0ĺ%2Ë@0|wřú?%ĎźKĆ?*hšfc¨öKx˛áŤŘ\qGŠL-˘“WҸ ’5’M~žćë +!DEŃ/ăOu–Ÿ%GuQ€%BŹ–˘ď^ŽeíޅjhĽÖ=wŁ)÷r¨O/&ş“;}é1œ§ĽWíôD,^ qjoc…Ćř`č€wę ľî ‹8`€Ş;ŤĂťçmůřts[^ż<,EšŚ>'ň)Ö´Ÿmkł_YălKő,¤RäŸ˘˘?˘„˜_Bźŕ˙+T4ŔŠžČ@7×řŤÓ _?wj’gpm-1.20.4/patches/done/unknown_stat/gpm-1.19.2-limits.patch010060000017500001750000000007320760216311400221550ustar00niconico00--- gpm-1.19.2/special.c.openmax Mon Jan 17 16:34:00 2000 +++ gpm-1.19.2/special.c Fri Jun 30 10:49:40 2000 @@ -154,7 +154,7 @@ open("/dev/null",O_RDONLY); /* stdin */ open("/dev/tty0",O_WRONLY); /* stdout */ dup(1); /* stderr */ - for (i=3;i(P1Śž¸ä„V‚‡ÎĎÄ …Đ­óošˇ>ׂk)ĘŔŞč ąŒ¨[O#Zu>pŽ7Te’Ő†q#'WHkŞŠtQXc“§bX0ĎîŒ †Ń’šh4ĚТëă²%,Ř *!1aRŇÎAVÄŽ„ÁVĄ2jÍöKpO$ŔŔ” ŽĆQt˛Îëý­/ ‡Výnt[ßK§ Vu|€Î´‘ĚTSŒ{B€Ľ.xÜ(– Ž1 |^Ұăď6Nź:p˙dĄTćá'×á>\?áźO˙zř‚Ó›§Ű?ď~v>y˝DëbčC´FćmďŻ>|ö!Ɖű˝úŚÉ^:5Żmeł0´B-É&Ä=ę 7P‘ pĄA6ž™^B7ĐPŠŽI¤w üe€c&ćDRC˘M˝oÓÝżŰÔӃÔmíIdb‡Î=ˤP˘Đ°=7œŽĎŃŕÂźŃ÷{ÄšS 3pú œ>ěŘę7aÚú}ôc~ô˙Гí“íčéŸRF{Úę]uŇFm‹ž›u›ş{ŃÍĹ37%v+;Ľź ŘRý!Řc~Ú5 Iťç˙ĚTtŘCýSBÂcŐTúřĹţ ¤şüŤ gpm-1.20.4/patches/done/unknown_stat/gpm-1.19.3-imps-autodetect.patch010060000017500001750000000113120760216311400237600ustar00niconico00diff -u gpm-1.19.3/mice.c --- gpm-1.19.3/mice.c.orig +++ gpm-1.19.3/mice.c Fri Jul 27 12:36:25 2001 @@ -58,6 +58,7 @@ #include /* MAJOR */ #include +#include #ifdef HAVE_LINUX_JOYSTICK_H #include @@ -1620,21 +1621,112 @@ return type; } -/* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ -static Gpm_Type *I_imps2(int fd, unsigned short flags, - struct Gpm_Type *type, int argc, char **argv) -{ - static unsigned char s1[] = { 243, 200, 243, 100, 243, 80, }; - static unsigned char s2[] = { 246, 230, 244, 243, 100, 232, 3, }; +#define AUX_SEND_ID 0xF2 +#define AUX_ID_ERROR -1 +#define AUX_ID_PS2 0 +#define AUX_ID_IMPS2 3 - if (check_no_argv(argc, argv)) return NULL; +/* + * Sends the SEND_ID command to the ps2-type mouse. + * Return one of AUX_ID_... + */ +static int read_mouse_id(int fd) + { + unsigned char c = AUX_SEND_ID; + unsigned char id; + + write(fd, &c, 1); + read(fd, &c, 1); + if (c != AUX_ACK) { + return(AUX_ID_ERROR); + } + read(fd, &id, 1); - write (fd, s1, sizeof (s1)); - usleep (30000); - write (fd, s2, sizeof (s2)); + return(id); +} + +/** + * Writes the given data to the ps2-type mouse. + * Checks for an ACK from each byte. + * + * Returns 0 if OK, or >0 if 1 or more errors occurred. + */ +static int write_to_mouse(int fd, unsigned char *data, size_t len) +{ + int i; + int error = 0; + for (i = 0; i < len; i++) { + unsigned char c; + write(fd, &data[i], 1); + read(fd, &c, 1); + if (c != AUX_ACK) { + error++; + } + } + + /* flush any left-over input */ usleep (30000); tcflush (fd, TCIFLUSH); - return type; + return(error); +} + + +/* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ +/* Autodetect: Steve Bennett */ +static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +{ + int i; + int id; + static unsigned char basic_init[] = { AUX_ENABLE_DEV, AUX_SET_SAMPLE, 100 }; + static unsigned char imps2_init[] = { AUX_SET_SAMPLE, 200, AUX_SET_SAMPLE, 100, AUX_SET_SAMPLE, 80, }; + static unsigned char ps2_init[] = { AUX_SET_SCALE11, AUX_ENABLE_DEV, AUX_SET_SAMPLE, 100, AUX_SET_RES, 3, }; + + /* Do a basic init in case the mouse is confused */ + write_to_mouse(fd, basic_init, sizeof (basic_init)); + + /* Now try again and make sure we have a PS/2 mouse */ + if (write_to_mouse(fd, basic_init, sizeof (basic_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed init"); + return(NULL); + } + + /* Try to switch to 3 button mode */ + if (write_to_mouse(fd, imps2_init, sizeof (imps2_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed (3 button) init"); + return(NULL); + } + + /* Read the mouse id */ + id = read_mouse_id(fd); + if (id == AUX_ID_ERROR) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed to read id, assuming standard PS/2"); + id = AUX_ID_PS2; + } + + /* And do the real initialisation */ + if (write_to_mouse(fd, ps2_init, sizeof (ps2_init)) != 0) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed setup, continuing..."); + } + + if (id == AUX_ID_IMPS2) { + /* Really an intellipoint, so initialise 3 button mode (4 byte packets) */ + gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected intellimouse PS/2"); + + return type; + } + if (id != AUX_ID_PS2) { + gpm_debug_log(LOG_ERR, "imps2: Auto-detected unknown mouse type %d, assuming standard PS/2", id); + } + else { + gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected standard PS/2"); + } + for (type=mice; type->fun; type++) { + if (strcmp(type->name, "ps2") == 0) { + return(type); + } + } + /* ps2 was not found!!! */ + return(NULL); } static Gpm_Type *I_twid(int fd, unsigned short flags, @@ -1991,7 +2083,7 @@ {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", + {"imps2", "Microsoft Intellimouse (ps2) - autodetect 2/3 buttons, wheel unused", "", M_ps2, I_imps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", diff -u gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3/doc/doc.gpm.orig +++ gpm-1.19.3/doc/doc.gpm Fri Jul 27 12:49:08 2001 @@ -720,7 +720,8 @@ ones. The wheel is currently unused. @item imps2 - ``IntelliMouse'' on the ps/2 port. + ``IntelliMouse'' on the ps/2 port. This type can also be used for + a generic 2-button ps/2 mouse too, since it will auto-detect the type. @item netmouse Decodes the ``Genius NetMouse'' type of devices. gpm-1.20.4/patches/done/unknown_stat/gpm-1.19.3-imps-autodetect.patch.gz010060000017500001750000000034660760216311400244120ustar00niconico00‹Kx<gpm-1.19.3-imps-autodetect.patch­X{sÚF˙Ű|Š56`$„›8v“1ąIB‚cœ>ŚÓQdéW Ł;™P—ďŢݓ@â•&i#÷Ř÷ţvOC3…ádlÚMűyłÝsŸ5ýŠiš›łM‘đaĽŃhl.í˝N8źK#pžíˇŸ;?‚cYvĺô̏Œ§ĐŔç38=­@žăąĽƒŸ"§ŸZ÷{pUsôZpŃywu­-ŰŘěNxI€+őʼnďŇ:­iaŔBxŰůšëö{—~uß]ý6¸í˝wßnţS̤âţ=&í§Že864p`śíhšŚŇ$5›°“ ̑‘‰óXą(âc‘JfŔD:đŔÉE| ŻX ץ‡vöâβƒë(ߑ~ŚTr…7“ą{‹$á çň1žŻ!EŇXňa̐#‘ŕTä ĽQ1÷öö@Ş$őUé, e,ŕ%Cßä%pp€?ęóąbäü–Tői˙ţź€GpŰůĚČFört„ƒůÉnΒŔS<ŃÖÇW¨´ښHă;t tĐ%ƒîĺšŰ;ëÓkguĽwîvon0 Đ+×}ÖĆBďB/ľÉ/<„š?bţ˝ —ĚPË Ł-R_řňňCżbľ* 8€‹ jÄ`!›/Ćcňz˝c’ĽA{ťŠÝd” "…,ÍŚ^lUšŃČ3 óWŸty{šŽŰńťfUMZ˛ŃÉćŕ$MOŽXâĺTĎŽë˝Äj}N[ö3ł÷őŒń"ŽkeËg'捤xŃŇöŐlA/Hżü/†ęפ]Żë`IeÄŘjm ?ŮTůˆS:âÔBk9x@?ç¤]ë sĚ/t2ó̐?`Vžň>ç”3ňź„P$˜z€ĘB˜ˆ10ĎÁÝLĺťJţ“`‘ŽŢ€g^ę6 Ç"aŔ’D$„ď§I‚-žŐşšJdţÝLá,IěLqWAÄbôžömç'‹‘ć†`éŇĄĆőOŕđĂAŁątßZäœdłĽ° Žżó?–°=<> ‰ÔhäçypĐ?DŔ0Jĺíë™Mżüo^‘hý‰A‰Ľ°aFĺ°˝ŠŽřaâş[rĚÜE3ŞĆ9lOPXQhÉÖ"ąv¨‹5L<˙ž)YĎ °MƒË+ě„ďfđ:3ŠJQřŁZE˝™—ôŮ/űęKíˇĘ:ďc1sƒę>ĺűÝa‚ ”z/á™ÇoÓy[ü͗  ň‚no'Z&óe˜ĆٰÔY°ŚůăI-Ű{cŹ´UäV­“ł­R‹§¨.yk}‚ŞĎSOB,°^Š4ö÷÷s‡ŽfˇžYÁ–ŹŚËśy×ĺH_ߞ?ˇńŽŮpŹŁv~çxŹN⠚ŞŘ 5’OoքK6˛űL˖¤1 2Žŕ‰Š`,Ÿ4ŤFJŸ*Ršpďź-Ńs‘Şgƒgđ7 nĎÝ×ý7Ťťˇ~­O‡XčVŸ–5×ĺˤ•ýÍ ę‡3÷’ěP˝ŕ~"¤ôĘ!MŠ^s™>؋LGŒEh%Ş„¨AăëyËöœÖnŞ›v™PgŸwKĆיÄĎÍP~˘I×L˘9–mdˇS É”Ď[$Řňţ#>}›8ľţ¤´´őMHi}íuČáócë¨xňĚą(:éßQœŮo˛ ˇˆý™¤ÔĘĐu#Vˆ›™ŘMƌS„ţqVˆ+ćŢǏšę¤ú“'H&ż!ŠO05đ˛ň›/ňÓđä#F{âňÝG!`,’°Ű˛ÍëƒcćX­Šäř&՟ó Űł)"J9*ižÄ٤öÜúha‡sćcěeˇ˝ß°˜§ÓT-d×Bb} Řć­lVţu;˘îĘgpm-1.20.4/patches/done/unknown_stat/gpm-1.19.6-1owl.tar.gz010060000017500001750000000321110760216311400216440ustar00niconico00‹ücž;ě[{wÓVśçßřST v,ْlljSs“’@i a%iWŰëĽHGś&˛äŤ‡ƒ‡2Ÿýţö9zů‘đ(Ýť-b[ŇŢűě÷ăHVâÍyűěĆoĎ,űÚó¸=žMŰ÷žŕĄë]˝ßÓń­ëŚŮĎžwĹwvÜÓű^żŰŰ5î=ÝčéŚqőž$ˇiœXc÷ŽRĎwĂ4˛yü5XúšGp‹ýŸźšřb>đöďöşßě˙5Žťě†É—XC7t}ˇ{‡ý;]˛żšŰ3ťÁť˝sé_bń˙áöCߊĂО„SŢśç1ýE0}í˙šˇoÇżţ¸3ţů,Œ˝$ŒmĆ?Šýrü÷{oń˙UŽUĂ ú˙ŹăŽř? ’Čű.˙ř7 şśÔ˙őu˝˙-ţżĆAĆny—´Vż}™röS0s—éú c Ě}fÂBív5Łeěˇv5´ šÚÚôÚ  >ßwź(n9žë‚ŠŃž°vf'Œ *ř×3%í:\'D§Ôn܆ßۉ;đ}ďĘoJ집'ą{Ěě :݁ٿ;™Î>őÊ/ß*xˇ?čÜĆx4Ů ÷Ç/ô Ôfńgâ÷qh_óD›†˙*­xĆmá+UaŃ˝ÜWŽżU‘˙/Çmů˙Ž ýÔ5Dţ×oË˙Čűbţď ź‡~°‡‘đ[ţ˙ ٓiiô’•o…‘7nŰaŕś ťÓYdĂݚŚiAdëőĺ‚ϐ`(ÇPčˆźQk6›wݰUM9ÝAwJ˘2ÍŘSűŹ)>kŒ1%IŒí)Œš­żĎÄ Söq ĺᶂp&.MÈłĐeɄO[­–ÂŢŐ4‚¨5kR’ŰŻ’Sö•Ę=C_ş‡ÓęMcůŚĄŚ;bŸť‚é­şŻTű%ĆŢ×ćdŒÎjě*M’%üĹn_5LÖěž+âá{谇ż oĘĺŐO•L ĹŐB3šn°–⇖3`ŠźH'Đʦ˂‚q>ČéŇIFˇ$a°Œćxń5Kcä–„ěŸm'% Ťą=uä¤ěŸěO¤채f‘$ljy>›pËáQL ­‚@MŰbĘ ąí˙~…SśÍÚs+jÇł0ôۄŮ~đúâä+$8Q„<Á×­l-ŁcÜYhčŻ%[ŻŞĎ/ßŮQË [—“T†D—Şp§7ču7FÓ ÚݑÔé‰P—tË;Š)4"îs+ćLoíďŞĚbw­ÔO´‰8>˜ç ťń’ 1¸Ŕaś°+8BJˇ T‰Áž„1B_; qƒń9aI'˛nؔ)– ("YlтVMťÄÉĄŽĺ]žŢłYŽ# KM‰TpîÄěšG÷TĐęwXáň Z5vř6ânI E"žgÂ-´›+ż<óĚ ěp:CźÇaŔYrŇżęuW*ożŰS Rß~ˇŤîgú#Ž3.׸)‡ÇŢ8řŐÔ6čć …{…)ô,ółÓ(EDKŹmŮIjů­ŚYČtXҎź+Źyľ€))żză4‚8 ęzŕŔ“Ôą|´3ÚDdDÜŚ !˘Ś˝’ 2G­J&­™"ä|á/ź }[¤Ś ‹¨Đľm‘œłˆĎ=Hœ™.f>dC°MsęAŰ —šYWžď%QkZÄ˙'sBš¤TvŤÖ\V(hM\•Ňם6Oěĺ˛#ÝŁjAp 2„爟ˇçvźóžđ`ĘIrą8ô—}˛cÖÉǒŽĺ/˜K™Şâľ{ŽcÎpZěšËaĘŚ^LK‡1ŻiXĐłI˙OwăI˜úˆśˆ[Â&œx%eIËČë#0ů>ł.ˆx1Ś|ä-RDi_!o‚\ÉnÂ`;)-˜&ô‘vÉěAĆŠZÓr+‚đBX ˇ˜›ú~n='Îڏ*ś…BĂG….WSʰ33#ÖbĄ.ĄóĐÇźĄ@’ˇ‹b׼ˆëőłŒ•G .HFŒj‚ČalMgďâ‰ç&ďŐěĚ G~yęs7ç%%yx’T!mŚÂG´C/ĆľTÖg:Žy°ČL@q¤Ńô䚞˝Áăű)8™xqI@J/PĽ‡ÜꤰÔ|ĹeŠEú˛˜lY+´Ü•e˝Ŕ ŁŠřMG"’Ë•("Í%ÍÖ&ëdî ¸8uĄ%9 2 zP8i…3ސM(žf2%ܧLÇŹŤ0M˜—PŽb™iŽKƒ‡”š˜•&!ŠŔś|,…áŐՄ:㙲n&`œ†…„;ż~Žą`LCœ= ‘ËxAqЧ EKŠŰ‹XÂMŁo˘P41őôÔ˝Ź`<¨˙xvzŇhˇrÄl1J1XQVĘžœ˝ń"QΟd:˝É5†0Žńoď<ăČnŸZ×\Đ^n=Wnmě=W`śhťPt‘&3öćîŔěml>Wń–ťĎ^Đ5ĘîÓԅ…ôlŽŤąďŘŠ^Š5‡^h1ÇäéLLěp¤N ‘gçOŘPÇĆg€Ď)Ę#žDŇľ|üJn<‡:Uş¸,$;;nŮľf†kűČnČ‚Ŕ§“ŻĎÎ~ř „ԉâ e[aŔE´ˇB†ßs7n…YéęÓŕ×ěw2Y§Ôëi Ęă`K,–K…•Ľkź:?{ÖlůŢqk՚šS ś Ih‡­CÜäĂÁ<rŃŔÔů ţäIƒ^œ˝8~úâčŮĹá ‚Ďç‡ěwÁńJm‡5÷Ĕ)ísqyţü„Ö„˛a°0áhÝjÍĺ bľç//.^ź‘çG§ Ň6䉯Ě˝¨!žC5o“Qł ,Ž-Q>>şŚŢwjŮQç,e˘I™ž>Łm΢ąS Wůíáâ׋˓S‚ŸĐĆÓăççLYî&•ęÇ'O^ż¸==;?a}9ö}ąKgěeťL‚ßYÎ=§čB%ŤdLvŁi蚆Œu*ý$đ˛9v ü*usp}܊ŻEÁČö*ňQ‹ĐótRŠÓMޤgŹŇŁ9=ë‚ÝqśŻ"ˆĺ~ĆňiżÓ•›“ý̂ÉbĆi=řpŠŕ;Ś—w¤ L“ 5N2ŠŽ–­čó`Œ!ľŽŞZ.&&D’?Gpš•ÖPIđ ^Y šŕUËńRĎY]Pŕa„ IńN6Â-CźČĺř`ňfâٓ|ŰšŠ@›JƒŹzFŽJŢ} íÓ°.AEÚŮIźÄçTX˜˘(T˜=PhvĚŽjě-íą”LG[6AŘlŹßżz‰*Bü›÷Çp¸ýűďŰ &~1VŐAˆ\€2Č:Š÷x{˙ŕĄ[šŃXaTnÖy[,Ä ^WÄŚR†ÂîĘúUÎ`{Ăt@ő˜˝ęu{™ç†D˘ gßžœ=ݼĒŽ6ÜżŠ¸u˝áÎű5•Ź)ű=Uň€%Á ŰVśiFŢţßŇ[WŔÍŚYÜă\3˙`÷ĽuŞË–šQA¨{(ű&űóĎ 5Ăl,sˇÄŹ$1DzY,ü9†+Y‰†ué™ œ:é †>`Yp9˘yă峃,tşŚx„ÖëĐŽ{Ő/ Ë`1Ú‡Ł˝z„|*sĺ‰+ƒvÂR7R%Cťb‡%çú ;ŽšâGťá\đóď.ÇŰätKˇA!…š3–0gřȎkœ‘_ŘőÖvŁp40jđĺBäň‘fˇOűcÝÝ˝ü™f{gř˛95*̍\ďm=Ť ˜â‡íĐ7|W<Žy2öœ:]ŇĎnFcŃŢh”Ç˝„ś gqy“ňŚĘÖaA$­Ie”ŮzĂ 'jËuý‘k­`mZ•@2—âo˝¤nHĹ”óşB{TŠJw ,̐*[{qöě呀\fgŒj™ˇgŠÇ˝nžyßŢѾđˇ2îH<ş­‹GĆĄuQđ\Tű˜űޚăÜŘtęIÖ=‚ňÝšńŢ:lH1čš*džFůă|2í}áIMăzćr⎨˙ýjn0ů‹4ˆ_­VK¤(`ĘJ–üeżLrł-zfŔƒş"6ƒÔ÷őlt~|öňĹŻŮJ˜ 0S XFŽđßΗ€ŠľË€)Óz› Œě`Ƹ ˝açŔű>ŸG¨^52†=1J% >ž˝:˝|M[1'oTV°MC"štÉ=5Q[rÝ5X!á%^&HŽ(…!łąQ˘Ą2ÄŒ9çĺÔÓX12ËmźaBkÇEUćf+*ůö؊Ćj^éHěMŇŤ‹G"ônbÍ Š=Ĕś×QMٌŢ+;˛§Ď_œ°W8/䥇ižĄúŚęwČqáÜž1ôÍĄßę-ý@6 Ëž,ä~'żlzžňtôäüäčňd@üĆsLŚż§ąŘw­kŽ"çMuŮ^H9mŸžä8Vb §Ôé۔j[—ˇ‰XŁię2K–ht}ń ُ¤~9‰ě٢žş´Z_‚ľ’uX…=ěľLˇúŠT°Äű'îOŤrľ—XËĹşüĺ—_, őy~JĎCiƒ4΄ÚËŰĄŞ$ÍĎTYgG(-YúŐŮĹĺ ŻÁ"wŐÝĄ›…fKťMŻůXó1ü8RpřŹ-3ŠĘíĆś¸uWUúPüSÔGPČ#häQU%Ÿ¨Čć­XĘĂxƒĹTÄhŃIŢA7ç<۞ZÓĘó—oÎ~>ČýŁŤš]Ú´7U3Êz8hĹX˙ś§˙ątúÁżO´uţJ´uţ5ŃvĘŚ¨ÉÍü$žąfŸtu™ó0EńÓüˇ@s§ó9%уű ˜‰é˘ŠŽëąş§Ťn㖫,–a#tv;ůŸď‰Pý<4óÓŹ%z:Jłľ Ý슏ŠˋĽ˛sśŠŃKˆz×Í[Ywr‰?Űü¸ä´ÉÁďĚQŸ˘˜OJb=Cě‚îöÔrfţËYˆÝ3…*ÖbO‘/ Đ{#pb+U:IäŇkŠĐšačëî#ß%ЌŒYvQĂět{ťý˝}]‘]­‹—ĄizÄU0á.ó.bx} B>•yżš‡qĹěeóŠ|x&ăpnůŠ| …^‰á¸ŃCńFaŔoüŁ2ĘńNb˜ťŽđm;Ўœň—ß6Iú†}?çŃýçë…ćp?ąƒôú&˝7:ĽD>š‘DňWϖIeůjżoŠ˙°ż_ł'2 yź‚ŘH˛Ä†ÔLlRcžë\zՆ'řQÇkŤ0ÚxŽ*ÓAzüf0@_BsľŘýN¸róِ×qK}ż+Ü9k ^ŮZ~Wţl{ş=`ůS/JS+ž&şYBďBœ†HESxŤ×HriNŽ„6Ź źŸŕÇžŚÖmü ŔŤűâ•ĘçÜgÍ!Ťël8dRö_Ě` ě˙eďĘťÚH’üßčSdŤ,! UéDăŒiš]ló{şŸ×ŁW’J EWW•FűŮ7ŽĚŹ[Ýëé}ăz6UŞŒŒĚƌŒź"~éúŁ ř——ŐnV ްžĐĐ­ëÝ~ě Źť€*}čÚŁń~ö• (IčŢ“€ÖJŘhŠc•}Ć Žż°ipg ĘăÉ~Łi~]DľŰąŐî ćĹ!yˆżŔ@@ď›Ę)Ş ;š–W‹¤ę…^ ž€g[’‡%˘§†d´’ƒĂąŚx‡Ă˜śMý*&ŇLxé•.ÎéaVŃJ)ť…Ň–ß=vt˛r<OÜ\Żů?ŕţţG*Î󣗚2­>Ş2ĄI0ävüŢAË;ţ–Ž;ÇjŁ7ƒ3óĐćWXOÖ dˆC/ţ8ľĺhV+耂~(‡Ú{ř˝ő.q‰ćK$ˇ(uc:}l‚Z‘ĺrÜŽĎĄ„Îmď 3›ŰąqňJew܂A*Ě ňbâÖzęđW.Ś^2¨T:Ze§â[FŒIt@Ş•ŠŚˆ_ÖŇ<Âą–8UÉ6ţ*+ä%Fk˜~”wĄěvٰź7q墑9˛Ł˝5ŞŤń-ş~¸8Č ‹6eŚ(ěŘł93b3ĄÁ\ˆî”ü˛4Gä„|HŞdS!šăeR˛’h( ŇCmœJ÷.™ŠŐżŘĽ¸j/€'ҙƆGj ęŻÂJ‹çޑ?ŚĘďŇk´Y;—ťŃxňňŒˇĚz…uv˝Śś„ÁiœA˛Î=Zžú3Ľ[RĹŘSˇäGĐ 0ug€é×ÝĐ+ ëěřmďEąoXgsŕţŚ€Ÿá”}Ľ2Óś¤4Ĺ6ŞvŮŢ_k;ŕŻé˙YŘÜÇxš˙ˇaîW”˙wÍlUô˙ŽÔžá˙|•KuT‰ŹőX7ĽŢ§öRŠ ŘIĄ%ôSűŠ”Ž죪͊Ů4ę~UŤ */ŕ-2ç¨ĂOIu䏂ď} RýjĄ”P|Ľâý‡Ű‹Ółböű4Đ@O˜öĚł]‘Űîçą§QŇv[*ĚÊ­ŞűV ./ŢĂCD ĐdMMhś~_Šd#›žlř{ő"ÄB›k˛5š†j5mNžÂPˇÍ׮싡ť…)B—–šäl?לlěŃGcKrG䩉ë .÷‡Öƒíť˛á÷ČĽŽ{2†›xQgÍޙútţŠ;=´źd×9K[›ŹĹ„ĚŚćăŘh<*źu0ŔěSč~*R‹ŘeřŚË'ç'ďóŠ.~o…‹ +|ÓöżŚţW09/Ň1+ôŁÎřýoÔßô˙WšRő˙őŮÉŰwgAÍou>EŚ$Őjłžě&ÉhCÍ`Œ€˝źYÇe‹ßPIľm}łƒnW”§ŽSF ”Ól~OˆŠĐ%żXjQŹ(Ćmr)°—ńŽř*K;sㆀ+heřŽmŚ‹Ę“ÔąĽĽtţĄă3z˝věfŚ´ĹO˘äA9ŽEZJ™Ţ %896•@şPÝJ„Ł€Yv2uÚ¸3|ý]_bă×Ȩđ¨…ΰK†¨ Ůá|Ä|hG˛¸+r䎍~™mĆ7@?ß§1/{эsěŔú.Sł‰ĺVž—, (lŚry‹°´>&×çÂ:OŤcC%t§]!í=ÔŢůËĹĺ,Bć軄i€Ž˙Óá„\‡ĹĹ+œ'şŘ5Ší˜ˆ‚Ξ`§Zܾͤ6ˆ?jG¸ÁÔ+Íz5č7Éň.Ą_6hіsAŹ %ÎÂ@!™B”ÂúQ”üzĘ_Ăđ)/Ż.Ţ8ZXę}j%(‚ľ}|B‘bËÜhŹo‡Č{`lš\ ”X”T˛yĽl/T3jI—ź%Ŕܤ•6ŠďÄM(QXVQLąiMÉXKŤŞZkPUÉ;VUĹ<4Ä,—Íćkűű˘ŁĎ×ÁŻrXĂŞÄ|­ŮźyhžD*`P=<@2ŽĐ|ĽĘ\đ'łŠC÷á~­ćkőL8ĽĚt€Ť)ŸăŠĘßĺdUĺ!vw Y̔ڹBVÜ âŕďkřŻ*=_ŕ˝}ă.řÇĄŮČҢę<%*üâzň*üŸSžŤ0ZƒZžËe˙Ôm–*,ôCὯ<ˆvŽ° ^­VĽŢƒčŽÝĺ°Z =WlJ˘M¨@0łŃQĆŐDUŻbqQЧé)˘Ř‡ů&¨çÍĚ,ßZŇę={)b!ŤäH^"°mšrŠĐźWŢ˙ݕ {^ŽâKôr‰ç×6rďÄÁŞ9”ŢÄ~Nj.Q čxńÎU#˝:qîœaٞÖtÔ˙mj`T*=yĽcAŔ˙J´5éwq°ôšQűr$ôs4DmŢőşz˝yWô&r{ƒů:ŁÎd#2?j‘œßx{Ö"CřÔ_čĘECÚWS2ĐőŐŻ(„8ZŢş ĽőT€:/JěA WĂÉ_xř€`2“ežvŤĚźÚ}á­4E™ĎňÔwĄö sôé˝.­ööşĹě“ÜDŚľSŢíJ˘1Bn*rSŹ7)fˇť¸ă…–&´ł(§ÜĘČj"3Bćá-K`öŻžŰ­s­9˙aÝnšĆňůĽÚŘ×řŸĐ†*¸ţŰ0żá~•k…†&iŘáR ;Œ/űV–ĂpŒČždýśýÎĎ$(˝‚źK×Ať‚ŽšJ*Ü FH@HÖh–Dęo5KbMTĆ}•Ÿ.~yw&ŕ„öěö;Ę Fˆ\gŸUŔtˇëŽ[l› ,ŠŢQĚk{W\B”d cĺ•ŔĂřRÔĄI<0‚ţ–œ$9’~*l;ü˛œćľ“L‹‘ÝHŒ—–7,hí1¸€Ľí#uŠ›¸Ą‚–mC(š:ýPźe‚yHđ­‡Ę&dç?ފ‰…ćIŚY6Ę;@Űr„÷oŽŽĎ>ţ|r ÓuAÔ i2††‚ŕhű.ÚŁ!^O9Ťý=9hŔŔ¨‰8H86ŠB=%óEîËíz\–žŻ-ŞšÓHFľ"ś~¤üő^œÁt$ń+Wpb‘Bs„‹ ĆbœĎ4´YVŽöíŞ˜„ÔyťŠoA4ˇg—'żśŢÝčýŐ>YłŇ(wR­¨­ăšQT1v!†ą8ŠEęuĄÁy¨ÜnlOoű/ŠöukMťúţ•żžhJĐ>ž„ç…4/ă}'Är$dPÜߟ#é*šTR$˘W¤FůmŞ”p0­Ý‘"ŮfQ^ä I2"Ł,—Â;ŤQ@’ŃěŞ?v#P-WH$•˘˜.n–ČGz Äď = ˝ ÂĚÜ2¸ŚÁŽňî› ĎąÝűńg# ńÔA׌Á€lćŇ(ű˝zvp˝łî@`ůéůőđŤohĆ/Ä-2ô÷ಞc]Y]˜Ë¨ýăŰŹîbčĄR—w¸adH:{1ňŚc—ŚÁů<=˛fb0P㠛Ót‚Čsv7›+{te9ŢČv€Uöôv-†*ňšcMîűŽÍŸrŚ"×MŁJOŐ}ӌD–F{/)…E#—wç/)…EJ1Čěź 8;ůĹŔŕçGA\œ ÷$7ĚĂĚîoVgÎÁÔ1˙a4żCÓw˜1~?,jŠ P~ŮŁe+i|Ő8`@ź+8Ô7#ôĺčÓ.3ô°nEíV4Ĺ{$ŽzVŻGۧăA~ŚĂ6őÔ÷dęAB ‚šâĆEˆQFśÇfSRoŁŞźEƒ°Ý‹V äž—֐Ňe`ÝšEŐ9řѰ‘ÂČëe쒱MčJLˆ}RŘl›ţ.šńŇz†žó]éxDAíú tŻH:÷[Kŕz?nđe‚„u%=‹P´¨ Ĺş0ôbSgě@KlYŤE†ťĐhá˘Ë÷ž´˘tYq/ă‚ĘŤš˜+¸p^h‘VąIŕRY+/Ť¸TqČtiA›–]4EEŕmęÔhř Ŕ]2Ĉá‚㐄1šý0‰ËĘh˛•b­Šh˛UźłĆyŸXŽ5l!θ˙[„úE{dľÎ<”2‘ƒâp˛Ô\díîÝŽŠ0(šÝő5îO ­+‹PđNăĊtpœĄ;ąíní2†!âCY ž5qWç08–ĂdN) “8E’‘ńÔąăߛŔ0™8’Ăą‹ŚEəŒĺ0Lœ˜ĂîŘv[HˆŽ&-–&ÎđŽ2L'ÜÓn(6ó$šYřYŒs\%7ótÁYř7œy’äÄň¸‰äĚw’XE9n":óŮY„ó¸ěĚŁÂłHĘă&Â3_"= Fž'‡ľ„`“‚EŤuDa•…Äáę:1ŠD*§tÁ˜ű’ą¤ˆV É<$%ió„eŇ2÷ĹeIF֕œy˘č,"zÄć38đTšmˇVPĺ™őşOĘľŕ,oÄoŽÔńĎW ĺvŻţáŚ6á\đÁĄj-ݝžg‹Wa÷.M’ŇDß0aŇŇoŔ´7#pËNlS-ó“˘ŕ(h4Ź?ŕÄ 8ßL=$%s8ăů' ‡1N0d^TMĎleifőž„4ďŠ3ЃY÷OďíX“ŇkřӚXôŸĂM\wfkĘ6"ĺČez0ƟÉů •Ľ^×ĹD])×O;÷ËáÁRnš"‡,Ë5rha֙ƒĚ7BAÍeŢ2ď>Ä@ŘăOńŻŽn -bŐŰF %ŮďžóŻ 7ZΡĐŢ݁<ÔQđ9ľ0ҤődČŇXX䂸ćčU/ą pY9ú=î FôŠ}˜<ô6q_bŸŻ-"ÉÔôńŠ­ěŽ2@ŇŢ2G›úh75Ô9 łNăůŔ ó_dh5Ú1Čx’vKuž0'ŕŽcÔňâőkôŇ˙§´‹ÚÚ §))Lڈ†V _'pQ”^ăčŒ^„ĹMFőĽ-gHçtĽĹ2ăÉąťxź_jŠ‘Ř˜ß?Ęţo űOçţ÷˙žĘ˙łZŻV˘ţ˙UxőÍţó+\Ťě?˙,ç)U›•ÐhúŇł>LčŃĂł„řýůéśurz{ńéäöŒÍń"äöŹ=Ćsv!˙gëć狟n#¤Sô‚Ö\…÷ĘÚi‚űůäÓYëć×ü˙îäôúĂMë稁 üç3…´‘MĽJ{čJM~ږD~!ŰI…ţŇ$Äźňf ^A2Ęl÷łĹÇBŔč#žŹÁäŢjľH]* †'ƒvĚ˛ŇH÷ęAÍ0˛EbA#)1Ş[äœÜq‡8äćŘţc ěŢ9Zů\ž4÷mĘŃM{aŁŚwÖ=b?‘˝żˇ|ŻĐ˜g­6ž‹­ˇÔ[­7żŢžľ>\ż=ťĆ. ~_œˇÎŢż˝8yŇň¤Ýżă:ŚĆ¸‹‡CŇtš˜LQfHÔö˘ŢD„L6łxćیoÇF™Z(v#űI‚” :Hîu ށnŔî1zÁâ>?˙3Žä Sz’çäë]z]ýR ; Iv+óHžƒĺ잤˘ĎKĄóO~„^´ĚđÐľáC´Ä!6ľB˙ Ś–tqqvRÁCOuT:=‹Â$ô‹Ű}č4ˇűůl1xŚ _á‹ňŤŠň+‹ý qăşqüě0G'Kz%ˇÇĎźÄbĽěÍĄÂ/˛ď´@ćĹł(ÓiáĽ×tTUšrÄŢ$υ㊪W:ތ'Šň9;žńÓŻÇłłácŤýCí{Ů gß?LťŰw@wÜCŻď˛ƒ49oßۃ żáČ^žöK&ó|~ˇ<ßkÍ6rőńö4×)öŠmÄQĘíćđ\úB!œËľó?ţXËr˝|1đş“×€‘b5“N(n€e92Ŕĺ&ç*.0Hڈ•c÷h—Ž(fW~D™÷ăŸ¸ý{.ΊČH€ ľBe7—›ĺwe*äžŃ~}ŚíľŢřo4.M^ćűƒ×ŠńŸŃ¨ŐŁřĐű}˙}kŠClĘQё T—ŘĐQŃÄŁY7›ľFŞOlÚQŃŐfŐlVx… R‹ƒbňQŃč ‰'ÎňőŇCďK F†žŔ?äޝźż:9?ť­çśfL:ŻY˙l ę †ÖhmîʧQꉽ˛zЍţ/UÉzí]ů<ô.^l¨ VῙő(ţ[Ľžo~k˙_ăú3ú˙Á\ożiý˙ŒŞÁŔ˜ňAmí‘:zŻă Źn×Ůs§ŁVĎöł|Až¸Ą]”Oo%Ž"ÁđXlŒĂouî 82IJnG2́Eř\ú"ӛXŢ˝„ŮZĎ˝î1üÍŃS‘ŕAfZű î2{ Ă­6Löö÷÷‹!<•Éůđ‚–çĚZ„ÚÁő= ’^ {h˜Ąo-"˙|š$h”ňŰ úˢŕŮpçr ŘíĂ ÇUŇ˙_FC˙~×ýż‡¨ÁD¤˙kiúf7űjüWŻ7Ş ˙ÍFm˙ŰřďŤ\ß uÔ8U74Î>tĐxńŠĚýŚYm4€‚˘sĆ3™ďŃKŐĺ)ĽíŇ qĐo;–3SŢ1đÎň˜J – "v÷2Űmëňâͧłë­-č ö őZźůxqůś…zčúÇۭWŁńŤLćf:÷Ś8‘łiPАmw`ꗸŒ§VHö2čhF_•ů¤œu¸ËÉ\ۄíżaP“šěwO˛)ÎŻ.3çxśfSÜĚfBœűÎxjĚ+żĺ˛Ě Ń=oŇ,—áďžKÔł˝žWžLŰx Ą=OĘŰs\őZ”śç˛<{ g{íT$“ gä™+4I4š"mŇĹf” iTƤ•(ihŸiŞ!ä•@T‹€™¤#Q`‘ވ…‡Ŕ$˜h?FcßŇđĄ?‚ć9ŔĐZQ;śc˙ÖźÜŘš^ü{Đ ý”ąK4F/Ű^§ětöşe,ó˝n㠊ăľýŰ´ďŕv\ťď”_B!4%R äŠä F×*ţČ Ŕj˜ş öĹňđuW‰(űĚŃŠýě•Úş›°¤Z“É ßąäjŒ+žl§ËH ŠW˛FÝŇÄńBkGŇ2’Š^Uڃl¨öE˛—ńżHć—Ç´‚@:Ü~›ş¤ŚŰG§˜QW0Ôť<ƒۗ”iLWb­:ĐgŒ""´hŮrŢ2!5Í3\N2“ˆ×‡Nż´‚ŔCčaţÔ'‰™ÂĄ’Ýͨśßő“Eă€Ä=gśŠ-fś•ńŚAaqúÓĺÉůÍq6+NŻŽÔ3Ö0+€Œ3%§'~¸†ZćúƺΠ@ącńĂ<˛Řžˇ@ąc*@ąN˜Œâ–‘x$QŁVNju§™Č ݁NíÍhtLŏżVç§Ó}L†Fř˘đ,ö€Z%węŰÇđ’űŰEf0%hbAÉQ3w˙čCőBĆ0ľ)¨ĺÝŒ_’{ᜆnŕť÷ëuţ€›ŻO >ŞŹşĂe<jƒŒœÓj•¤’{>Ú2‡Ć }°—v˙Yü’y‡v*_Ž":łí 0mAcŮŮa›‘D†ĹŇL?žpxŻ9ťôí߄H?ŇĽ•J 0ţˇ˝kýMăâýzűWl1­Ŕöa°C8­U;‰Óú!?UŠd°Ć'gqŕG’öoďüf÷`üŔ­"ľß{ěĚžwvfo†eĘĘyîŠĐăU Jšd|űTSśĎi_é|K§ŰúŁţX%Ť“•|eĄŻ í~“,ké)-I”’–´@%œ¨łúŽ7CƒápPň1!ůŁŹ0$Ą3p…ÄďägĎ\ŠéÓbbâ㟕Údrƒ348ůĄYëÖ<ýčä°{¤Ýgבֿ3B3‰iʃŠĹyĘŚiŮó^t÷é['ŰŰJ\“í™-şóٖd#]y|ĄŇó8ĺř÷ƒíB?ęzuˆ%ĺţ§˝ĄírMë<҅˝hh%jwŐĽ~ä:2ŒÓ7ęMť\@Ä#Ž>Äd7ÄÍ÷čl˜ç”•˛ç3űýńüYvwřvŁŕuîi˝Óçă5ŽóÝńŰöáŃÎţ^ľ‚+9ę.xˇďť‘rg Đ#ssiZCŸcÇóaô#eôŹXDĽvČJähN>ĽÂy/_*h˛Ę3–ň"ěv1şg,'ć@R¨”'ş˛8á:]#҉ňŠUÖ´š/ĐÚ"CMJžôĽ *óDŔ´„‘ŕ)Ş?ۀ闤4–ËhP ˛š2qĐRŠéE @ @ @ @ @đ_Ĺ_&Ŕ:űđgpm-1.20.4/patches/done/unknown_stat/gpm-1.19.6-patches.tar010060000017500001750000000240000760216311400217700ustar00niconico00gpm-patches/0040755000176700017500000000000007426325416012320 5ustar flakeusersgpm-patches/gpm-1.19.6.patch10100600000176700017500000000605107426325151014722 0ustar flakeusersdiff -Naur gpm-1.19.6/doc/Makefile.in gpm-1.19.6-new/doc/Makefile.in --- gpm-1.19.6/doc/Makefile.in Wed Oct 3 21:51:46 2001 +++ gpm-1.19.6-new/doc/Makefile.in Thu Jan 3 23:49:03 2002 @@ -71,7 +71,11 @@ all: $(srcdir)/gpmdoc.ps $(srcdir)/gpm.info $(srcdir)/gpmdoc.txt $(MANPAGES) $(MANPAGES): doc.gpm manpager - gawk -f ./manpager doc.gpm + awk -f ./manpager doc.gpm + for i in gpm-root.1 gpm-types.7 gpm.8 mev.1 mouse-test.1; do \ + expand $$i | sed s/^'[ ]*'//g > $$i.new; \ + mv $$i.new $$i; \ + done; # why gpmdoc.ps and gpm.ps gpmdoc.ps: gpm.ps diff -Naur gpm-1.19.6/doc/manpager gpm-1.19.6-new/doc/manpager --- gpm-1.19.6/doc/manpager Sun Sep 23 20:00:03 2001 +++ gpm-1.19.6-new/doc/manpager Thu Jan 3 23:37:35 2002 @@ -1,6 +1,5 @@ -#! /usr/bin/gawk -f - -# Warning: this uses gnu-awk features +#! /usr/bin/awk -f +# Copyright (c) 1998-2001 Alessandro Rubini BEGIN {IN=0} @@ -23,18 +22,32 @@ { gsub("^%M ?",""); } -# itz Wed Sep 30 10:28:58 PDT 1998 +# Use gensub for converting tags: itz Sep 30 1998 +# +# However, the gensub function is gawk-specific, and we want things +# to work with original-awk too (for portability). +# Therefore, use a normal gsub, even though it's a subobptimal solution +# as it may step in extra braces. The good solution will be piping to sed, +# or match, extract subesxpression, replace, reinsert -- bleah... +# (ARub, Oct 10 2000) /@b\{/ { - $0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + #$0 = gensub(/@b\{([^}]+)\}/, "\\\\fB\\1\\\\fP","g"); + gsub("@b\{","\\fB"); + gsub("\}","\\fP"); +} + +/@var\{/ { + #$0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); + gsub("@var\{","\\fB"); + gsub("\}","\\fP"); } /@(samp|code|file)\{/ { - $0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + #$0 = gensub(/@(samp|code|file)\{([^}]+)\}/, "`\\2'","g"); + gsub("@(samp|code|file)\{",""); + gsub("\}",""); } -/@var\{/ { - $0 = gensub(/@var\{([^}]+)\}/, "\\\\fI\\1\\\\fP","g"); -} /@xref\{.*\}\./ { gsub(/@xref\{.*\}\./,""); @@ -55,6 +68,7 @@ } /^@table/ { TABLE=1; } +/^@itemize/ { TABLE=1; next} /^@item/ { gsub("^@item *",""); @@ -63,6 +77,7 @@ } /^@end table/ {TABLE=0} +/^@end itemize/ {TABLE=0} # discard other texinfo commands @@ -78,9 +93,10 @@ gsub("\\%","%"); } + # remove leading blanks -/^[ \t]/ {gsub("^[ \t]*","");} +/^[ \t]/ {gsub("^[ \t]","");} # put a .LP at blank lines diff -Naur gpm-1.19.6/doc/mktxt gpm-1.19.6-new/doc/mktxt --- gpm-1.19.6/doc/mktxt Sun Sep 23 20:00:03 2001 +++ gpm-1.19.6-new/doc/mktxt Thu Jan 3 20:08:31 2002 @@ -1,6 +1,6 @@ -#! /usr/bin/gawk -f +#! /usr/bin/awk -f -# Warning: this may use gnu-awk features +# This shouldn't contain any gawk specific features anymore # Program to create ascii from info; # Missing: table of contents @@ -29,7 +29,7 @@ NODELINE==5 { printf "\t\t\t\t"; NODELINE=0} -/^* Menu:$/ { KEEP=0 } +/^\*\ Menu:$/ { KEEP=0 } _______________________________________________ gpm mailing list gpm@lists.linux.it http://www.linux.it/mailman/listinfo/gpm gpm-patches/gpm-1.19.6.patch20100600000176700017500000000156307426320522014723 0ustar flakeuserspatch -p1 <<\EOF diff -ru gpm-1.19.6.orig/doc/Makefile.in gpm-1.19.6/doc/Makefile.in --- gpm-1.19.6.orig/doc/Makefile.in Wed Oct 3 13:51:46 2001 +++ gpm-1.19.6/doc/Makefile.in Mon Dec 3 19:02:41 2001 @@ -86,7 +86,7 @@ # install & uninstall installdirs: - $(SHELL) $(top_builddir)/mkinstalldirs \ + $(SHELL) $(srcdir)/../contrib/scripts/mkinstalldirs \ $(man1dir) $(man7dir) $(man8dir) $(infodir) install: all installdirs diff -ru gpm-1.19.6.orig/doc/doc.gpm.in gpm-1.19.6/doc/doc.gpm.in --- gpm-1.19.6.orig/doc/doc.gpm.in Wed Oct 3 14:35:54 2001 +++ gpm-1.19.6/doc/doc.gpm.in Mon Dec 3 19:00:57 2001 @@ -86,7 +86,7 @@ @subtitle A general purpose mouse server for the Linux console @subtitle @value{update-month} -@author by Nico Schottelius +@author by Nico Schottelius @end titlepage @setchapternewpage off EOF gpm-patches/patch1.readme0100644000176700017500000000121707426325066014656 0ustar flakeusersFrom: Mark Hymers To: GPM Mailing list Subject: [gpm]At last! Awk independence. Date: Fri, 4 Jan 2002 00:11:39 +0000 Hi, Sorry for the repeated posts but we've got there this time. Jason Gurtz and myself, having thrown ideas back and forward have made a tiny adaption to Alessandro Rubini's new manpager and put in a little sed hack which means that the man pages now build cleanly on gawk, mawk and the original awk. Hope this is acceptable. The patch is against gpm-1.19.6 and includes Alessandro's alterations to manpager. Mark Mark Hymers BLFS Editor markh@linuxfromscratch.org gpm-patches/patch2.readme0100644000176700017500000000066607426325416014665 0ustar flakeusersmkinstalldirs was moved, but doc/Makefile.in doesn't know about it. The following is the patch I use to compile (it also addresses the texinfo bug, but I didn't feel like breaking them out). Cheers! mrc -- Mike Castle dalgoda@ix.netcom.com www.netcom.com/~dalgoda/ We are all of us living in the shadow of Manhattan. -- Watchmen fatal ("You are in a maze of twisty compiler features, all different"); -- gcc gpm-1.20.4/patches/done/unknown_stat/gpm-1.19.6-patches.tar.gz010060000017500001750000000047500760216311400224210ustar00niconico00‹Kx<gpm-1.19.6-patches.taríY{S9ç_ϧčr@lĎĂO˜@Î$! {@¨%WŠŤ8ٓgd[ÇĚhjFƒq÷ŮŻ[3~€1š˝Ű厜ŹÝزÔ-ľZ­_?Äa5fĘňÔZűšm7ěvł‰ßśÓnľóďŚMߓśfˇľV˝Öl8­5ŰŠŐkö4ץeŠb ŔZ?`üA:ž¤k¸6˜ťę;ŚłkśL=äüV÷ďŘvËś—ÝËn:Óűw¨ď4ÚľÚŘŤű˙ݛ/ú}¨ž˛,Ůő[žôŹÔG_ÜŃÜT5⣝ÓFľZ}€ťô‰űđÁSu¨9nÓq-¨Ą ĺrůK—>3ř‰Ešˇî6v]ťNź5ŁÓjŰŠ´ĄŒŸŽŽ,\ŘŘJĎÉ6Ů3.gĆéí1\ś/ÉԕÂÁ“ƒÓłƒw‡çŰó?] $…E1đĨ–ltŐ>˜ÖdpBe”KÍőe Ĺ&R*ÓŃ]5ŽyjśŠoî@Č/q<”hzUĹS$zk@(ńŤ˜E>llř)*8ľžn~†/Ď7-k/iÂD}žČŠĂËÉ}烞Œř :ĺS Ç0S­KÄŠ1uKĹĐrƒ™žóž+)mŃT&sĽó,‚săEăťś]ÜőR;™2Ţ6’zŰ­7gFâTZPv*M˛ęÓ'`eibőDdˇgTq>ą$ŃŔ5) ĆSDY•HúœŠ,áŠQžç.˜ËOᵌlj lyŰŕěîîTIj8xš˘2 ?gČ"HٯߝÂőŃéž}ƒżIŔZ˝âě@šVŤÔkڌ (AŃŽaf˝­őŻĎNŕĎë•őőí@|(ąP߀^iŹnƒcťľˇšgo>j!H´żŚ<Â%€LΓŃ%Ož¤Ž^cŸł×{9âHWA]ĚŘłČSBF€Ú!ĹUӘ{˘/źŠś—‡‹i/Ś@IÉäFB A˘~DÄ­O%%l‘8ąLë‰@¨ńśI<‡<á8Ă+tŔ ’IČ­ƒ  Ln łÁßDC—˝X "Je‘„´K‘_ęR…ÇÇƯT —0m)ý)ŠĐă‹XŤGŇŁŞĐZ(hHް’݁8†ťňô*F“H‘ľ \—:"B7Ąźp64M}Ž­ƒŸé„ŽM–i#źX^÷ڂkŁ °aĂ~Ąé-=žőůë͗ňv÷ĆŞŔz[˙UˇëčΚÁíŔ(<ýOsŤ"$˘[ăݛ|ôLŢ€Q6ĘVç’%šŔ‹ëŠĹ­ŘZłüpsŔ́tľ•˛0ţîIŸ'×°˝Du‹dˇ¤ú{ˇ[Ű\Žż_É]œd‘+¨wŽ”‡Ţîœ*đok˛:ŃĚ>™îľůź{Ó5iI(v˝3“ @xÓl"śvĐwڔJ7zĄŻ|ŒˇŚČóńŕŐńážC€SĆYĄx(žósł>‹É DcMąkÇ Óđ|}&LŤNÂ´Ű ÂpD•Š@×ůnv. MMĽ™MiWć‹Ôc‰ą+ĹŻ´ł÷dˆÎÂO ÄmďTvĄź‹¸kť÷Ô}†˘=Ó7•KRŚ5ĘKř }†^Ŕ˘‹T_ä×ĎĐU_ŹŇuq>ýł8ž–5ŸŸjdžlBĽĹŽ3…pfŸSůˆˆÓ.8Ü ŠYîsŒ4qŻŤĽ‰_ďg5ן“E–ˇî,8ŮÖR'{Ÿď„EÇKMЏďEĐF‚ń?đŁMEÎL1DvľG‚‰Gš2ŃTˆŢrŸ%r°°ÝKLę ýD†@fň‚¨N˘ş–‡Œd_oÄ#•ćÎz—BNýI–súáÍáńŃéáţ~“EœˆHőńÍŞüżő3ŠÜBÉhžĂ 2wĂ"–żžíŰůë>ďŢ;Ľ`üň뚑Ťč^Ńf‘*čP'5q,ť2…2†JĹŽeFŁé˜E<řZ,"%ľP€lkŤöGlĺ˙ľÇÉ˙fŤ>É˙í&&ţ:˙ŻŻň˙Çhú˘Ą;°ˇ×=üđśp7I6çL ߨ ü p/ű|QŔŠ// ,đ`°ţ†{šo׾knĂÉůwZ„Îú“Đ“¤Ż#ű?A}ÂҢ‹é?&ś˜Čolż?<>ŢÌ_Éř—^&_׋9R6ϑN Śi‘HDĎJ˝DÄ*]ŕĂpbc AŐ!ĐÝöŹťSt mŠ[š“Ń-‘üsŤ=|CEáž šÍ,˝ŸÉ­ëi`>í6KŻgŽíÎíŘnł˝ôv: )ĄĐÉPüËLââ,‰%ú]ôŔ,ÁńÁđČăŚń­ oQ†Î0(ŤÄÇq똧‘Ć{Q1Œs™$ă)$¸ňú€ĄRča5⛗TÚĄJÇČ_'J„¸ńKŢe‰úŚkVá8ĺAżCvŠK>ĂDŽ">g¸ó.4î5˘|‰•˜IƒQń˜›*G˜N,Tú6S Zë´"J+QŠGé ęL!LT´Ň6ŁĄ@rĄ¨CŚE'V ^\HŽ@;$đ0‚1ঔđThtaĐÚÄ1Šąâiß˸8>ţĎ<Ç:ĄÁ*~ĺnŸfŒ|ˤkaE䙏ťĎŽFˇáŒŃŠQRiLއk’埅•¨ÁŤăˇçpč %cšYĆ^‰Ź—Ť,ăŽ˙ľGÇ„ü֝ż˙6Z­ć ˙ŁÝTG}Tëň+Mď†üžä)•^.“XO˘ŠQú2䈀”w 1GşœŁt .Će`K(đT"€úTAç9uQŠ3zŮ ßű|Ąë<}ÎÄĚ =´Ě‹Şy¸űś9Ž|3ăőăE=1ÂÄĂ8Œâ|ž÷ÖÍgÁ@úŹ#ŽĚc4šř/Ÿ˘2ČlĚúgAjŸöћP$.űx"”Gű iáÓ!óQ#8uÂ"DpĹ"菟HʐGFŸĄŽakýo2Ó+iG˛oşŔ¤Fč;Ç %ÓúUEoHá>ş˛HŃß~(p÷źLŽÚŞ­ÚŞ­ÚŮţ‘nCą(gpm-1.20.4/patches/done/unknown_stat/gpm-checkdevfsbug.patch010060000017500001750000000022200760216311400227230ustar00niconico00--- gpm-1.19.4.orig/liblow.c Sun May 27 22:53:22 2001 +++ gpm-1.19.4/liblow.c Sun Sep 9 19:49:12 2001 @@ -183,6 +183,31 @@ } #endif /* SIGTSTP */ +/* + * check for devfs + */ + +static int check_devfs( void ) +{ + + int fd, retval = GPM_IS_NOTHING; + struct stat buf; + + /* first try the devfs device, because in the next time this will be + * the preferred one. If that fails, take the old console */ + + /* Check for open new console */ + if ((fd=stat(GPM_DEVFS_CONSOLE, &buf)) == 0) + retval = GPM_IS_DEVFS; + + /* Failed, try OLD console */ + else if((fd=stat(GPM_NO_DEVFS_CONSOLE, &buf)) == 0) + retval = GPM_IS_NOT_DEVFS; + + return retval; + +} + /*-------------------------------------------------------------------*/ int Gpm_Open(Gpm_Connect *conn, int flag) { @@ -196,6 +221,7 @@ /* check whether there is a devfs */ + devfs_id = check_devfs(); switch(devfs_id) { @@ -203,8 +229,7 @@ break; case GPM_IS_NOT_DEVFS: consolename = GPM_NO_DEVFS_CONSOLE; vcname = GPM_NO_DEVFS_VC; break; - case GPM_IS_NOTHING: oops("No console to open"); - break; + case GPM_IS_NOTHING: return -1; } gpm-1.20.4/patches/done/unknown_stat/gpm-checkdevfsbug.patch.gz010060000017500001750000000011460760216311400233500ustar00niconico00‹Kx<gpm-checkdevfsbug.patchĽTao›0ý<~ĹŠ“&Ňľ)RÚf‘ÚP‰Ş_“X!62N˛*ęßŮĐjÉşÓ@2Ć~wĎ÷îëş°ŞˇŽ×÷‚ţeŸ şTtYńC?˙’ěĚK\Ež2ŁUă€Ě6DĂxU@ÎYĂ+˘ Ĺřî0Ó!xM΀(˘i–ĹXŐaŞ2oď^î“t/’řá΁oX›eÁx CK'ţC %é8ďńtŐSġg„¤Rő—§¤‹řßyągÜˆŘ ÖuCŢpŔ#š˙){)[ĚęmŁ”ŚšL9cMĐĂ™ÓÚŚĘV–ÇÖşÁ•˛Žď{ÎľvŽşľF­Ak‚íއEi ëüŇJĽç):s|âV+RIš•ůÚ|ÇXjíˆůŻ?97Š7čxŐľ$ŰDí<ϰ ç:†ďb:˛Őůź1ěóĎś_ŚŃ ‹ű ‹útBŕźn̋˙°…äڛVŐe°˙šĄkłëE­œř;0~™‚Ťgpm-1.20.4/patches/done/unknown_stat/gpm-evdev.tar010060000017500001750000000240000760216311400207200ustar00niconico00gpm-evdev/0040700000076400001440000000000007260203342012150 5ustar philipusersgpm-evdev/README.evdev0100600000076400001440000000426507260140551014150 0ustar philipusers GPM SUPPORT FOR LINUX EVENT INTERFACE MICE Usage: ------ Simply run $ gpm -t evdev -m /dev/input/event## Just as it if were a serial or PS/2 mouse. The hard bit is working out which event device your mouse is plugged into. The way I do this is to run $ xxd /dev/input/event## For all the event devices (in numerical order), and see which one produces output when I wave the mouse. Note that you may need to pass a `-r #' flag to gpm -- I find that it is a tad too sensitive by default. FAQ: ---- Actually, these aren't FAQs at all since this is the first time I have shown the world this code... 1: I get no output from any of the /dev/input/event## devices, what's wrong? Execute the following commands as root: $ modprobe input $ modprobe hid $ modprobe evdev These will load the driver if it is available. If it isn't (i.e. if either of these commands fail), you'll need a newer kernel or a backport - I would advise getting a newer kernel. It may also be worth checking if you are also sufferring from the problem solved in Question 2... 2: The mouse moves randomly all over the place, or does nothing at all, yet I get output from /dev/input/event##, what's with that? There are two possibilities here - you may have other event devices such as USB joysticks or keyboards attached, and the device node you're looking at is one of them, or the major and minor numbers of your device nodes are incorrect. It is worth noting that, as shipped, SuSE Linux 7.1 has the wrong minor numbers on it's event nodes. If you suffer from the first problem, just try the other event devices until you find the mouse. If you suffer from the second problem execute the following commands as root in a bourne-compatible shell e.g. bash: $ cd /dev/input $ umask 22 $ rm event* $ for i in `seq 0 63`;do mknod event${i} c 13 `echo ${i} 64 + p|dc`;done 3: I don't have a /dev/input directory, or the directory is empty. If you use devfs, then (as root): $ modprobe evdev should fix it. Otherwise, you can run the following commands as root: $ mkdir -p /dev/input $ cd /dev/input $ umask 22 $ rm event* $ for i in `seq 0 63`;do mknod event${i} c 13 `echo ${i} 64 + p|dc`;done (c) 2001 Philip Willoughby gpm-evdev/gpm-evdev-patch0100600000076400001440000000505307260202347015070 0ustar philipusersdiff -ur ../gpm-1.18.1/configure.in ./configure.in --- ../gpm-1.18.1/configure.in Fri Nov 12 13:27:37 1999 +++ ./configure.in Tue Mar 27 22:11:46 2001 @@ -49,7 +49,7 @@ lispdir='${datadir}/emacs/site-lisp' fi -AC_CHECK_HEADERS(syslog.h linux/joystick.h ncurses.h ncurses/curses.h curses.h) +AC_CHECK_HEADERS(syslog.h linux/joystick.h linux/input.h ncurses.h ncurses/curses.h curses.h) AC_ARG_WITH(curses, [ --without-curses disable curses support even if curses found]) diff -ur ../gpm-1.18.1/mice.c ./mice.c --- ../gpm-1.18.1/mice.c Fri Nov 12 13:27:37 1999 +++ ./mice.c Tue Mar 27 22:11:23 2001 @@ -60,6 +60,9 @@ #include #endif +#ifdef HAVE_LINUX_INPUT_H +#include +#endif /* HAVE_LINUX_INPUT_H */ #include "gpmInt.h" #include "twiddler.h" @@ -948,6 +951,42 @@ return 0; } +#ifdef HAVE_LINUX_INPUT_H +static int +M_evdev (Gpm_Event * state, unsigned char *data) +{ + struct input_event thisevent; + (void) memcpy (&thisevent, data, sizeof (struct input_event)); + if (thisevent.type == EV_REL) + { + if (thisevent.code == REL_X) + state->dx = (signed char) thisevent.value; + else if (thisevent.code == REL_Y) + state->dy = (signed char) thisevent.value; + } + else if (thisevent.type == EV_KEY) + { + if (thisevent.code == BTN_LEFT) + { + state->buttons ^= GPM_B_LEFT; + } + else if (thisevent.code == BTN_MIDDLE) + { + state->buttons ^= GPM_B_MIDDLE; + } + else if (thisevent.code == BTN_RIGHT) + { + state->buttons ^= GPM_B_RIGHT; + } + else if (thisevent.code == BTN_SIDE) + { + state->buttons ^= GPM_B_MIDDLE; + } + } + return 0; +} +#endif /* HAVE_LINUX_INPUT_H */ + /*========================================================================*/ /* Then, mice should be initialized */ @@ -1406,6 +1445,14 @@ return type; } +#ifdef HAVE_LINUX_INPUT_H +static Gpm_Type * +I_evdev (int fd, unsigned short flags, struct Gpm_Type *type) +{ + return type; +} +#endif /* HAVE_LINUX_INPUT_H */ + /*========================================================================*/ /* Finally, the table */ #define STD_FLG (CREAD|CLOCAL|HUPCL) @@ -1532,6 +1579,14 @@ {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + +#ifdef HAVE_LINUX_INPUT_H + {"evdev", "Linux Event Device", + "", M_evdev, I_evdev, STD_FLG, + {0x00, 0x00, 0x00, 0x00} + , 16, 16, 0, 0, NULL} + , +#endif /* HAVE_LINUX_INPUT_H */ {"", "", "", NULL, NULL, 0, gpm-1.20.4/patches/done/unknown_stat/gpm-evdev.tar.gz010060000017500001750000000043330760216311400213460ustar00niconico00‹Kx<gpm-evdev.taríXmSŰHć+ó+ş u,۲ąÍB–\đ.LvˇŽî!í ’FŤ/áżßÓ#Ű@Br•ÍŐ]š ô6==ÝOżLűQP’CO+ ŮvÝްmÜm{ŁY7÷j=żOhÁި5횽ž^Ż-ŘŐZľa/Pcá;P–¤NL´ ”Ż˘ĎńÉ8YřżŁţĚ˙g­˝ăVŮź|c˙Wmťůi˙×kÍFî˙jÝn4ŞŕŻ˙Űs˙˙ĺ´xpzLç§§ŻĎ:´˙úŒŽÚ'żQëMë¤Cí“NëlgˇEÇíݖ‹‰Ó—[bądHœŤ ňÇg!‰g„P˘RJ&€¨P…ŁJ…Q–VäP†éň˛ř h““JIőh$cIXĺř¤c:=ŻÔ(ЀşLÔH8ąG—̝ĐHÇW*ě“ÎR1(w@F*aĺJë,Îç2sägýžôH…ŠžČ9cj“§)€ŠĐŠ__{)ťßż|°TBR˜ĐŰ5Š{2^ľČ =؂…Œr:”"Šľ—ńč É‘!t9Ci¤ćŚ q˘Sţŕ¤lP4”P>Ő9IˆŢ–bZ^ĄžďôůŤAşI=…5ÍDƒ‘p(uxž†"a˘R…….ÇĐťçd~Š•÷w~™řOě¸iűĆë؜X†+)KŚĆôD…Žź *÷T Ś*X~CD2УЌÁCž—sťÚ“ĺ2ŹnŻ/S ő…^Ź€5&Ý3Ó>†~ ´Ĝt%ŁX‡ýż Ńş–n–ćŕő´ďëG„Ťƒŕ'YąÖé|hč_"XđýĺÝ5á*:‘‚Ížfą€ž˜5@gč(ßšô98ۓ XA•ńIő„T˜Ô¸™^=LD€Ŕš+XŔřÖÁ ńOW2Ľ ~‡.÷*Ňq*Řľ#LÇ*H€)[úp둚pqüDÓĽń@: w ]NŐ9 N3ćH˛^OĆ1K2N`+_”hh†~Éd’*RÍx°śeŇ'O­@Î1ŹŇ?61˘$#Éw\ią)žS¨ Źł %KŒy(܏ƒ?u:ź[8¸áxh›Ľt„ŹĐI˘.QŻS……ĚPi–:”¤'fm’šš8Eďô6şW Ť{%Ǘ•†Ă>u€ž—'ł ‚źş„ˆgăżX _뫉aˆ äůÄべÝäľóŽ  ń„Zq‰ÝƒůL™Ę… šِf:ŽĽ›ć.ÍŤŹ†źƒ`qt'EŹŢyvޢ#f×bŁ\…Íyvš<ůpŃĄ 8s0̚đj;<"î˘!OďILXôŽëuÍŘ#˜Š,L•o$MJ‘œŐďOʐHWƒsv2ĎhńůŒć°D~ťP–09ŠÂtŕ!˛Ü/#y’'ž{ż–ă= œäŠj5<ĆAŽýž{@HąŘˇ‰üƒljŽż}Ž˝!¸@9׳uK.U×é­tšĚ{łNEŠŢ{.sŁÂ‹ő-łŠp0çÜ[<Ĺ>Őńxł/ěcDéřΜ_˜ŰKLAŠ01~uëăz…˘Ë奧Žá\ˆxÍžĄT˜*CŽš]ů uň *Q)zÚwąŕŽR =!š&Œ~EÖY€­ëǨ?ÚÜ|éiˇŹÜ˛ă–łŤbaNßž˙Ÿ=•]îŕűő˙ ťą>=˙ŐÖëŕoŕź8ď˙żyŞ×Łö¤rŮD@ľ\ýĄ\­ F÷T?‹eŮ]~đ*Đ;~†{q?Vt˘‡T­!íˇj[ëTÝÜÜĹbńQ‹LŇ1ŕŻm ¸lUŤ[őŚ)âĺK*Ő7­ *šë˗‚ŚäŤ$BÍÚ^yvă9hwU|[‘ă&4ź˛ÄĂ+•Q(íěvw[ť?wq¸m’qâë~y)Ř;+Ó6B7‹lł§ĘěĂôaUżB`ţÁTЧŠ'AX`çě űkťsXČ,A˙ ´űÜĄs*ĺ_§hx*á–t"ťmĤ)žÜšN>÷tz˙\Ÿđv€˝źěÂ9ůĂ#ΞäŰ ×G^­­ßyľi[M*âşiźşŒÖÇĎĐ\ýř!€/0(Ch XŠËއC îźiuÍ ľŰ>9˝čty衄 â/0bŚSeí‘y´Va¸g“—`l;ÄźĽűӑň<_Ćü™•ߏ˙ŔÚo6ŞV˝fô_ŒeŠŽ„ěç‚nż )* Lă3Š(wósrá ş-ÓS­3`Ďptë‡hĆ]œiŁĄw#ŠŽ8sÓüPÓÍ[1>o™§çĚPjĺ­R 7SáołQ‹XŽ…#ݟ}hácIŤŤF+Ěf•Óq$i{›Zoşg­ŁUf şÉoňňĄyÁŘý Ź‹ĆžŇ ďšśąŕMŤwJ—‡ŽŸÉçSŇçóű'Ľţ~_ęř‰Roůöˆŕ{ŚýÜúýiŚ˝ęœtZűÖŹ‹Dm.ł4ŐaB˙ÚŚƒÓăî+ĂoŸ`K=nďíľž,7çűÉgíƒĂ'(lŘžFîy{ď?Ń×ÜxűĺD- Œm#âÄÇJ8Q†qŢI3m~,Ŕ‘Ňń‘"^^ 8éŤuťÉY–ĽaUë“ÍhbŃÓSŸ“˝Ăaˇ&Šíi@= žw/íĄJ8˙؃ŁŔ$OďfňŠÓrđ@‰˙’ű*œýŒDŠŮxdX(ŽĎ;{ÝýŁ*ěň/Ěďw^ďî˝?ź8ÝE91ř6ÖkßĆĆćž7KŁhÉĘqé@†*Kp.řÇôSţ}†—I—Źťś€ŮFfÄr)—6˝ÚÖüÔ5§9ÍiNsšÓœć4§9ÍiN˙Ëôoj (gpm-1.20.4/patches/done/unknown_stat/gpm-newmouse.patch010060000017500001750000000024470760216311400217750ustar00niconico00--- gpm-1.19.3/mice.c.orig Tue Mar 7 15:10:00 2000 +++ gpm-1.19.3/mice.c Sun Dec 3 01:49:35 2000 @@ -1637,6 +1637,23 @@ return type; } +/* + * This works with Dexxa Optical Mouse, but because in X same initstring + * is named ExplorerPS/2 so I named it in the same way. + */ +static Gpm_Type *I_exps2(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + static unsigned char s1[] = { 243, 200, 243, 200, 243, 80, }; + + if (check_no_argv(argc, argv)) return NULL; + + write (fd, s1, sizeof (s1)); + usleep (30000); + tcflush (fd, TCIFLUSH); + return type; +} + static Gpm_Type *I_twid(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { @@ -1993,6 +2010,9 @@ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", "", M_ps2, I_imps2, STD_FLG, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused", + "ExplorerPS/2", M_ps2, I_exps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, gpm-1.20.4/patches/done/unknown_stat/gpm-newmouse.patch.gz010060000017500001750000000011710760216311400224050ustar00niconico00‹Kx<gpm-newmouse.patch­SkoÚ0ýL~ĹŸ€pmhRťvH°M‚J“Ś)Jƒ!VóRě :ĆßuÂ:č]ĽEÄ8śĎšçž{ÝnˇąÎâśÓqˇË@t‚NšËumQĚü¸€s6třsô8ç–mŰżbjó"Á•ÜöC÷Ź:>Łíœťěvůßs1[rĄ‹<~ČÄČÂނew[–ĄTؤů=R‡DźÝúxŸiřfiĄĂ]Ąq'Ÿ> |„ňc3“Zé\&뒉xZ^âÍ6‹Ň\äćÝTŠÉa]jÖĄ¨ŕ˙Ąc€]ËVÚ§x¸ÉboAњxb›Š^C&Ť%C‘(šNˆC…iNK‘żV̲kľHAč#ŹI’Á ý|0!YŰjŃǗŚeď($ńYË#ĘůôŻąCŻď2c({:{E“ýȲ …\Ą„"¸÷’Ô3܍*ZŚůĂđwˇÓé°ÉĽh˜l”CŻü*RâPNł92ű…Š„ČĐpŠ’źZŇÁ**TX—“ëéíümľuRP{O!đőF.ŸńäáË,ÄŽj´ÁŔ5ÖăgƒCŸýýŮńmŸ,<9ß3šä Ż~{f¨vuS ÔÍë3äŠJW“D‹(’ąiL4č@mşÔĄ:MĂ&"˘\i{Yg'šęÄ5óÂ0ńJr†ůâĘťžŢ0ăéłâƒƒŕă‘Ä÷Ÿˆˇř˛+ńÉĺ]zź˙ ýXRýřRçQĆ9Ę˙/˛ąr)Ü  D.ýčĽ5 RŁ=K2†ËůžýÔ˙FÁh'gpm-1.20.4/patches/done/unknown_stat/gpm.screen.diff010060000017500001750000000117120760216311400212170ustar00niconico00diff -rcw gpm-1.19.3.orig/liblow.c gpm-1.19.3/liblow.c *** gpm-1.19.3.orig/liblow.c Tue Jul 18 14:06:06 2000 --- gpm-1.19.3/liblow.c Thu Nov 30 21:18:14 2000 *************** *** 77,83 **** unsigned char _gpm_buf[6*sizeof(short)]; unsigned short * _gpm_arg = (unsigned short *)_gpm_buf +1; ! int gpm_consolefd=-1; /* used to invoke ioctl() */ int gpm_morekeys=0; /*-------------------------------------------------------------------*/ static inline int putdata(int where, Gpm_Connect *what) --- 77,84 ---- unsigned char _gpm_buf[6*sizeof(short)]; unsigned short * _gpm_arg = (unsigned short *)_gpm_buf +1; ! enum { GPM_FD_INVALID = -1, GPM_FD_SCREEN = -2 }; ! int gpm_consolefd = GPM_FD_INVALID; /* used to invoke ioctl() */ int gpm_morekeys=0; /*-------------------------------------------------------------------*/ static inline int putdata(int where, Gpm_Connect *what) *************** *** 114,120 **** SIG_DFL != gpm_saved_winch_hook.sa_handler) { gpm_saved_winch_hook.sa_handler(signum); } /*if*/ ! if (ioctl(gpm_consolefd, TIOCGWINSZ, &win) == -1) { return; } /*if*/ if (!win.ws_col || !win.ws_row) { --- 115,128 ---- SIG_DFL != gpm_saved_winch_hook.sa_handler) { gpm_saved_winch_hook.sa_handler(signum); } /*if*/ ! if (GPM_FD_SCREEN == gpm_consolefd) { ! /* TODO: */ ! win.ws_col = 80; ! win.ws_row = 25; ! } else if (gpm_consolefd <= 0) ! /* safety check */ ! return; ! else if (ioctl(gpm_consolefd, TIOCGWINSZ, &win) == -1) { return; } /*if*/ if (!win.ws_col || !win.ws_row) { *************** *** 177,183 **** /*-------------------------------------------------------------------*/ int Gpm_Open(Gpm_Connect *conn, int flag) { ! char tty[32]; char *term; int i; struct sockaddr_un addr; --- 185,191 ---- /*-------------------------------------------------------------------*/ int Gpm_Open(Gpm_Connect *conn, int flag) { ! char tty[64]; char *term; int i; struct sockaddr_un addr; *************** *** 236,248 **** if (!t) goto err; strcpy(tty,t); if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) goto err; conn->vc=atoi(tty+8); } else /* a default handler -- use console */ sprintf(tty,"/dev/tty0"); ! if (gpm_consolefd==-1) if ((gpm_consolefd=open(tty,O_WRONLY))<0) { gpm_debug_log(LOG_ERR,"%s: %s",tty,strerror(errno)); --- 244,283 ---- if (!t) goto err; strcpy(tty,t); if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) + { + char* sty = getenv("STY"); + /* as set by SCREEN, e.g + * STY=417.tty1.kristine + * ^hostname + */ + if (sty) + { + /* STY is set. Check, if it has a valid form */ + int n, vc; + if (strlen(sty) >= sizeof tty + || 3 != sscanf(sty, "%d.tty%d.%s", &n, &vc, tty)) + goto err; + else + { + /* we're inside a SCREEN session. Don't connect to + * the tty as below. TODO: how can we get lines + * and columns from SCREEN ? */ + gpm_consolefd = GPM_FD_SCREEN; + conn->vc = vc; + win.ws_col = 80; + win.ws_row = 25; + } + } + else goto err; + } + else conn->vc=atoi(tty+8); } else /* a default handler -- use console */ sprintf(tty,"/dev/tty0"); ! if (gpm_consolefd == GPM_FD_INVALID) /* NOT called for SCREEN */ if ((gpm_consolefd=open(tty,O_WRONLY))<0) { gpm_debug_log(LOG_ERR,"%s: %s",tty,strerror(errno)); *************** *** 254,259 **** --- 289,295 ---- /*....................................... Get screen dimensions */ + if (gpm_consolefd != GPM_FD_SCREEN) /* NOT called for SCREEN */ ioctl(gpm_consolefd, TIOCGWINSZ, &win); if (!win.ws_col || !win.ws_row) *************** *** 395,401 **** sigaction(SIGWINCH, &gpm_saved_winch_hook, 0); #endif close(gpm_consolefd); ! gpm_consolefd=-1; return 0; } --- 431,437 ---- sigaction(SIGWINCH, &gpm_saved_winch_hook, 0); #endif close(gpm_consolefd); ! gpm_consolefd = GPM_FD_INVALID; return 0; } diff -rcw gpm-1.19.3.orig/special.c gpm-1.19.3/special.c *** gpm-1.19.3.orig/special.c Mon Jan 17 22:34:00 2000 --- gpm-1.19.3/special.c Thu Nov 30 19:09:42 2000 *************** *** 26,31 **** --- 26,32 ---- /* This file is compiled conditionally, see the Makefile */ + #include /* OPEN_MAX */ #include #include #include gpm-1.20.4/patches/done/unknown_stat/gpm.screen.diff.gz010060000017500001750000000027410760216311400216400ustar00niconico00‹Kx<gpm.screen.diffŐX{s›F˙;ţku’I€°­G”NĆv\gl)c{šŚ™”ÁpH7Bœ†;¤şŽż{wAXFBM:é8)ăąŕnˇťż}€Ďƒęąˇ€ŃlZ7f§Ńjˆ˜š!żŢá=ظ_ŰŠŐj[ž\% Ţ&!˜m0펹`†ąSŻ×ˤ=š'0sh`™]łÝ5팡VźRľzťé#@I>Š˜Ţ؍/ĺ;×Iđqż&ů_LU9ąŇ>őR§kP˨Ýx}¨Žojš(xaóÎ.đHŃůODR„,đűułĐŹA"‘Q ¤˜‹ .<V5¨5‘1皊˜M؍ě$ŽYŤű•Ę—ĘUÜC5!XŞm–(ßUn•îc3ŕOp(˘ˆyhŰbě*- yÓ’őčŢdQ2…[8ywîź9rNżž>;=BŢşŠç‹—‡ÇÇZłŕŽWÜ+ řÇŁ íŚiëŚeäxĎŽËÓçčÍěöSC¤;gžłŕ‘7vĆBLŇuĆnä‡,ÖŕvÉőÂ*…+™j˝”üÝÁ´fxŐ́Ďëpu:<EoĽ3f*‰Ł5‘°š‹…D!|ţ ůc,$€°iš{h{;Gç÷˛} ‹ý"IËnŞaw5<vaÉ đŔÂ>´^q-Ĺek/[žJ–*,üe mə*‘nŔÔ ć(ó&+]+oÓó˝ŹG\)ˆąĘ˜Ť˘ý߼%%ŇpƢj!ŁĐÚHO÷ƒĐiH›…)­lJÝ|lYŸ2űҕšbń4{&žÝJ'(L oâú~ě$Đo/CgŃŮ1stţFíŰß`TYäŹÖžnŮíbůš‚Ň`$°Ę˛8îvQ‡7ťŠâ‘tĽő6q;ňŚłtżŇôŮź‰w˝­ĽxâŇç#Žh÷cű“ŚŘa‹FrMýŐÜëťJpb}Ń.(žťżOSÓČŸn*X–Œ$ő X& ,!ż´hŁƒâ‘Šśěe+ۊóĎOk‚˘LR‡Îű‹áŕ샌˝4Š6ߎ{řě:9ĄUφ'ÎńŅ^y*ťđTVt†F‰¸Š˙#Ąid-ŰÖ-ĚĂBA}ěhž€˘mĹç şXä°ÂaĽeŠEójĺňęšz”˘(A2×7ŐgXc´AˆĂ ŠčŰćAĎa6&1— ťsáúőÇXHšÓ2âćĆZćm“¸ÄÔĽ x4੠8¤ŞŽ“NŔ”ÓšrOËćٍ…aîőʡł …4:źęC6ÍQÍ(ĺ  ƒ×˘.+ĽçFqęPyę“ń? žĄŇgsO'9šśEŇ Seű”[oˇ }ś`ĎcŽ$÷úhٜ%“’‹¨G"zŽŇ˘@…S‰­˘0ŕjĚȂŇ5Ł’ecFÓQáhš“˙$Ťj “i$!ˆĹ4?ÔĎŰ–çrÉ0›ąöś˛ĺĺ9śE˝tůáj$)'ź+Yß\Kcú/P”PÂýcwšŠďŠ Ż6aČҜÍAPĐ÷Ű@i“ßĂś°×ɚ|Ú'ÚÝęěĺ}b'ËšĆ×]p‚É"˝˜ą|>ee¤Ězӑťk¸˙?~Ý`Űˏ˙…ÁľÔ/­ÎžnćjřÁ÷×ShNßBPÍá/¨ŚěĺBǑT˙Ä"ŸŮD ɊçŐ˛Y}ă‹ÂÎj‡ôݔđĆn™şÝ:X5đG8Ńćvůůü­_’äŒyÜ ‹Ÿ’îKż%Ýď>9źĹ*l€eu[v×0J?&­8|M2;]ŁÓľ­í_“Ź}˝e>@>>ZpOďtcěÍǚżž˜Î8AÝăsr<"Łd,í#ç´9Ü„ ö¨—Ř?’?›!Ÿr%ăW$zřîxŕœżţ-Ł^‘Jĺs4ë‹!żŢ\ĹŇ5˘Őż\(íĘgpm-1.20.4/patches/done/unknown_stat/microtouch-usb.tar010060000017500001750000001700000760216311400217730ustar00niconico00microtouch-usb/ 40775 632 12 0 7125620535 12535 5ustar rubinistaffmicrotouch-usb/mice.c.patch100600 632 12 13145 7125620333 15017 0ustar rubinistaff--- mice.c-old Tue Mar 7 15:10:00 2000 +++ mice.c Mon Jun 19 14:03:57 2000 @@ -58,6 +58,7 @@ #include /* MAJOR */ #include +#include #ifdef HAVE_LINUX_JOYSTICK_H #include @@ -200,6 +201,7 @@ /* real absolute coordinates for absolute devices, not very clean */ #define REALPOS_MAX 16383 /* min 0 max=16383, but due to change. */ +//#define REALPOS_MAX 0xFFFF /* min 0 max=16383, but due to change. */ int realposx=-1, realposy=-1; /*========================================================================*/ @@ -1070,6 +1072,130 @@ return 0; } +/** + * Convert data from usb devices to event type structure. + */ +static int M_usbmt(Gpm_Event *state, unsigned char *data) +{ + /* + * This is a simple decoder for the MicroTouch touch screen + * usb devices. It uses the "tablet" format and only generates button-1 + * events. Check README.microtouch for additional information. + */ + int x, y; + static int avgx=-1, avgy; /* average over time, for smooth feeling */ + static int upx, upy; /* keep track of last finger-up place */ + static struct timeval uptv, tv; /* time of last up, and down events */ + struct tscrn_usb_data_report *stData; + + #define REAL_TO_XCELL(x) ((x * win.ws_col / 0x3FFF)+1) + #define REAL_TO_YCELL(y) ((y * win.ws_row / 0x3FFF)+1) + + #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) + #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ + (t2.tv_usec-t1.tv_usec)/1000) + #define MIN_XR 0xaf0 + #define MAX_XR 0x34d0 + #define MIN_YR 0xc4e + #define MAX_YR 0x33f4 + #define XRAW_TO_X(x) (((x - MIN_XR)<=0?1:(x - MIN_XR)) * 0x3FFF / (MAX_XR - MIN_XR)) + #define YRAW_TO_Y(y) (((y - MIN_YR)<=0?1:(y - MIN_YR)) * 0x3FFF / (MAX_YR - MIN_YR)) + #define MIN_XC 0xc8 + #define MAX_XC 0xff78 + #define MIN_YC 0x0 + #define MAX_YC 0xff78 + #define XC_TO_X(x) (((x - MIN_XC)<=0?1:(x - MIN_XC)) * 0x3FFF / (MAX_XC - MIN_XC)) + #define YC_TO_Y(y) (((y - MIN_YC)<=0?1:(y - MIN_YC)) * 0x3FFF / (MAX_YC - MIN_YC)) + + stData = (struct tscrn_usb_data_report *)data; + if (!IS_TOUCHED(stData)) + { + /* + * finger-up event: this is usually offset a few pixels, + * so ignore this x and y values. And invalidate avg. + */ + upx = avgx; + upy = avgy; + GET_TIME(uptv); /* ready for the next finger-down */ + tv.tv_sec = 0; + state->buttons = 0; + avgx=-1; /* invalidate avg */ + return 0; + } + + /* based on compensated coordinates */ + //x = ((unsigned int)GET_XC(stData))>>2; + x = XC_TO_X(GET_XC(stData)); + if(x <= 0) x = 1; + if(x > 0x3fff) x = 0x3fff; + y = 0x3fff - YC_TO_Y(GET_YC(stData)); + //y = (0xffff - (unsigned int)(GET_YC(stData))>>2); + if(y <= 0) y = 1; + if(y > 0x3fff) y = 0x3fff; + /* based on X,Y raw coordinates */ + //x = XRAW_TO_X(GET_XR(stData)); + //if(x <= 0) x = 1; + //if(x > 0x3fff) x = 0x3fff; + //y = 0x3fff - YRAW_TO_Y(GET_YR(stData)); + //if(y <= 0) y = 1; + //if(y > 0x3fff) y = 0x3fff; + + //syslog(LOG_DEBUG,"coordinates Xc=%u Yc=%u",GET_XC(stData),GET_YC(stData)); + //syslog(LOG_DEBUG,"coordinates Xr=%u Yr=%u",GET_XR(stData),GET_YR(stData)); + //syslog(LOG_DEBUG," max X =%u Y =%u",win.ws_col,win.ws_row); + //syslog(LOG_DEBUG,"coordinates x =%u y =%u",x,y); + + if (avgx < 0) /* press event */ + { + GET_TIME(tv); + if (DIF_TIME(uptv, tv) < opt_time) + { + /* count as button press placed at finger-up pixel */ + state->buttons = GPM_B_LEFT; + realposx = avgx = upx; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = upy; state->y = REAL_TO_YCELL(realposy); + upx = (upx - x); /* upx and upy become offsets to use for this drag */ + upy = (upy - y); + return 0; + } + /* else, count as a new motion event */ + tv.tv_sec = 0; /* invalidate */ + realposx = avgx = x; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = y; state->y = REAL_TO_YCELL(realposy); + } + + state->buttons = 0; + if (tv.tv_sec) /* a drag event: use position relative to press */ + { + x += upx; + y += upy; + state->buttons = GPM_B_LEFT; + } + + realposx = avgx = (9*avgx + x)/10; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = (9*avgy + y)/10; state->y = REAL_TO_YCELL(realposy); + + return 0; + + #undef XC_TO_X + #undef YC_TO_Y + #undef MIN_XC + #undef MAX_XC + #undef MIN_YC + #undef MAX_YC + #undef XRAW_TO_X + #undef YRAW_TO_Y + #undef MIN_XR + #undef MAX_XR + #undef MIN_YR + #undef MAX_YR + + #undef REAL_TO_XCELL + #undef REAL_TO_YCELL + #undef GET_TIME + #undef DIF_TIME +} + static int M_mtouch(Gpm_Event *state, unsigned char *data) { /* @@ -1768,6 +1894,15 @@ return type; } +static Gpm_Type *I_usbmt(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + //int i; + //for(i=0; i< argc; i++) + // syslog(LOG_DEBUG,"I_usbmt no=%d, val=%s",i,argv[i]); + return type; +} + static Gpm_Type *I_mtouch(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { @@ -2042,6 +2177,11 @@ {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + + // usb touch-screen 12-06-2000 RGA + {"usbmt", "MicroTouch touch-screens usb (only button-1 events, by now)", + "", M_usbmt, I_usbmt, STD_FLG, + {0x01, 0x01, 0x00, 0x00}, 11, 1, 0, 1, 0}, {"", "", "", NULL, NULL, 0, microtouch-usb/README100664 632 12 1346 7125620672 13520 0ustar rubinistaffFrom: Radoslaw Garbacz To: rubini@linux.it Date: Mon, 19 Jun 2000 12:28:02 +0000 Subject: gpm and usb touchscreen My name is Radoslaw Garbacz. I have added support to MicroTouch usb devices in gpm application. I send You the patch and the source of mice.c (which I changed). Please send me any suggestions about it. If You think that is is good idea to join my changes to official release of gpm I'll be very glad. I also send You source of microtouch device driver to check my changes. It is also nessesary to copy touchscreen.h file to ./include/linux directory. I changed the gpm, version 1.19.1. Best reagrds. -- >>> POS Experts Consulting <<< Radoslaw Garbacz tel : (048 71) 354 80 85 microtouch-usb/kernel-driver/ 40775 632 12 0 7125620446 15307 5ustar rubinistaffmicrotouch-usb/kernel-driver/Makefile100644 632 12 1005 7121423046 17027 0ustar rubinistaff# Makefile for a basic kernel module CC=gcc #MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX MODCFLAGS := -D__KERNEL__ -I/usr/src/linux-2.3.99-pre6/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -march=i586 -DMODULE -DMODVERSIONS -include /usr/src/linux-2.3.99-pre6/include/linux/modversions.h touchscreen.o: touchscreen.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c touchscreen.c audio.o: audio.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c audio.c microtouch-usb/kernel-driver/mt_calibra.c100664 632 12 3470 7123410437 17644 0ustar rubinistaff// copyrights (c) WWO // // Written by Radosław Garbacz // 14/06/2000 // A simple calibration program for micro touch screen. #include #include #include #include #include #include #include #include #include "touchscreen.h" //#include <> int getStatus(int _hFile) { unsigned char buff[20]; int nRet; //printf("Get status\n"); if((nRet=ioctl(_hFile,TSCRN_CONTROLLER_STATUS ,buff)) < 0) { printf("Error ioctl %d\n",nRet); close(_hFile); exit(1); } //printf("cmd status = %d\n",buff[3]); return buff[3]; }; int main() { int nRet,hFile; char buff[50]; memset(buff, 0, sizeof(buff)); if((hFile=open("/dev/usb/usbtest",O_RDONLY )) < 0) { printf("Error open %d\n",hFile); return 0; }; (void)getStatus(hFile); printf("Soft reset of device\n"); if((nRet=ioctl(hFile,73)) < 0) { printf("Error ioctl %d\n",nRet); return 0; } (void)getStatus(hFile); printf("Calibrate controler extended \n"); *buff = TSCRN_CORNER_CALIBRATION_TYPE; if((nRet=ioctl(hFile,TSCRN_CALIBRATION,buff)) < 0) { printf("Error ioctl %d\n",nRet); return 0; } printf("\n"); //while((nRet = getStatus(hFile)) != 1) // printf("wait for staus 1 status=%d\r",nRet); //printf("\n"); while((nRet=getStatus(hFile)) < 2) { printf("wait for lower left corner %d\n",nRet); sleep(1); } printf("\n"); while((nRet=getStatus(hFile)) < 3) { printf("lower left corner complited;wait for upper right corner %d\n",nRet); sleep(1); } printf("\n"); if((nRet=getStatus(hFile)) == 3) printf("upper right corner complited %d\n",nRet); else printf("upper right corner error %d\n",nRet); printf(" koniec kalibracji OK ioctl: %d \n",nRet); close(hFile); return 0; } microtouch-usb/kernel-driver/touchscreen.c100644 632 12 76201 7123410163 20105 0ustar rubinistaff/* -*- linux-c -*- */ /* * Driver for USB Touchscreen (Microtech - IBM SurePos 4820) * * Copyright (C) 2000 Wojciech Woziwodzki * Written by Radoslaw Garbacz * * 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. * * Originally based upon scanner.c (David E. Nelson). * * History * * 0.1 06/05/2000 (RGA) * Development work was begun. * * 0.2 09/05/2000 (RGA) * Documentation about MicroTouch controller was arrived. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* used in new tty drivers */ #include /* used in new tty drivers */ #include #include #include #include #ifdef CONFIG_KERNELD #include #endif //#define DEBUG #define TSCRN_IOCTL //#define __TEST_NO_DEVICE__ #define TSCRN_MAX_MNR 16 /* We're allocated 16 minors */ #define TSCRN_BASE_MNR 48 /* USB Scanners start at minor 48 */ #define IS_EP_BULK(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_BULK ? 1 : 0) #define IS_EP_BULK_IN(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) #define IS_EP_BULK_OUT(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) #define IS_EP_INTR(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_INT ? 1 : 0) #define IS_EP_INTR_IN(ep) (IS_EP_INTR(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) #define IS_EP_INTR_OUT(ep) (IS_EP_INTR(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) #define USB_TSCRN_MINOR(X) MINOR((X)->i_rdev) - TSCRN_BASE_MNR #ifdef DEBUG #define TSCRN_DEBUG(X) X #else #define TSCRN_DEBUG(X) #endif #include #include #include "touchscreen.h" struct tscrn_usb_data { struct usb_device *dev; wait_queue_head_t wait; struct urb irq; struct urb ctrlin; struct urb ctrlout; devrequest *setup_packet; // for control transfers unsigned int ifnum; // Interface number of the USB device kdev_t minor; // TouchScreen minor - used in disconnect() unsigned char data[TSCRN_USB_RAPORT_SIZE_DATA]; // Data buffer X-Y, and button int nLoopCounter; // number of data packet last received +1 char isopen; // Not zero if the device is open char present; // Not zero if device is present unsigned char *obuf, *ibuf; // transfer buffers unsigned char *pToRead,*pToWrite;// pointers to toRead cell of buffer and to toWrite one char intr_ep; // Endpoint assignments struct input_dev input_dev; // to work as an input device driver }; static struct tscrn_usb_data *p_tscrn_table[TSCRN_MAX_MNR] = { NULL, /* ... */}; MODULE_AUTHOR("Radoslaw Garbacz, garbacz@posexperts.com.pl"); MODULE_DESCRIPTION("USB touchscreen driver"); static __s32 vendor=-1, product=-1; MODULE_PARM(vendor, "i"); MODULE_PARM_DESC(vendor, "User specified USB idVendor"); MODULE_PARM(product, "i"); MODULE_PARM_DESC(product, "User specified USB idProduct"); /* Forward declarations */ static struct usb_driver touchscreen_driver; /* Procedures */ /** * Runs after ctrl requests. */ static void ctrl_touchscreen(struct urb *urb) { struct tscrn_usb_data *tscrn = urb->context; dbg("ctrl_touchscreen(%d): status=%d", tscrn->minor, urb->status); if (waitqueue_active(&tscrn->wait)) wake_up_interruptible(&tscrn->wait); return; }; /** * Runs on new data received from device * The buffer should keep the last state of device, thus the buffer overflow * can occurre * The client can't read data when pToRead == pToWrite */ static void irq_touchscreen(struct urb *urb) { /* * data raports... */ struct tscrn_usb_data *tscrn = urb->context; struct tscrn_usb_data_report *data = (struct tscrn_usb_data_report *)tscrn->data; if (urb->status) return; //return when driver was clesed if(!tscrn->isopen) return; // increase loop counter // !!! Unfortunately the data was lost to seldom !!! //if((int)GET_LOOP(data) != tscrn->nLoopCounter) // warn("warn:Lost data new loop %d previous loop %d",(int)GET_LOOP(data),(int)tscrn->nLoopCounter); input_report_key(&tscrn->input_dev, BTN_LEFT, IS_TOUCHED(data)); input_report_abs(&tscrn->input_dev, ABS_X, GET_XC(data)); input_report_abs(&tscrn->input_dev, ABS_Y, GET_YC(data)); tscrn->nLoopCounter = (GET_LOOP(data))+1; // store data to buffer memcpy(tscrn->pToWrite,data,TSCRN_USB_RAPORT_SIZE_DATA); // next data to next cell if(tscrn->pToRead == NULL) tscrn->pToRead = tscrn->pToWrite; tscrn->pToWrite += TSCRN_USB_RAPORT_SIZE_DATA; if(tscrn->pToWrite >= tscrn->obuf+OBUF_SIZE) tscrn->pToWrite = tscrn->obuf; if (waitqueue_active(&tscrn->wait)) wake_up_interruptible(&tscrn->wait); //dbg("irq_touchscreen(): GET_Data 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d", (int)data[0],(int)data[1],(int)data[2],(int)data[3],(int)data[4],(int)data[5],(int)data[6],(int)data[7],(int)data[8],(int)data[9],(int)data[10], tscrn->ctrlout.status); return; } static int open_touchscreen(struct inode * inode, struct file * file) { struct tscrn_usb_data *tscrn; struct usb_device *dev; kdev_t minor; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif minor = USB_TSCRN_MINOR(inode); dbg("open_touchscreen: tscrn_minor:%d", minor); if (!p_tscrn_table[minor]) { err("open_touchscreen(%d): invalid tscrn_minor", minor); return -ENODEV; } tscrn = p_tscrn_table[minor]; dev = tscrn->dev; if (!dev) { return -ENODEV; } if (!tscrn->present) { return -ENODEV; } if (tscrn->isopen) { return -EBUSY; } //clear up the data buffer memset(tscrn->obuf, 0x0, OBUF_SIZE); tscrn->pToRead = NULL; tscrn->pToWrite = tscrn->obuf; tscrn->isopen = 1; file->private_data = tscrn; /* Used by the read and write metheds */ MOD_INC_USE_COUNT; return 0; } static int close_touchscreen(struct inode * inode, struct file * file) { struct tscrn_usb_data *tscrn; kdev_t minor; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif minor = USB_TSCRN_MINOR (inode); dbg("close_touchscreen: tscrn_minor:%d", minor); if (!p_tscrn_table[minor]) { err("close_touchscreen(%d): invalid tscrn_minor", minor); return -ENODEV; } tscrn = p_tscrn_table[minor]; tscrn->isopen = 0; file->private_data = NULL; MOD_DEC_USE_COUNT; return 0; } static ssize_t read_touchscreen(struct file * file, char * buffer, size_t count, loff_t *ppos) { struct tscrn_usb_data *tscrn; struct usb_device *dev; ssize_t bytes_read; /* Overall count of bytes_read */ ssize_t ret; kdev_t minor; int partial; /* Number of bytes successfully read */ int this_read; /* Max number of bytes to read */ //int result; unsigned char *buf, *pToRead; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif tscrn = file->private_data; minor = tscrn->minor; buf = tscrn->obuf; pToRead = tscrn->pToRead; dev = tscrn->dev; bytes_read = 0; ret = 0; if((tscrn->pToWrite == tscrn->pToRead) || (tscrn->pToRead == NULL)) return 0; // no new data if (signal_pending(current)) { ret = -EINTR; return ret; } this_read = (count >= TSCRN_USB_RAPORT_SIZE_DATA) ? TSCRN_USB_RAPORT_SIZE_DATA: count; partial = this_read; //dbg("read stats(%d): result:%d this_read:%d partial:%d", minor, result, this_read, partial); dbg("read count=%d", count); if (partial) { /* Data returned */ if (copy_to_user(buffer, tscrn->pToRead, this_read)) { ret = -EFAULT; return ret;//break; } count -= partial; bytes_read += partial; buffer += partial; tscrn->pToRead += partial; if(tscrn->pToRead >= tscrn->obuf+OBUF_SIZE) tscrn->pToRead = tscrn->obuf; } dbg("read ended bytes_read(%d)", bytes_read); return ret ? ret : bytes_read; } /** * Zmiana dla jądra 2.2.x z select na poll */ static unsigned int poll_touchscreen(struct file *file, struct poll_table_struct *_wait) { struct usb_device *dev; struct tscrn_usb_data *tscrn; struct inode *inode; struct dentry *dentry; kdev_t minor; dentry = file->f_dentry; inode = dentry->d_inode; minor = USB_TSCRN_MINOR(inode); dbg("poll_touchscreen(%d): entered", minor); if (!p_tscrn_table[minor]) { err("poll_touchscreen(%d): invalid minor", minor); return 0; //return -ENODEV; }; tscrn = p_tscrn_table[minor]; dev = tscrn->dev; //if(_selType != SEL_IN) // return -EPERM; if((tscrn->pToWrite == tscrn->pToRead) || (tscrn->pToRead == NULL)) { poll_wait(file, &tscrn->wait, _wait); return 0; }; return 1; }; static int ioctl_touchscreen(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct usb_device *dev; struct tscrn_usb_data *tscrn; int nRet; kdev_t minor; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif minor = USB_TSCRN_MINOR(inode); dbg("ioctl_touchscreen(%d): entered cmd=%d", minor,cmd); if (!p_tscrn_table[minor]) { err("ioctl_touchscreen(%d): invalid minor", minor); return -ENODEV; } tscrn = p_tscrn_table[minor]; dev = tscrn->dev; switch (cmd) { case TSCRN_USER_REQUEST: { /* sends reset command */ struct { __u8 data; __u8 request; __u16 value; __u16 index; } args; if (copy_from_user(&args, (void *)arg, sizeof(args))) return -EFAULT; // for the present a soft reset tscrn->setup_packet->requesttype = args.data; tscrn->setup_packet->request = args.request; tscrn->setup_packet->value = args.value; tscrn->setup_packet->index = args.index; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): cmd status=%d nRet=%d",minor,tscrn->ctrlout.status,nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): cmd status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_CLEAR_HALT: { // when end_point is STALLED always returned -1 at first // and OK on second exec, then end_point returns to normal state return usb_clear_halt(dev,0x00);//0x80 }; case TSCRN_HARD_RESET: { tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_RESET; tscrn->setup_packet->value = TSCRN_USB_PARAM_HARD_RESET; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d",minor,tscrn->ctrlout.status,nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_SOFT_RESET: { tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_RESET; tscrn->setup_packet->value = TSCRN_USB_PARAM_SOFT_RESET; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d",minor,tscrn->ctrlout.status,nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_CONTROLLER_STATUS: { tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_STATUS; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = TSCRN_USB_RAPORT_SIZE_STATUS; memset(tscrn->ibuf,0x0, IBUF_SIZE); FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_STATUS, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlin.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlin.status); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlin.status, nRet); if(tscrn->ctrlin.status == 0) if (copy_to_user((void *)arg, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_STATUS)) return -EFAULT; return tscrn->ctrlin.status; }; case TSCRN_CONTROLLER_ID: { tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_CONTROLLER_ID; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = TSCRN_USB_RAPORT_SIZE_ID; memset(tscrn->ibuf,0x0, IBUF_SIZE); FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_ID, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlin.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlin.status); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlin.status, nRet); if(tscrn->ctrlin.status == 0) if (copy_to_user((void *)arg, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_ID)) return -EFAULT; return tscrn->ctrlin.status; }; case TSCRN_CALIBRATION: { __u16 type; if (copy_from_user(&type, (void *)arg, sizeof(type))) { err("ioctl_touchscreen(%d): copy from user error arg=%d.", minor, *((int *)arg)); return -EFAULT; }; switch(type) { case TSCRN_EXTENDED_CALIBRATION_TYPE: case TSCRN_CORNER_CALIBRATION_TYPE: break; default: err("ioctl_touchscreen(%d): unknown calibration type %d.", minor, type); return -EFAULT; }; tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_CALIBRATION; tscrn->setup_packet->value = type; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0x0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d", minor, tscrn->ctrlout.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_RESTORE_DEFAULTS: { tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_RESTORE_DEFAULTS; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0x0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d", minor, tscrn->ctrlout.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; default: return -ENOIOCTLCMD; } return 0; } /////////////////////////////////////////////////////////////////////////// static void * probe_touchscreen(struct usb_device *dev, unsigned int ifnum) { struct tscrn_usb_data *tscrn; struct usb_interface_descriptor *interface; struct usb_endpoint_descriptor *endpoint; #ifdef DEBUG int nRet,nCounter; #endif //devrequest *setup_packet; int ep_cnt; kdev_t minor; char valid_device = 0; char have_intr; if (vendor != -1 && product != -1) { info("probe_touchscreen: User specified USB touchscreen -- Vendor:Product - %x:%x", vendor, product); } /* * 1. Check Vendor/Product * 2. Determine/Assign Bulk Endpoints * 3. Determine/Assign Intr Endpoint */ /* * * NOTE: Just because a product is supported here does not mean that * applications exist that support the product. It's in the hopes * that this will allow developers a means to produce applications * that will support USB products. * * Until we detect a device which is pleasing, we silently punt. */ if( dev->descriptor.idVendor == MICROTOUCH_VENDOR_ID && dev->descriptor.idProduct == MICROTOUCH_PRODUCT_ID ) valid_device = 1; // no user specification devices !!! // -- else // -- /* User specified */ // -- if (dev->descriptor.idVendor == vendor // -- && dev->descriptor.idProduct == product) // -- valid_device = 1; if (!valid_device) return NULL; /* We didn't find anything pleasing */ if(ifnum != 0) { info("probe_touchscreen: not correct interface no."); return NULL; } /* * After this point we can be a little noisy about what we are trying to * configure. */ if (dev->descriptor.bNumConfigurations != 1) { info("probe_touchscreen: Only one device configuration is supported."); return NULL; } if (dev->config[0].bNumInterfaces != 1) { info("probe_touchscreen: Only one device interface is supported."); return NULL; } interface = dev->config[0].interface[ifnum].altsetting; //interface = dev->actconfig[0].interface[ifnum].altsetting; endpoint = interface[ifnum].endpoint; /* * Start checking for two bulk endpoints OR two bulk endpoints *and* one * interrupt endpoint. If we have an interrupt endpoint go ahead and * setup the handler. FIXME: This is a future enhancement... */ dbg("probe_touchscreen: Number of Endpoints:%d", (int) interface->bNumEndpoints); if (interface->bNumEndpoints != 1) { info("probe_touchscreen: Only one endpoints supported."); return NULL; } //ep_cnt = have_bulk_in = have_bulk_out = have_intr = 0; ep_cnt = have_intr = 0; if (IS_EP_INTR(endpoint[ep_cnt])) { have_intr = ++ep_cnt; dbg("probe_touchscreen: intr_ep:%d", have_intr); } else { info("probe_touchscreen: Undetected endpoint. Notify the maintainer."); return NULL; /* Shouldn't ever get here unless we have something weird */ } /* * Determine a minor number and initialize the structure associated * with it. The problem with this is that we are counting on the fact * that the user will sequentially add device nodes for the touchscreen * devices. */ /* * Use firs free file devices */ for (minor = 0; minor < TSCRN_MAX_MNR; minor++) { if (!p_tscrn_table[minor]) break; } /* Check to make sure that the last slot isn't already taken */ if (p_tscrn_table[minor]) { err("probe_touchscreen: No more minor devices remaining."); return NULL; } dbg("probe_touchscreen: Allocated minor:%d", minor); if (!(tscrn = kmalloc (sizeof (struct tscrn_usb_data), GFP_KERNEL))) { err("probe_touchscreen: Out of memory."); return NULL; } memset (tscrn, 0, sizeof(struct tscrn_usb_data)); dbg ("probe_touchscreen(%d): Address of tscrn:%p", minor, tscrn); /* Ok, now initialize all the relevant values */ if (!(tscrn->obuf = (char *)kmalloc(OBUF_SIZE, GFP_KERNEL))) { err("probe_touchscreen(%d): Not enough memory for the output buffer.", minor); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): obuf address:%p", minor, tscrn->obuf); if (!(tscrn->ibuf = (char *)kmalloc(IBUF_SIZE, GFP_KERNEL))) { err("probe_touchscreen(%d): Not enough memory for the input buffer.", minor); kfree(tscrn->obuf); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): ibuf address:%p", minor, tscrn->ibuf); if (!(tscrn->setup_packet = (void *)kmalloc(sizeof(*tscrn->setup_packet), GFP_KERNEL))) { err("probe_touchscreen(%d): Not enough memory for the statuc.", minor); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): setup_packet address:%p, size=%d size2=%d", minor, tscrn->setup_packet, sizeof(*tscrn->setup_packet),sizeof(devrequest)); memset((char *)tscrn->setup_packet, 0 , sizeof(*tscrn->setup_packet)); // Initiation input_dev structure tscrn->input_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); tscrn->input_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT);//| BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); tscrn->input_dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); // Initialization toRead and toWrite variables tscrn->pToWrite = tscrn->obuf; tscrn->pToRead = NULL; // Initiation wait queue dbg("probe_touchscreen(%d): initialization wait_queue", minor); init_waitqueue_head(&tscrn->wait); dbg("probe_touchscreen(%d): wait_queue initialized", minor); #ifdef DEBUG /////////////////////////////////////////////////////////////////////////////////// // Only for testing, not for normal useing of device driver // Register the interface if(!(nRet = usb_interface_claimed(&dev->actconfig[0].interface[ifnum]))) { dbg("probe_touchscreen(%d): interface_claimed=%d", minor, nRet); usb_driver_claim_interface(&touchscreen_driver,&dev->actconfig[0].interface[ifnum],tscrn); } else dbg("probe_touchscreen(%d): error interface_claimed=%d", minor, nRet); dbg("probe_touchscreen(%d): Configuring CTRL handler for intr EP:%d", minor, have_intr); /* sends reset command */ // receive answer data tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE; tscrn->setup_packet->request = USB_REQ_GET_CONFIGURATION; tscrn->setup_packet->value = 0x0; tscrn->setup_packet->index = 0x0;//ifnum; tscrn->setup_packet->length = 1; FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, sizeof(tscrn->ibuf), ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("probe_touchscreen(%d): GET_CONFIGURATION:Get smth error=%d status=%d.", minor, nRet, tscrn->ctrlin.status); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } nCounter = 10; dbg("probe_touchscreen(%d): GET_CONFIGURATION:wait for data: status=%d nRet=%d", minor,tscrn->ctrlin.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("probe_touchscreen(%d): GET_CONFIGURATION:gets 0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1], tscrn->ctrlin.status, nRet); if(tscrn->ctrlin.status == (-32)) { dbg("probe_touchscreen(%d): get error -32 status=%d - reset pipe", minor,tscrn->ctrlin.status); nRet = usb_clear_halt(dev,0x00); dbg("probe_touchscreen(%d): get error -32 status=%d - reset pipe nRet=%d", minor,tscrn->ctrlin.status, nRet); } // // receive answer data tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT; tscrn->setup_packet->request = USB_REQ_GET_STATUS; tscrn->setup_packet->value = 0x0; tscrn->setup_packet->index = 0x81; tscrn->setup_packet->length = 2; FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, sizeof(tscrn->ibuf), ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("probe_touchscreen(%d): GET_STATUS:Get smth error=%d status=%d .", minor, nRet, tscrn->ctrlin.status); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): GET_STATUS: status=%d nRet=%d", minor,tscrn->ctrlin.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("probe_touchscreen(%d): GET_STATUS:gets 0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2], tscrn->ctrlin.status, nRet); // -- // get controller id report tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_CONTROLLER_ID; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = TSCRN_USB_RAPORT_SIZE_ID; memset((char *)tscrn->ibuf,0,IBUF_SIZE); FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_ID, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("probe_touchscreen(%d): GET_ID:error=%d status=%d .", minor, nRet, tscrn->ctrlout.status); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): GET_ID gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlout.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("probe_touchscreen(%d): GET_ID gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlout.status, nRet); #endif //////////////////////////////////////////////////////////////////////////////////// /* Ok, if we detected an interrupt EP, setup a handler for it */ if (have_intr) { dbg("probe_touchscreen(%d): Configuring IRQ handler for intr EP:%d", minor, have_intr); FILL_INT_URB(&tscrn->irq, dev, usb_rcvintpipe(dev, 0x81),//endpoint[(int )(have_intr-1)].bEndpointAddress), tscrn->data, TSCRN_USB_RAPORT_SIZE_DATA, irq_touchscreen, tscrn, endpoint[(int)(have_intr-1)].bInterval); //2); if (usb_submit_urb(&tscrn->irq)) { err("probe_touchscreen(%d): Unable to allocate INT URB.", minor); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } //the status will be -115 -> thist means EINPROGRESS, but it should be that. dbg("probe_touchscreen(%d): IRQ done interval=%d status=%d", minor,endpoint[(int)(have_intr-1)].bInterval, tscrn->irq.status); } tscrn->intr_ep = have_intr; tscrn->present = 1; tscrn->dev = dev; tscrn->minor = minor; tscrn->isopen = 0; input_register_device(&tscrn->input_dev); return p_tscrn_table[minor] = tscrn; } static void disconnect_touchscreen(struct usb_device *dev, void *ptr) { struct tscrn_usb_data *tscrn = (struct tscrn_usb_data *) ptr; //if(tscrn->intr_ep) //{ if(tscrn->irq.status != 0) { dbg("disconnect_touchscreen(%d): Unlinking IRQ URB", tscrn->minor); usb_unlink_urb(&tscrn->irq); } //} if(tscrn->ctrlin.status != 0) { dbg("disconnect_touchscreen(%d): Unlinking CTRLIN URB", tscrn->minor); usb_unlink_urb(&tscrn->ctrlin); } if(tscrn->ctrlout.status != 0) { dbg("disconnect_touchscreen(%d): Unlinking CTRLOUT URB", tscrn->minor); usb_unlink_urb(&tscrn->ctrlout); } input_unregister_device(&tscrn->input_dev); usb_driver_release_interface(&touchscreen_driver, &tscrn->dev->actconfig->interface[tscrn->ifnum]); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); dbg("disconnect_touchscreen: De-allocating minor:%d", tscrn->minor); p_tscrn_table[tscrn->minor] = NULL; kfree (tscrn); } static struct file_operations usb_touchscreen_fops = { read: read_touchscreen, //write: write_touchscreen, poll: poll_touchscreen, ioctl: ioctl_touchscreen, open: open_touchscreen, release: close_touchscreen, }; static struct usb_driver touchscreen_driver = { "touchscreen", probe_touchscreen, disconnect_touchscreen, { NULL, NULL }, &usb_touchscreen_fops, TSCRN_BASE_MNR }; void __exit usb_touchscreen_exit(void) { usb_deregister(&touchscreen_driver); } int __init usb_touchscreen_init (void) { if (usb_register(&touchscreen_driver) < 0) return -1; info("USB Touchscreen support registered."); return 0; } module_init(usb_touchscreen_init); module_exit(usb_touchscreen_exit); microtouch-usb/kernel-driver/touchscreen.h100644 632 12 10257 7123410202 20103 0ustar rubinistaff/* -*- linux-c -*- */ /* * Driver for USB Touchscreen (Microtech - IBM SurePos 4820) * * Copyright (C) 2000 Wojciech Woziwodzki * Written by Radoslaw Garbacz * * The header file * * 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. * * Originally based upon scanner.c (David E. Nelson). * */ #include #include // CTRL numbers of commands define #define TSCRN_SOFT_RESET 73 #define TSCRN_HARD_RESET 74 #define TSCRN_CALIBRATE 75 #define TSCRN_CONTROLLER_STATUS 76 #define TSCRN_RESTORE_DEFAULTS 77 #define TSCRN_CONTROLLER_ID 78 #define TSCRN_REPORT_ENABLE 79 #define TSCRN_CLEAR_HALT 80 #define TSCRN_USER_REQUEST 81 #define TSCRN_CALIBRATION 82 // device requests define #define TSCRN_USB_REQUEST_RESET 7 #define TSCRN_USB_REQUEST_CALIBRATION 4 #define TSCRN_USB_REQUEST_STATUS 6 #define TSCRN_USB_REQUEST_RESTORE_DEFAULTS 8 #define TSCRN_USB_REQUEST_CONTROLLER_ID 10 // define requests parameters // for reset request #define TSCRN_USB_PARAM_SOFT_RESET 1 #define TSCRN_USB_PARAM_HARD_RESET 2 // for calibrate request #define TSCRN_EXTENDED_CALIBRATION_TYPE 1 #define TSCRN_CORNER_CALIBRATION_TYPE 2 // define raport sizes #define TSCRN_USB_RAPORT_SIZE_DATA 11 #define TSCRN_USB_RAPORT_SIZE_STATUS 8 #define TSCRN_USB_RAPORT_SIZE_ID 16 #define IBUF_SIZE TSCRN_USB_RAPORT_SIZE_ID //input data buffer 12 * data raports #define OBUF_SIZE TSCRN_USB_RAPORT_SIZE_DATA*12 #define MICROTOUCH_VENDOR_ID 0x0596 #define MICROTOUCH_PRODUCT_ID 0x0001 //the report no 1 field definitions #define IS_TOUCHED_BYTE(data) ((data & 0x40) ? 1:0) #define IS_TOUCHED(str) ((str->PenStatus & 0x40) ? 1:0) #define GET_XC(str) (str->XCompensHi<<8 | str->XCompensLo) #define GET_YC(str) (str->YCompensHi<<8 | str->YCompensLo) #define GET_XR(str) (str->XRawHi<<8 | str->XRawLo) #define GET_YR(str) (str->YRawHi<<8 | str->YRawLo) //#define GET_XC(str) (str->XCompensHi*256+str->XCompensLo) //#define GET_YC(str) (str->YCompensHi*256+str->YCompensLo) //#define GET_XR(str) (str->XRawHi*256+str->XRawLo) //#define GET_YR(str) (str->YRawHi*256+str->YRawLo) #define GET_LOOP(str) (str->LoopCounter) struct tscrn_usb_data_report { __u8 Id; // 0x01 for this report __u8 LoopCounter; __u8 PenStatus; // 7b = 1; 6b is 1 for touching, 0 when not touching __u8 XCompensLo; //compensed low 8 bits of the X coordinate __u8 XCompensHi; // high X __u8 YCompensLo; // low Y __u8 YCompensHi; // high Y __u8 XRawLo; //raw low 8 bits of the X coordinate __u8 XRawHi; // high X __u8 YRawLo; // low Y __u8 YRawHi; // high Y }; struct tscrn_usb_status_report { __u8 Id; // 0x06 __u16 POCStatus; // power on check status __u8 CMDStatus; // last commad status __u8 TouchStatus; // finger up/down __u8 Filter[3]; // filter, for future expansion }; struct tscrn_usb_controller_id_raport { __u8 Id; // 0x0C __u16 ControllerType; // Controller type __u8 FWMajorRevision; // firmware major revision level __u8 FMMinorRevision; // firmware minor revision level __u8 Features; // special features __u8 ROMChecksum; // ROM Checksum __u16 Reserved01; __u8 Reserved02; __u8 Reserved03; __u8 Reserved04; __u8 Reserved05; __u8 Reserved06; __u8 Reserved07; }; gpm-1.20.4/patches/done/unknown_stat/microtouch-usb.tar.gz010060000017500001750000000273720760216311400224270ustar00niconico00‹Kx<microtouch-usb.tarě;ksŰF’ţjüŠ^f“%đR/‹–Ö4EÉL$QERątŮ †bŔâ!‰vůWíźî™€”c§œ\ݝY ĚL?ŚťŃ™ÁÂąB?ö뮖DÓĆł?ă;Íýý]x{í˙]ţŠO`_oíťí]ęğg°űě/ř$Ql†ĎÂdęxÎÓăpŘlöě˙ÜgQÔ?޲şUĚŘşűj4ôfsŻŮ|J˙z[ßŮÍôßnˇąiˇŠď?ƒć7ý˙éŸZ­Bé5ßľŸO$}TÂĄŢtm|čŞŰzuä-‡\ärú%Č<ěYbL}5žG¸9‹i‚ţĚ6—ę4m5'Œ÷>lU/ŻĎĎŤN§‰ŽĹ-˘ˇęń˝1 ją./Ť°…Ѹš ˙âŚńÔG¢ŃZ–.Ť ‚-P˝\7Ł,{4gÍBw÷ŚĐÝŢą›eđŰ\żľĂĘŕůîv{ś“ďżußru‘ŞpÍʚdŠúň¨ůOý0߂s—*@]¨’ľUoń­D|Kš$ÄK9đ6CœkYG|;ĘőŽÉŤ—›đÁš¸r˝łŮţÁš¸rýk˛žýđMoł¨zk˘ęmU/×[Uoł zk‚Ú„öś—ëO…x0áheö›ŕŞ-ž_tm3P˙6#×˝7ýU`l~v.Ý:šÓ•ŰáŢ⽲đôI”˜.:b6‹:Ftr8Ě´ :ňC‡2öČ}ĎĐG%äéťxçxxç wŒ|j=mˆ t87ňş´a)–˛!säôŞÜăaŒś—YäńŘcć=šŰKqÇ÷éDq•ˇń˜W;1%ĘuHÇĎńYÎđ­B4Ţ~¤/"ajFŒÂŚE‹€yڅI`h4hŽŞšĹ[ŒUšŢM/SŇńq‹Ł§‘Љ–†H%فžDöŤ|¨žj<&›šÍf˘C\óŢev‹F–Ú)áž-án4h¨JĎ [d¸ ‚g,-%K˞—˜ŮHϊţÜÜ77ká›UúŠÁ2ĎgÎ1J×ČŒąĺLĚ&úęXř”ŒôZöŐ%'źrŔe‰~‰<׼ůů˛ü˜ăŃƒl/›@5—ć›B‚2˛’h%ŻL3ű{^‘ ť+šř#l ƒˇKqť|*Œ•ěOňť.0őĹżÚFkŔüőłĹˇ.< ůBKČcú´(ŽĚ\xę”x´X!Ł]ŽEƨ\‹Č¸ň <+¸-(4dq$O)őűeZŁ2­Q™Vy5äš 2ÝĐ~[jO=[Ž)őjĘ6i 5ý‚ןŸ]ÔŁ÷Ů_ˆŘßăŤSúÁ‹Mß-ŽCĐzBş!)‘ -3l äZń0łľ­čŽrљkÎ)G|ţüyVvŽ€ ł&jípni’ż-źšĎVÔíȈ‚ŢHuŽĐŔœ—/śˇŤ˘ńŻĹÉxţŃ÷Čz‘ŁďيćhDâç×Ô só,H6?O)ßOOţŔDQbŠm§Ĺ×Úôý}M׼>T‚Š&źHĺŒyNÁ[ç˝ÚWŚ rĹDSň%jĺ÷Ś€ĆC Á€''ĆéůYqôĆχćăiWĂĚY˘jŞ)ž?j ăĽŽwâűŁöÉbŇxŽÚĄeąš.Vƒ@o՚{´Ŕ؄ŃY—űť ןnĽźˆ$Á"ŽHĺëBéj\ÜĐ`şDM?T+EŽ*\ 5IB^dÂŘţ a4u.˝, ˝$ *“ Ť”ƒí´<‘~75ĺ١Ď˙’ýąşř•iĐţĎŢΓűz{g/Ű˙ŮŰoQËnŤům˙çŻřœ†ţâFŚíG.Ö˘gf85­÷đr..^aĂĆQçzŕ+˙„´^ń픺+XYąC¸đ=ś…hwˆť<˝uŘ:8lś`ťIDădúł01œ ‘‘§îRŽ+pÎÍÄsń2Suew&&ŚmSDJž„éd΋ć÷ O ױĂ8 ”ˆ!á[?áK)|Ł“łBw‘Ÿ„_Z[] >Ü9Ř?[(vľŽŔ•˰‚Ž5˝%˛2Ÿłˆ`Ę?ő ĺ1ŽĚ$Ç{‡ßX_‰…ŚšďŰŕŘĚ$Ţó‘ÍĹRRŕ 'Žĺ˜Ž‚)3§… ŃD˙p],`Ä&ÓÜ5m’ˆéF>ds*Ě Ý ňŔĚÜáků´!D; +˘uEpć82ss™Hƒ†úÁ űmX$ş<‰Ż7äśZƒ›b;!*×—„.•—+2Ż×Őz]Q×qĚkĽŮóĐ&j5FŽáj8†ž°:ÚŠ7ŚÍ†—/_ň!eĂHĂOŒë!¨Íô&UhďîŔAv•očsý˙;zĚ­ SůZ§AžäüÇĹ}ˇÝÜ˙vţă\˙ć;FOűWˆ˙;Ÿˆ˙ÍŚ8˙Ąď´ÚMŽ˙ýfëŰůżäó¤JűČ´<%Ą°Xřv‚=ŠŇëÍ- /žťžôNĎťgc8<‚Ú[CRíŻĎűxa?őG—ýsĂŔ~C)F I6˘Đ¤ÖŞˇë/^ԂíĽą%%ńŤMNJą­• ÍjĂÔfţ‰kłs†Z€Ą4ĆW›y~MŽ7]'„ÁŁ8XŁÖfhÝ9ť{yśńâçţh<^ŽĄ–Rţ}ćDOĽ$ƒ[TżS%.1WĘßZk^chUž˙]íőŞđw5“ZjV …˘˜‰íř„[\üAŹ)đˇđř-ţoô˙‹Ř°đš†fÝúóężöΈ˙í˝šÓŢ'˙ńâ›˙˙+>OńCg~‡ÉśjUáíŰĄ‚­ô˙6tâ˜y´âÄsî˙ärněÖwÍ˝?ú‡wÝô ”4žčîzŽž™Çnj…łR˜ő+ŤłyQLîčî8ß´ŒÜŮŻ7ÓÚĺzŤă[ąť‡ł`ĹÖÄs^ąmfykŔEź9ľ­+…r¨‚s_Çq´ţ9gńůK"žjܝb|­*´]\Ľž&łŮ/­ćŻEĐňF,î` F€„ă™Z9c1_§M˘y•*8SUxÄ'Ť ěÚdÜ]˝áĺd4˝Œ–ë? ¨]††aůpĂőŮF.cAîQűRňíuňëTéôŽëÄĚîdŹ%A€<üaŢ2KXgěčHpśÚ@0cŤLšvטq*ćX„wžç0Źo„é[ż90üIXÜ!Aœp€Ťçfe•˙ů_Ąěřłę˙ý˝VSĎň?}Ż € ÍÝoůß_’˙mAmŤ˘ÄľřőVCQ°Y-8KĆäŽÇŻa˛˛Pů˘{Ě0™ŤÁŕőŒ“]ůě´Čľo)ü,żL-AĹú“o źőł‚zëżw|űý;‡F–SÍÂň.ÇĹä§ů$^ΐ ˆ0¸>˜!ëŔŇO0ó¤c&śCY۔^Îpřůú†,ӝْÚ蘁8JłpQ\Ś›łËk8ă§đ]¸JŚŽcÁ9k/b`F„! Ćč˛I§ÄĂXň§>"ćyo˜ƒýaśčݒ4‹ÄŠJU5câœň ‚Ťňí׌W ő'Śżš%RäÜÜaŇ"÷bxpÄfAąYâň÷A¸œ“7Ăë t/oámw4ę^Nn;88žŁm Úbć¨(“w3Î+4˝˜ĹôEÔ{ƒ Ý׃óÁä–fp:˜\öÇc8ް¸ęŽ&ƒŢőywWףŤá¸_3–Ę—yžDՏUŽ3S”Ő‹uü0•’މÂe0ěMÎsc cŇOŒËĄqŇ˙yĐë†R‚ q—#Đ÷ž“H޲ Găjâgäő=zSϗB)@žîŽűt瀃RŔ QUĆtB—CăţĐecŁeźž>˙IeęÓE7–1"˘Ě1ý˓ŤáŕrbܜbGđOŹzŠ[Çf .9BľDŕ‡R}ĎćËî]Űćg:(R9ŒP$㟪)}j\n¤…aéO †XËÔpěHPúL1áĹSR"\%)ečżś”8­’”ž1.ĽŒľJs\GęMÄ^Վ#´Ů}Óž˘áfOáŚ'‰ˇ˘|ô¨ŒŰܝ=—ĺG‹“Í~6HŠ>śź:§l|‹ˆ/9ÉŢ&ŽHlá/ŻŽą6ţ°„wĚ´˜ˇtr0áœđ߼+‘­ LŠą‡ ŃFtl‹ÉŔLë‹Ĺ˒ρd¤Ľ—%˝hF~ِŸyɢó<;vÝŔœ]äŒ^˘Äž)Ćh™‘‘SC$âŐkáBVŕ94<ԏE~/M-sę˜o"głbľ k ™$Ó_„*ÉxFÝŤáhbŒ˙Ő7Nş“ţv­!›7ľ[ńöŚ|!]<÷ý G‡čYŘ)3šš!CXHPź šĽ†Űzş~čD´’×yž—ÖĽĂ{ú”ü‘”¤„0-äŤ~)(RDŽčiŘœş.—-gŞÁz—Yç9§Z•ˆ6€„F§Ń•Eʃpro“ŸŠy?X 3|ƒ”%?ÄDč=ŃLhQ :°A犡Ŕ‡¸XđhWĚ0zČ#¤ ëő:†<Â(6mî52#ľRŽ5xňč­NIč“>Ň\ъ¤ZĄ§$ç5$ű4:eß0˘v +2ĎöCţ˛4Ö6Nˆż3/QbésĄŠ!Tœ1ęáWÝ×j, ˜ĺ̨Ě"űgŢËéćqJZO"]őoÄz%ş9Ú•2!V56˝Îîšb—†'#EEqĽçĹ2ÉČ&ńZĚƢŸƒÓŰűXHŒ:7Łú•üHwNjšŒ-Lón#‡[ÍšĚ-üŞć]tŮnř=˝NkÇä0ŮŁp°ÓšZYĂü˝]=\­ëV4Žößí=kSGśůjýŠśŤ’•°ŢŘ@í-äX{ą6ćŚ\ŞA`‚Xd 1?ęţĂ{ýš§$'ŢětU‚ŐÓĎÓ§OŸ>}oˆÄšţŹDé=έVň?ČJřĄŔ"Ě[çĘí×ĚžX,hĆôćӄ9eš‘Ś\äđ€ˇßú]ľżĺ˜ é!›(?˜w˜Úĺœý ČZhž>šÜbc(™ óéTˇ=€[>ě}řň7ŇĹňpn/aH:„l‚˘D‘U„3pń"VÖrd;Ë3uPkӇýœcŤŘ•9Ý,x¸œń°\$ś!–kn#‚^5ţKÉ/En źF.žŽ,ň~*›ä'ÔĐGęrŽŕhc1 ôééÓ§â6Ěćh38bŃŻt2šř¤äęĂÍpJç¤ f^™Óîuť‡y2xÁ79űUݰóÇř1oďałÔ "!ęű!d˝ÉÜWϊ1p^\7 J:(Ňý+÷^ď}‚ĹÎńŮn…eˇ=”晥&œ3?މćÎQ˙}QHŰŃŐëžrÝSS*ÇL ‘)8˙ÂóZCČuEńŒ\,X#ŢtüR9¸šĎËćÔö)bšb2›$ŸšŘŔ[ľI?đŹg43MŞÍIž ˆ …ż‰P˙öUšŮ%¨î”ëźŃM#óźťsň–ꄇÁĽ…ŸÂ̈ň‡Š}\9â8ŤwßßWţ_ŕŘ ´'NˇúĄh~ÔěuűÇşýă…ýăĽýcĂţąi˙زü膠Ŕ*oeű ӇNN31Čä!iŠ#ŘpÂÝi˙‰%ľŔ5úłř8n¤Ü¨Â—}UŒ¨čwśRű  š y'¤ǡ’ב*›gN˜žçś3Őߌդš˙iĽŻĚ#* _´Uć,¤ÝŽÝƒŐźőt­'„ĎŚj'ÂdâzćŠŰ­7$ /ŕzl ÍSAľů‚RX\#tŠ…Ęďœę╠zşÂ7csbŮu5ŹOeEaˆE#C˛š5rË‘ŔHŮ9ä"˛â|˝p–ö%7ŔŠ÷ˆßźŢżƒ×&ţ_ť9$nÚ6ťß9ŘŞŘîďvOŽm=zś÷=ľŮ>ť{DdűDŚóšűÇŢ=Q}ĺíFj2‚0ÖÉeoľ—YvľúĚ5Ç­źľĆĘVîś—”Ő‰,żu~żÖnŕÖúĹ´V íě~ćú}`%Ę]té5I÷(9Đß%#ާ4‹ŁŮ,œšqŚ3Ď5HH} …1Ԗđçô s>ǧ.Ó0ÖĂw79ŹšďÜY˘Ž ÜŽŠĂ6Ń@ˇć#MHL‚I8>˙DQXE‹†ľcě#ćCçaŠ$DßŃK ĺü_łbӔT—ŞZ—-BĂmħO"‰),§¤ül˘Żjďň+N˙Ą2žČÓ qĚ<˜Ś˙0ŹRĽÍ=I˜˘öŁZ`ä˜Çޤń–ń÷”ŻŰŒŚŹ˝Ă(‡ÔHd¸>ę7ĽĎ…Qˆ”)?d#ń*ʢES°¨Š´8š§ą0H˙4tO•GXáÓâë ůĹxúZľ÷č=Ľ0şˇĂvo˙I˝T÷Dh 6ĺçěŰrQôľX2˘Ěl6Q­aËîéÉ U RřŰ8ö–ş§Žűdpmű!˝gzńe¨VŸ„ËćňwÍ(ll”ĆůžśÎřšv'4żzŻĆ0'bł롑|Gއ6@YŚ:˝Ű˝~ŻýĎńżç,§PhîKřÁäúŻ\ň`d×N¸´úçď–7‘~ž%„bƂšňi!ôĄśÁžŁŮœ#w&űąÎ§ rŇg4Šŕů”ţ‹Y“^Źŕ—ś9Ŕ/…BÁęE]žŃ9ë‘MynTď„).2Ht9 vűa¸ôFΒźżŚ!—ƒŕHŤĽjD@[‰ŕŚŞ„€[ Ş*„ŔäŽ/f—Š×ĺôśłˇ§ĚVú'˝-ݓR­˘ ‰mŔĹ î<Ähՙ§ŐBŃrÜČw„BĚ0‚Ţj”šČ{”äÍ ! aĹvŔüěڛőçÓłđmź°ą9m;áéd „ÂHˆO%ØDq_™jL×˙J#WƂAłDŞĹˆíŮ6 đŘBÚ> ô'ăč{؊c1PX4ĺá*ޘ*őĐ“ŻÝ˝vł××܋#^~óÖçWrĎGÇÍ˝˝vK8Ł[çŢ7ź~ŠĆ.§ţLŘ- šëţ>÷ůî`?Ü;w€Ź~ an†îŔcôß=⡽đäóHęÖżtF3Â|tÓT€@őnŤš8ËwÍ^ ˆôQ;f–KKOH|âńô°Ý˙Wű Őíɜ^{ˇs(ÖĽé“u䄚$Š2ľ›˝ćž5Ë%IW5ŁX˙ąë[ĄV+PŞ/$UGݡÇýMlf™mâl˙ĺ6qÄDű‹örçŕkoeä’{šúŘ[6^@Sđą•-‹ôÖŘ ź5.ąó˝qŇß>†6>°[Ÿľ÷íQŚÎďń¨ƒ7ţˆƒ7ţZ´!vOĆu÷xôŕ˝ƒŻŹ$bˆ˜°­)… Ž5GěźZL^=&o=&ďELŢË˜ź˜źÍńĺľ "Y>Ž JŤś $ňΝ,řšJŠd%J€őЖ˘żÖ7N{cýśH°=žżůí´2қ‘Ţ˙2ŇŰi}]˛k|ŔD‰.KčĽoúT‰<ű˜“Čă—ĎŮjdD.ă j˙!ĐppË­‘ś5wYˆŰeĄˇyő˘&Ÿ8č …‡;@ Pí÷Çp’´[';Űńĺ\ňlÖŇҐĐ=wPK"P* LóńŐcMŮŢ˝č< €‰fŘXߨđÂĺ’gŽ ńí +î2qĹc‹+RĹšž˙'K,z°)ş=4šŁ-|ô | Œ÷Ďbœłœíŕ?q‡ŽxK)„ÜZěˇ€zsĺńRŔTĂŰMÎb•äCú>Ĺs÷•u˘=e-ĂgďflݚΠ•vĽt °Ęl„<XÎ*ÇĘJ]9. ­Ô$3Ľ§3'¨Xӆ&ŐIHčz@ŠMľ ›Ł’YІN ¤50gĽ>oM Y‚mc4lC—J‚í’ˇĽ!ą(‰ďďśżż{VƜYöY0–!ŇⳌ˘VsŮŹ—EË%×.cˇŇ$ësą3]i“tŸË­Ç”ët9iHJý •˝tŰŰâsX‡3wŕ`4:GĂÇóU˜ôĽ‹F|×§ îמýhq3Vü= ˘9&:ŮŇHHą‡Z- љý͡rÉIP r=EŽšĐ#Ě-Ň|tلfýőęsp ´r{ti…”>Öś5ąYé ˘Ž.ct„“Jʌ[ˆËaTĽÂ| ,,ą¸Ŕ{~âV~m¸ĹŤ+š/rJśë*9¨_¸ĘK‘ÝŽűüšâ™4S3Uéç†áŤŤk?Ĺň"WH ]tqáΘØGčKa§?A“SܡŽ7•ÇŃC`ŤhĆŇG—6sš÷ĐÇűÝk2;‹8ęřţdŕĄĂ9n…ü^zȝ3Ż7—kËŚçKւé1Yá°&ĚĆňÍ\ŒËg0s"ČéŽq€fÎp¨H*ÉűZńŮňĆž@řÄ.ÎM2.č ԛJ÷ŽdH ‹jw!Řf^)çW.Ż‚řd6ĆMŐ+žŚp’Ş5`ŢX˛kç ŕ‹ Ő`÷+Ł r’¸ŇÎ E čXZ=˘yŘć+1DcÂŽPyjŠť™şˆ{č§1mŰ&mŽŚvB˜běW6Wě[mQşžŕOĽP?˝=”ţ …ĹëÎÉđôÚ˝Ć8q)|?)JsŰŮü8”šžˆé•/ŰĘzFĂşŰß߄ŽÝuJu݊aŐŢ_h6Ë&ă#÷٤„FžYç§śĽ;@˛`FÂ1Ż­ŕVƒŽšăÉüâRBNď+ żčw‹M÷Ę!3+ÜCy5ˇ@ÇŁ ÷KsqpQxń\#ČĂŻL1 č|°çą…ĐŁ}Čx ăĹCƖ „ä3–‚Dńľ˜Ň…Ç ŒŠŕňbÁő¸` ŔÀ“7; áo=NBtŠTŔɏF*ĂÔB*-äS$¨˘*ŇŰVŢgD‡Hß´Çéœ^ç§wÇŞqŞÔiľöÚń8g~`häiIU&×IĄy‰”‚l”ČŽٌńŁ3őđěóűôˆ˜ێ‚@Śxä=hŃF Đ8ö  >–ę‡Dx9ˆ tÓş1íZ§Fŕ€ I+ŸHÄîÓ6Lj´(ßÁk=fHł`݈ˇ;yk¤Ú=÷ÂógŽ˘Źňć!œŠČ*Ańę`äx×.ŔkńÍŃŚ[é‹j<@,yźqSČ%Ͱ`ů"~ ‹K ąh¨Ůƒq$m¸Ź2°ä ÓR \ŸÝăޞşŇňŃM¨}đ_źă¤™ZÂÚJƒ°;} C ž@ßíč¸yĐjöZ ow ^íä{]ýsą×îóâžţLwWM,ŁŸč  aٟÜܢg:-ޤ–öĹ i"Ł‹ŚôXŹăwÁsÝJ h‹Ů…ČZlSđąk€’űEęh_ŔW„ÜřŽąńßWŤ.ÚyŃŠëˆH¸OҞ SŐ¸–.\mtAšGЂ‹Ś‘ʆ–/­×—$ě( aj uŹQ—$ÉÂݔ XšÜÖAk ů(YuĽ9"ŢGk•G÷Š­ąx2ťU[L_ë}5ŰXšü¤VńÍSÖE¤JÎńϧ™r 1 Ĺ_IoxĄNŻ|„?ÄĄé :ŢP°ËÚÜ×2AřrăƒĹÚS‹őŚ>×Ô ńÂÎÖEŰÔ ˇŞžŐץ7Ÿi[°šöŐrT§ÓÚ^‘ĐDŻžIJÓiý7Z Ä*§=ÍĚ@*Aj)t}Y ?4xçFMƒÚŮ/Öíâ|šv‚˘€™yx0"€Ľ8p[ÄĐéýsE ƒ$ŹFČ&ŞŢôßaVIRĄf€˘Ö ĹJEżů’IEÁLĄT+|ˆÄ/*m7„äA=Ĺmd1’@.37č9Ň1ém|”žqÝëJó’˘ÄScč.äŤ1ŸŒQŠOŠ*&˜ŔŕR̰,>™â&ÓÜĹT7ŽîF(ŻRĽ­TôSŻăI–jľ—˘ô†ŽgRi­Ý98ěu굏Ž(Đ$"¨ WqĆOŚĺ…ˆ‰Č8D5OŽBŕŹŇšÜ šw˜éżícěÁv ĚĘś’‚-‚–žş¤xȸDc+O˝Dkß°ńn‡UX–ŻJŻhl‚€3˸ÇcíÍÚrELĎH&@ÓR*śüôtƒtc‰@+ů„ďq#uQÉça´Źôö{@z`$¤•F¸‘0šu€ĽžRt vL(‹%žSŃČ65—ô‡‰Ćg %śŔŻ:2y‡Tƒ ˜K_6.´şřœ!ŸiИ!’ÎÇË q@6ŻćŽď.Î+ĹQł×,Y=!•”ÔŤîřMŐ¨cie<LŁ‘šTČn‹–[’„!k)RDŔÜťöç–—{‹Đäř!0 `ú¨!,ő¨6čÎ'7>4[˜Ü?yöF´aŞNîîĄ,ý FçĄŰşhŘąj1ÜVŽ#§?yąp(ćúÁ—p̄bNbĂö“ˆCřbLȰÔHT Î­ż8°źp|lá3ýKW&>ފߎߧBGuŮś"Ű, Ônuf8ňИÜ`˝šxˆ‘33UË Ó7łÚFHŹśęÍô-nîťçó]ÖúăwČ"6NĹĎÍ^Żyp|Ú aTđv?şÜ”w}3Bť˜×ÔĎîařX{żÝŰ}Uš;˝Îń)Îŕmçřnƒâmˇ'šâ°Ů;îěžě5{âđ¤wŘ=j—…8r]_l$Ĉz¤ ;tgŽ7ňŐÄOaaĺ“tŠuE‡:,\jŞ9takxcRœ>s0.ŃüÄrĚďň@ä[ÎGŕ,XîČ<)ňw8ŕűý "=WаR k~K_p0ćPPfăˆQń{›ëĄ"ĆáŞ.ň"TDyShkŽqóe¸HŘ%žŘÜ ŰtC+›É­tZÜŃV¤’ľš;{<žÍĂ­hwŔj¸[ŐPŰáš,RK˜t§{ ZŠăČ+¸ ‹÷ˆ#Mš”’Á._¤””0–i#˝÷ ԡҀ­ĘóĽÂzž7ě/´iđńŤL¸ÇůŮ]–‹é$ěTň‰%ÈYő§Ü˜¸ }&zaQDV<Ţ ‹uYŞçlˆPTz“öă`kĘ>k Šš•ÝZPRîltĂ~ׯh‰ľr•Š ől…ńf.ÝU7Ř]Đ Îm­Vϙ!ę”>ŠŢU_ţ¸WĆ؎bĄjľ†@fM}đx"jŔ/¸Ł!CŢcsZ=a}´ższܖATóôWü Şw/Şڍś ,M´JŰ4ü)˝9tÇG,ŠI¨'#•RL\íýîäŽČţ;ďŐŤ-ńI2÷&Á꧑ę§qŐOŞżďEzď9ˇÁž!#Ňk¤Úi¸ÚŠŹVŠ,;Űľúˍç‘Éë§M×Ô?Mʟ4_ŤďŘq'MŘę3L VÖăZźš´ˆÄt“§¸a$â= vMjî{žQ âV •§1ąĄ›Ř<#IśŘ8C.Qś†Ü; Fri, 29 Dec 2000 20:30:50 +0100 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 29 Dec 2000 20:30:50 MET Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id TAA14746 for ; Fri, 29 Dec 2000 19:33:08 +0100 Received: from spock.linux.it (spock.linux.it [151.99.137.27]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id SAA15401 for ; Fri, 29 Dec 2000 18:32:47 GMT Received: from blue.int.wirex.com (unknown [216.161.55.93]) by spock.linux.it (Postfix) with ESMTP id 10E3A197B9 for ; Fri, 29 Dec 2000 19:32:45 +0100 (CET) Received: (from greg@localhost) by blue.int.wirex.com (8.9.3/8.9.3) id KAA30085; Fri, 29 Dec 2000 10:33:32 -0800 Date: Fri, 29 Dec 2000 10:33:32 -0800 From: Greg KH To: rubini@linux.it Cc: vendor-sec@lst.de, security@wirex.com Subject: temp file creation problem in gpm Message-ID: <20001229103332.G29373@wirex.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i X-Operating-System: Linux 2.2.18-immunix (i686) X-UIDL: 9c0bd8fe74181b95b30143ce1c2ddd42 Status: RO Hi, In building Immunix Linux 7.0, we ran across the following problem in gpm 1.19.3. I realize that gpm is unmaintained at this time, but we figured that you might want to add this patch to your patches section on the gpm ftp site. In the file gpn.c, the function check_uniqueness creates a temp file in an insecure way. The following patch, by Steve Beattie should fix this problem. thanks, greg k-h diff -ur gpm-1.19.3-orig/gpn.c gpm-1.19.3/gpn.c --- gpm-1.19.3-orig/gpn.c Tue Jul 18 05:06:06 2000 +++ gpm-1.19.3/gpn.c Fri Dec 15 13:58:37 2000 @@ -223,13 +223,16 @@ static void check_uniqueness(void) { - static char tmp_pidfile [] = GPM_NODE_DIR "gpmXXXXXX"; + static char tmp_pidfile [64]; + int fd; FILE* fp = 0; - if (!mktemp(tmp_pidfile + strlen(GPM_NODE_DIR))) { - oops("mktemp()"); + strncpy (tmp_pidfile, GPM_NODE_DIR "gpmXXXXXX", 63); + + if ((fd = mkstemp(tmp_pidfile)) == -1) { + oops("mkstemp()"); } /*if*/ - if ((fp = fopen(tmp_pidfile,"w")) != NULL) { + if ((fp = fdopen(fd,"w")) != NULL) { fprintf(fp,"%d\n",getpid()); fclose(fp); } else if (getuid()) { -- greg@(kroah|wirex).com http://immunix.org/~greg gpm-1.20.4/patches/done/unknown_stat/mktemp_secure_problem.gz010060000017500001750000000024660760216311400232570ustar00niconico00‹Kx<mktemp_secure_problem…VýSŰ8ýýŰĚ܌ÝĎeçÓŔ ´š+)L wáĆąĺDGöY2űúŰoe‡ĆÚ&ŕŕőŰ}oŸV §yş ~cüR€¸žßíú.¸ŽCÉg2~Ď"bLŇ0HŠT`äŌ ~´ÜPˇo;řڎ&ٛ­a•ćó@ś\KĹVk›cÖŔÚ^ťşŽŘŒ˘}öéڄŽpr5™^ŕúř˜zř"{qšĂÁ.ŐĎűpšó¸CąP uđâ{Žßu éPÇŮ՝ĽY))f*\ŹžXťgwŕňâň9I{K†äbž0+ĘÓĚüĺädşKřÔs˝÷Wb7tŘą]´ŹăŕÇ­ ¨ľîX†ďśžzť>MѧNżÓƒşMĎó_óŠ}ĎóÁë^É, —vÂEńXÉ~~CťÔmęőmˇżYę×ÚÝęěęžBÝݎ׳őýčďš~§g“nϒ‚Ů\(űçěŃ1db)Ň7.íŮ´Gín×zOzwzźÄůăŽNęœxÇtŘ7ܙÄMâˇĚuőţ)ÍăýÉÔŹé5JÁóœÍˇó\iz­‰Úv1ľ ÇǞ㠺űdď%ąŁWŐsÁr¸ŞŁ@1~„:E5>œĄřřJ]_ů&ÓԇžÉűЇ{&˘4ˇ$ Šěˆľ˙.rŽÖŰtrUĚţ`Ąň—5ƒ˜' œЧ˛<%l\Ŕ<[‘ “2˜3k<ňá@ ĽŽ;¤žŽ}潞W—5á+fýĘr‰•| śCާB1ĄŹé:cšďQľł$ŕbÂEKŚ i2äü+tÄq $We .°?FŽ%Ë­ă9>öaR(ŐŚśkw9ůb]d,Gĺbn]•cęĂš6\ЁĹWŤBđG0xoĐ3=ű0 Y4ˆYżCt6ěÎ<‡vźŃЍ˘¨ă’+¨Búđů‚źEČXŔŹŕI„L0Ţ­˜đpmÁƒ<„y*%¨Ă­Ÿ$郆o-%h)ÚBqll€1 é ˙‹!>PÚnŕ ç Př‹g?†Őƒ mĄ…D$ćó"LJeÖ:-`Ĺç |D§DQ•”x¨ębňęŽI=ĺB§‚h™š5V áĚ.Ű,Ĺ뙘gÂ[Ő}!Ş,,.ď°ű? &p6ŞÁÁ˛Am˜°Qô‚‹rô [cˇÓçžh5-}Ź^)vĎŕVQœ‘Šok3r‘I„…7]Un˘Vě_,%ŽŢ°´„ˆÇ1XŘ.öeUN[iÎçí˛™Z´ ˲^‡îM †_˝ žoŕt}§‡?ĺN%ÍfóE˝ëË˝Lť@ń‹ĎÄ~…>:Ëu˝ő Y~öŕ舀Äůâ!ܧ<"/L5tŘ$đ7ąŕ Ў ¨Uv—ń¨4ůćáěrr÷ébtr7†ŞúRžű¤ůĚ^çv4ç âhŸŔéřüä-Äu0 ™y ƛŐRŻŤQĎobĺ4†鯞Sä‘Z(r< Just send the patch to me. I don't mind where it comes from, > I mind if it works or not. Ok, this patch (against 1.20.0-gamma) is based on the Debian patch. It adds an ms3 repeater (supporting the wheel), and also fixes the ms3 driver to support the wheel. A couple issues: - The Debian patch adds wdx and wdy to Gpm_Event, to support (in principle) arbitrary wheel deltas. 1.20.0-gamma supports wheels with the GPM_B_UP and GPM_B_DOWN button bits, so I just threw away everything except one bit of wdy. I don't think this is a big deal in practice (at least, not for me). Code from Debian patch, in case you're interested: switch (data[3] & 0x0f) { case 0x0e: state->wdx = +1; break; case 0x02: state->wdx = -1; break; case 0x0f: state->wdy = +1; break; case 0x01: state->wdy = -1; break; } - The M_ms3 change is untested, but I'm pretty sure it's right. I may be able to test it later. Regarding my questions in my first mail, Blaise mailed me privately saying that he uses the imps2 repeater with X, and has experienced no problems. I'm not exactly sure why, so I tend to think the ms3 repeater should be preferred for the reason I described (again, unless I misunderstand something). Andrew --- mice.c.orig Tue Feb 19 22:02:23 2002 +++ mice.c Wed Feb 20 00:15:39 2002 @@ -369,14 +369,39 @@ static int M_ms3(Gpm_Event *state, unsi { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x10) >> 3) /* middle */ - | ((data[0] & 0x10) >> 4); /* right */ + | ((data[0] & 0x10) >> 4) /* right */ + | (((data[3] & 0x0f) == 0x0f) * GPM_B_UP) /* wheel up */ + | (((data[3] & 0x0f) == 0x01) * GPM_B_DOWN); /* wheel down */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); - /* wheel (dz??) is (data[3] & 0x0f) */ return 0; } +static int R_ms3(Gpm_Event *state, int fd) +{ + char buf[4] = {0, 0, 0, 0}; + int dx, dy; + + buf[0] |= 0x40; + + if (state->buttons & GPM_B_LEFT) buf[0] |= 0x20; + if (state->buttons & GPM_B_MIDDLE) buf[3] |= 0x10; + if (state->buttons & GPM_B_RIGHT) buf[0] |= 0x10; + if (state->buttons & GPM_B_UP) buf[3] |= 0x0f; + if (state->buttons & GPM_B_DOWN) buf[3] |= 0x01; + + dx = limit_delta(state->dx, -128, 127); + buf[1] = dx & ~0xC0; + buf[0] |= (dx & 0xC0) >> 6; + + dy = limit_delta(state->dy, -128, 127); + buf[2] = dy & ~0xC0; + buf[0] |= (dy & 0xC0) >> 4; + + return write(fd,buf,4); +} + /* M_brw is a variant of m$ 'Intellimouse' the middle button is different */ static int M_brw(Gpm_Event *state, unsigned char *data) { @@ -2065,7 +2090,7 @@ Gpm_Type mice[]={ {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3}, {"netmouse", "Genius NetMouse (ps2) - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, gpm-1.20.4/patches/todo/MS3-PATCH-ANDREW-rediffed010060000017500001750000000045230760216311400175220ustar00niconico00> you can try the beta version right now. it's available at ftp.schottelius.org Makefile.include has this funny line: MAKEINFO = no --no-split Here is a rediffed version of my patch (had a trivial conflict in the mouse list). Other that that, it seems to run fine at least for a few minutes. :-) Andrew --- mice.c.orig Wed Feb 20 08:10:13 2002 +++ mice.c Wed Feb 20 10:10:03 2002 @@ -415,14 +415,39 @@ static int M_ms3(Gpm_Event *state, unsi { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x10) >> 3) /* middle */ - | ((data[0] & 0x10) >> 4); /* right */ + | ((data[0] & 0x10) >> 4) /* right */ + | (((data[3] & 0x0f) == 0x0f) * GPM_B_UP) /* wheel up */ + | (((data[3] & 0x0f) == 0x01) * GPM_B_DOWN); /* wheel down */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); - /* wheel (dz??) is (data[3] & 0x0f) */ return 0; } +static int R_ms3(Gpm_Event *state, int fd) +{ + char buf[4] = {0, 0, 0, 0}; + int dx, dy; + + buf[0] |= 0x40; + + if (state->buttons & GPM_B_LEFT) buf[0] |= 0x20; + if (state->buttons & GPM_B_MIDDLE) buf[3] |= 0x10; + if (state->buttons & GPM_B_RIGHT) buf[0] |= 0x10; + if (state->buttons & GPM_B_UP) buf[3] |= 0x0f; + if (state->buttons & GPM_B_DOWN) buf[3] |= 0x01; + + dx = limit_delta(state->dx, -128, 127); + buf[1] = dx & ~0xC0; + buf[0] |= (dx & 0xC0) >> 6; + + dy = limit_delta(state->dy, -128, 127); + buf[2] = dy & ~0xC0; + buf[0] |= (dy & 0xC0) >> 4; + + return write(fd,buf,4); +} + /* M_brw is a variant of m$ 'Intellimouse' the middle button is different */ static int M_brw(Gpm_Event *state, unsigned char *data) { @@ -2127,7 +2152,7 @@ Gpm_Type mice[]={ {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3}, {"ms+", "Like 'ms', but allows dragging with the middle button.", "", M_ms_plus, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, gpm-1.20.4/patches/todo/clockpatch004070000017500001750000000000001076632743500156625ustar00niconico00gpm-1.20.4/patches/todo/clockpatch/README010060000017500001750000000005070760216311400166050ustar00niconico00Show clock when cursor moved to upper right corner. Originally by Marco d'Itri . Random fixes and rediff for latest gpm version by Petr Baudis . clockfix.diff is original clock.diff + some fixes clockfix2.diff applieas on the top of it and fixes some of the fixes ;) clock.diff is merge of these two gpm-1.20.4/patches/todo/clockpatch/clock.diff010060000017500001750000000131420760216311400176510ustar00niconico00diff -ru gpm-1.19.6/src/gpm.c gpm-1.19.6+clock/src/gpm.c --- gpm-1.19.6/src/gpm.c Mon Oct 1 22:02:25 2001 +++ gpm-1.19.6+clock/src/gpm.c Mon Oct 29 13:00:33 2001 @@ -31,6 +31,7 @@ #include /* O_RDONLY */ #include /* wait() */ #include /* mkdir() */ +#include /* time() */ #include /* timeval */ #include /* socket() */ #include /* socket() */ @@ -82,6 +83,7 @@ int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ int opt_rawrep=0; +int opt_clock = 0; Gpm_Type *repeated_type=0; /* devfs */ @@ -93,6 +95,7 @@ struct winsize win; int maxx, maxy; int fifofd=-1; +static int clock_printed = -1; int eventFlag=0; Gpm_Cinfo *cinfo[MAX_VC+1]; @@ -240,6 +243,52 @@ close(fd); } +#define CLOCK_FMT "%02d:%02d" +#define CLOCK_LEN 5 +#define POSITION (4 + 2 * (0 * 80 + (maxx - CLOCK_LEN - 1))) + +static void display_clock(int restore) +{ + int fd; + static char save[CLOCK_LEN * 2]; + + if ((fd = open("/dev/vcc/a", O_RDWR)) < 1) { + if (errno != ENOENT) + oops("open(\"/dev/vcc/a\")"); + if ((fd = open("/dev/vcsa", O_RDWR)) < 1) + oops("open(\"/dev/vcsa\")"); + } + if (restore == 2) { /* restore the old characters */ + lseek(fd, POSITION, 0); + write(fd, &save, sizeof(save)); + } else { /* print the clock */ + char buf[CLOCK_LEN * 2], buf0[CLOCK_LEN]; + time_t t; + struct tm *tm; + int i, j; + + if (restore == 0) { /* save the old characters for later */ + lseek(fd, POSITION, 0); + read(fd, &save, sizeof(save)); + } + t = time(NULL); + tm = localtime(&t); + sprintf(buf0, CLOCK_FMT, tm->tm_hour, tm->tm_min); + i = j = 0; + while (i <= sizeof(buf0)) { /* add the color attribute */ + buf[j++] = buf0[i++]; + buf[j++] = '\032'; /* green on blue */ + } + lseek(fd, POSITION, 0); + write(fd, &buf, sizeof(buf)); + } + close(fd); +} + +#undef POSITION +#undef CLOCK_FMT +#undef CLOCK_LEN + /*-------------------------------------------------------------------*/ static inline int do_selection(Gpm_Event *event) /* returns 0, always */ { @@ -252,6 +301,16 @@ case GPM_MOVE: if (x2<1) x2++; else if (x2>maxx) x2--; if (y2<1) y2++; else if (y2>maxy) y2--; + if (opt_clock && x2 == maxx && y2 == 1 && (clock_printed < 0 || clock_printed == event->vc)) { + selection_copy(x2,y2,x2,y2,3); /* move pointer before saving content + of the screen, so we don't get + pollution after clock hiding */ + display_clock(clock_printed); /* print the clock */ + clock_printed = event->vc; + } else if (clock_printed == event->vc) { + display_clock(2); /* restore the screen */ + clock_printed = -1; + } selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ return 0; diff -ru gpm-1.19.6/src/gpn.c gpm-1.19.6+clock/src/gpn.c --- gpm-1.19.6/src/gpn.c Sun Sep 23 21:00:03 2001 +++ gpm-1.19.6+clock/src/gpn.c Mon Oct 29 12:34:42 2001 @@ -155,6 +155,7 @@ " -A [limit] start with selection disabled (`aged')\n" " -b baud-rate sets the baud rate (default %d)\n" " -B sequence allows changing the buttons (default '%s')\n" + " -c enable clock printing\n" " -d delta sets the delta value (default %d) (must be 2 or more)\n" " -D debug mode: don't auto-background\n" " -g tap-button sets the button (1-3) that is emulated by tapping on\n" @@ -290,7 +291,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:cd:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -321,6 +322,7 @@ break; case 'b': opt_baud = atoi(optarg); break; case 'B': opt_sequence = optarg; break; + case 'c': opt_clock = 1; break; case 'd': opt_delta = atoi(optarg); break; case 'D': gpm_log_daemon = 0; break; case 'g': diff -ru gpm-1.19.6/src/headers/gpmInt.h gpm-1.19.6+clock/src/headers/gpmInt.h --- gpm-1.19.6/src/headers/gpmInt.h Thu Sep 27 14:52:30 2001 +++ gpm-1.19.6+clock/src/headers/gpmInt.h Mon Oct 29 12:34:42 2001 @@ -128,6 +128,7 @@ extern time_t opt_age_limit; extern char *opt_special; extern int opt_rawrep; +extern int opt_clock; extern int fifofd; extern char *consolename; diff -ru gpm-1.19.6/src/gpm.c gpm-1.19.6+clockfix/src/gpm.c --- gpm-1.19.6/src/gpm.c Tue Oct 30 13:06:40 2001 +++ gpm-1.19.6+clockfix/src/gpm.c Tue Oct 30 13:03:46 2001 @@ -258,7 +258,7 @@ if ((fd = open("/dev/vcsa", O_RDWR)) < 1) oops("open(\"/dev/vcsa\")"); } - if (restore == 2) { /* restore the old characters */ + if (restore == -2) { /* restore the old characters */ lseek(fd, POSITION, 0); write(fd, &save, sizeof(save)); } else { /* print the clock */ @@ -267,10 +267,12 @@ struct tm *tm; int i, j; - if (restore == 0) { /* save the old characters for later */ + /* save the old characters for later */ + if (restore == -1) { lseek(fd, POSITION, 0); read(fd, &save, sizeof(save)); - } + } + t = time(NULL); tm = localtime(&t); sprintf(buf0, CLOCK_FMT, tm->tm_hour, tm->tm_min); @@ -308,7 +310,7 @@ display_clock(clock_printed); /* print the clock */ clock_printed = event->vc; } else if (clock_printed == event->vc) { - display_clock(2); /* restore the screen */ + display_clock(-2); /* restore the screen */ clock_printed = -1; } selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ gpm-1.20.4/patches/todo/clockpatch/clockfix.diff010060000017500001750000000000001076632743500203620ustar00niconico00gpm-1.20.4/patches/todo/clockpatch/clockfix2.diff010060000017500001750000000022530760216311400204430ustar00niconico00diff -ru gpm-1.19.6/src/gpm.c gpm-1.19.6+clockfix/src/gpm.c --- gpm-1.19.6/src/gpm.c Tue Oct 30 13:06:40 2001 +++ gpm-1.19.6+clockfix/src/gpm.c Tue Oct 30 13:03:46 2001 @@ -258,7 +258,7 @@ if ((fd = open("/dev/vcsa", O_RDWR)) < 1) oops("open(\"/dev/vcsa\")"); } - if (restore == 2) { /* restore the old characters */ + if (restore == -2) { /* restore the old characters */ lseek(fd, POSITION, 0); write(fd, &save, sizeof(save)); } else { /* print the clock */ @@ -267,10 +267,12 @@ struct tm *tm; int i, j; - if (restore == 0) { /* save the old characters for later */ + /* save the old characters for later */ + if (restore == -1) { lseek(fd, POSITION, 0); read(fd, &save, sizeof(save)); - } + } + t = time(NULL); tm = localtime(&t); sprintf(buf0, CLOCK_FMT, tm->tm_hour, tm->tm_min); @@ -308,7 +310,7 @@ display_clock(clock_printed); /* print the clock */ clock_printed = event->vc; } else if (clock_printed == event->vc) { - display_clock(2); /* restore the screen */ + display_clock(-2); /* restore the screen */ clock_printed = -1; } selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ gpm-1.20.4/patches/todo/clockpatch/clockfix3.diff010060000017500001750000000022530760216311400204440ustar00niconico00diff -ru gpm-1.19.6/src/gpm.c gpm-1.19.6+clockfix/src/gpm.c --- gpm-1.19.6/src/gpm.c Tue Oct 30 13:06:40 2001 +++ gpm-1.19.6+clockfix/src/gpm.c Tue Oct 30 13:03:46 2001 @@ -258,7 +258,7 @@ if ((fd = open("/dev/vcsa", O_RDWR)) < 1) oops("open(\"/dev/vcsa\")"); } - if (restore == 2) { /* restore the old characters */ + if (restore == -2) { /* restore the old characters */ lseek(fd, POSITION, 0); write(fd, &save, sizeof(save)); } else { /* print the clock */ @@ -267,10 +267,12 @@ struct tm *tm; int i, j; - if (restore == 0) { /* save the old characters for later */ + /* save the old characters for later */ + if (restore == -1) { lseek(fd, POSITION, 0); read(fd, &save, sizeof(save)); - } + } + t = time(NULL); tm = localtime(&t); sprintf(buf0, CLOCK_FMT, tm->tm_hour, tm->tm_min); @@ -308,7 +310,7 @@ display_clock(clock_printed); /* print the clock */ clock_printed = event->vc; } else if (clock_printed == event->vc) { - display_clock(2); /* restore the screen */ + display_clock(-2); /* restore the screen */ clock_printed = -1; } selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ gpm-1.20.4/patches/todo/gpm-1.19.3-kernel2.4.9.patch010060000017500001750000000121150760216311400200140ustar00niconico00--- gpm.c +++ gpm.c @@ -321,7 +321,7 @@ /*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/ /*-------------------------------------------------------------------*/ -static inline char *getMouseData(int fd, Gpm_Type *type, int kd_mode) +static inline char *getMouseData(int fd, Gpm_Type *type, int kd_mode, int *restart) { static unsigned char data[32]; /* quite a big margin :) */ char *edata=data+type->packetlen; @@ -336,6 +336,22 @@ return NULL; } + if (data[0] == 0xaa) { + j=read(fd,&(data[1]),2); + if ((j < 1) || (data[1] != 0x0)) { + if (m_type->getextra) { + data[1]=GPM_EXTRA_MAGIC_1; data[2]=GPM_EXTRA_MAGIC_2; + gpm_debug_log(LOG_DEBUG,"Extra %02x",data[0]); + return data; + } + gpm_debug_log(LOG_DEBUG,"Error in protocol"); + return NULL; + } + gpm_debug_log(LOG_DEBUG,"Mouse was replugged"); + *restart = 1; + return NULL; + } + if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep) write(fifofd, data, howmany); @@ -402,6 +418,7 @@ fd_set fdSet; static int newB=0, oldB=0, oldT=0; /* old buttons and Type to chain events */ /* static int buttonlock, buttonlockflag; */ + int restart; #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ @@ -432,9 +449,11 @@ do /* cluster loop */ { - if ( ((data=getMouseData(fd,m_type,kd_mode))==NULL) + restart = 0; + if ( ((data=getMouseData(fd,m_type,kd_mode,&restart))==NULL) || ((*(m_type->fun))(&nEvent,data)==-1) ) { + if (restart) return -1; if (!i) return 0; else break; } @@ -926,6 +945,40 @@ unlink(GPM_NODE_CTL); } +static inline int initMouse(int i, int *fd, int *maxfd) +{ + which_mouse=mouse_table+i; /* used to access options */ + + /* open the device with ndelay, to catch a locked device */ + if (opt_dev) + { + if (!strcmp(opt_dev,"-")) + *fd=0; + else if ((*fd=open(opt_dev,O_RDWR | O_NDELAY))<0) + { oops(opt_dev); } + } + else /* use "/dev/mouse" */ + { + opt_dev = "/dev/mouse"; + if ((*fd=open(opt_dev,O_RDWR | O_NDELAY))<0) + { oops(opt_dev); } + } + /* and then reset the flag */ + fcntl(*fd,F_SETFL,fcntl(*fd,F_GETFL) & ~O_NDELAY); + /* create argc and argv for this device */ + mouse_argv[i] = build_argv(opt_type, opt_options, &mouse_argc[i], ','); + + /* init the device, and use the return value as new mouse type */ + if (m_type->init) + m_type=(m_type->init)(*fd, m_type->flags, m_type, + mouse_argc[i], mouse_argv[i]); + if (!m_type) + { oops("mouse initialization failed"); } + + which_mouse->fd=*fd; + *maxfd=max(*fd, *maxfd); +} + /*-------------------------------------------------------------------*/ int main(int argc, char **argv) { @@ -951,38 +1004,7 @@ for (i=1; i <= 1+opt_double; i++) { - which_mouse=mouse_table+i; /* used to access options */ - - /* open the device with ndelay, to catch a locked device */ - if (opt_dev) - { - if (!strcmp(opt_dev,"-")) - fd=0; - else if ((fd=open(opt_dev,O_RDWR | O_NDELAY))<0) - { oops(opt_dev); } - } - else /* use "/dev/mouse" */ - { - opt_dev = "/dev/mouse"; - if ((fd=open(opt_dev,O_RDWR | O_NDELAY))<0) - { oops(opt_dev); } - } - - /* and then reset the flag */ - fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) & ~O_NDELAY); - - /* create argc and argv for this device */ - mouse_argv[i] = build_argv(opt_type, opt_options, &mouse_argc[i], ','); - - /* init the device, and use the return value as new mouse type */ - if (m_type->init) - m_type=(m_type->init)(fd, m_type->flags, m_type, - mouse_argc[i], mouse_argv[i]); - if (!m_type) - { oops("mouse initialization failed"); } - - which_mouse->fd=fd; - maxfd=max(fd, maxfd); + initMouse(i, &fd, &maxfd); } /*for*/ /* FIXME: stderr must be closed at this point, as protocol init needs it */ @@ -1114,11 +1136,13 @@ for (i=1; i <= 1+opt_double; i++) { + int rc; which_mouse=mouse_table+i; /* used to access options */ if (FD_ISSET(which_mouse->fd,&selSet)) { FD_CLR(which_mouse->fd,&selSet); pending--; - if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) + rc = processMouse(which_mouse->fd, &event, m_type, kd_mode); + if (rc > 0) { /* * pass it to the client, if any * or to the default handler, if any @@ -1127,6 +1151,15 @@ (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) || (cinfo[0] && do_client(cinfo[0], &event)) || do_selection(&event); + } + else + if (rc == -1) { + /* try to reinitialise the mouse */ + FD_CLR(which_mouse->fd, &selSet); + close(which_mouse->fd); + initMouse(i, &fd, &maxfd); + FD_CLR(which_mouse->fd, &selSet); + } } } gpm-1.20.4/patches/todo/gpm-evdev004070000017500001750000000000001075432545600154375ustar00niconico00gpm-1.20.4/patches/todo/gpm-evdev/README.evdev010060000017500001750000000042650760216311400175010ustar00niconico00 GPM SUPPORT FOR LINUX EVENT INTERFACE MICE Usage: ------ Simply run $ gpm -t evdev -m /dev/input/event## Just as it if were a serial or PS/2 mouse. The hard bit is working out which event device your mouse is plugged into. The way I do this is to run $ xxd /dev/input/event## For all the event devices (in numerical order), and see which one produces output when I wave the mouse. Note that you may need to pass a `-r #' flag to gpm -- I find that it is a tad too sensitive by default. FAQ: ---- Actually, these aren't FAQs at all since this is the first time I have shown the world this code... 1: I get no output from any of the /dev/input/event## devices, what's wrong? Execute the following commands as root: $ modprobe input $ modprobe hid $ modprobe evdev These will load the driver if it is available. If it isn't (i.e. if either of these commands fail), you'll need a newer kernel or a backport - I would advise getting a newer kernel. It may also be worth checking if you are also sufferring from the problem solved in Question 2... 2: The mouse moves randomly all over the place, or does nothing at all, yet I get output from /dev/input/event##, what's with that? There are two possibilities here - you may have other event devices such as USB joysticks or keyboards attached, and the device node you're looking at is one of them, or the major and minor numbers of your device nodes are incorrect. It is worth noting that, as shipped, SuSE Linux 7.1 has the wrong minor numbers on it's event nodes. If you suffer from the first problem, just try the other event devices until you find the mouse. If you suffer from the second problem execute the following commands as root in a bourne-compatible shell e.g. bash: $ cd /dev/input $ umask 22 $ rm event* $ for i in `seq 0 63`;do mknod event${i} c 13 `echo ${i} 64 + p|dc`;done 3: I don't have a /dev/input directory, or the directory is empty. If you use devfs, then (as root): $ modprobe evdev should fix it. Otherwise, you can run the following commands as root: $ mkdir -p /dev/input $ cd /dev/input $ umask 22 $ rm event* $ for i in `seq 0 63`;do mknod event${i} c 13 `echo ${i} 64 + p|dc`;done (c) 2001 Philip Willoughby gpm-1.20.4/patches/todo/gpm-evdev/gpm-evdev-patch010060000017500001750000000050530760216311400204170ustar00niconico00diff -ur ../gpm-1.18.1/configure.in ./configure.in --- ../gpm-1.18.1/configure.in Fri Nov 12 13:27:37 1999 +++ ./configure.in Tue Mar 27 22:11:46 2001 @@ -49,7 +49,7 @@ lispdir='${datadir}/emacs/site-lisp' fi -AC_CHECK_HEADERS(syslog.h linux/joystick.h ncurses.h ncurses/curses.h curses.h) +AC_CHECK_HEADERS(syslog.h linux/joystick.h linux/input.h ncurses.h ncurses/curses.h curses.h) AC_ARG_WITH(curses, [ --without-curses disable curses support even if curses found]) diff -ur ../gpm-1.18.1/mice.c ./mice.c --- ../gpm-1.18.1/mice.c Fri Nov 12 13:27:37 1999 +++ ./mice.c Tue Mar 27 22:11:23 2001 @@ -60,6 +60,9 @@ #include #endif +#ifdef HAVE_LINUX_INPUT_H +#include +#endif /* HAVE_LINUX_INPUT_H */ #include "gpmInt.h" #include "twiddler.h" @@ -948,6 +951,42 @@ return 0; } +#ifdef HAVE_LINUX_INPUT_H +static int +M_evdev (Gpm_Event * state, unsigned char *data) +{ + struct input_event thisevent; + (void) memcpy (&thisevent, data, sizeof (struct input_event)); + if (thisevent.type == EV_REL) + { + if (thisevent.code == REL_X) + state->dx = (signed char) thisevent.value; + else if (thisevent.code == REL_Y) + state->dy = (signed char) thisevent.value; + } + else if (thisevent.type == EV_KEY) + { + if (thisevent.code == BTN_LEFT) + { + state->buttons ^= GPM_B_LEFT; + } + else if (thisevent.code == BTN_MIDDLE) + { + state->buttons ^= GPM_B_MIDDLE; + } + else if (thisevent.code == BTN_RIGHT) + { + state->buttons ^= GPM_B_RIGHT; + } + else if (thisevent.code == BTN_SIDE) + { + state->buttons ^= GPM_B_MIDDLE; + } + } + return 0; +} +#endif /* HAVE_LINUX_INPUT_H */ + /*========================================================================*/ /* Then, mice should be initialized */ @@ -1406,6 +1445,14 @@ return type; } +#ifdef HAVE_LINUX_INPUT_H +static Gpm_Type * +I_evdev (int fd, unsigned short flags, struct Gpm_Type *type) +{ + return type; +} +#endif /* HAVE_LINUX_INPUT_H */ + /*========================================================================*/ /* Finally, the table */ #define STD_FLG (CREAD|CLOCAL|HUPCL) @@ -1532,6 +1579,14 @@ {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + +#ifdef HAVE_LINUX_INPUT_H + {"evdev", "Linux Event Device", + "", M_evdev, I_evdev, STD_FLG, + {0x00, 0x00, 0x00, 0x00} + , 16, 16, 0, 0, NULL} + , +#endif /* HAVE_LINUX_INPUT_H */ {"", "", "", NULL, NULL, 0, gpm-1.20.4/patches/todo/gpm-patch-psaux-reconnect010060000017500001750000000467260760216311400205460ustar00niconico00begin 664 gpm-psaux-reconnect.bz2 M0EIH.3%!629366GG?R``,\-_D'XZML\]W7U9O>[O1OGMSA]:&\SZ.]]U`HUM@-/COGC>[.]6M7ON M/7O'/INW'MVU?@[V MD]:ZHJ[-4%SZN=%S+?=W:R5[#D5T">>>=Y]/@&=>>WV;VHV^NY/KK[N'-.I7 M;FQ+T[O<.ZUN0Y/?=U:;-JH+VUV;[%O=NM6PTMQH'I&0S34Q`] M0#U```````)-)(DGJ:8F*GA1^J:?JGC5-&@#33-0T``!ZC0````B2($:"$\4 M&I3]HD_0)DJ?FJC_4Q/2D_4;%1^J>U3]()Z0_5--`T&@(DB""8FFI@5/R3,A M3--4_TE/U,F93R%,FTT93TR0&@-,AH8O:;D6F!(I&+&'C!LD!IM$4(0AY98I MC*D0[Z89)58&HRDPEDF3(66;3)MHUDV&D8F5"L1@T)2TPK@W)D8A9;*1A9DI M`PB1D&#`+P?,EG[,KN3]#3D8MQS8T#!C^%\&'O>JDI0$UDAH#;@RY!X6$@,U M-680`T!@9%EB18"#+,A@3$#48S"8!@&I0L#*%(D9,0:+$TLH&BCY["\=Q`DF MPO[`P(O'>\?$<<'U1V"?M>^\X, M9_+VK/#M^CQT.+N^)_QY/>Y9.S//M;EN6V[7HSAQOU-HVB(LM]OLW*/H-5UC MT-UGU)EC.U>EQKO>M'ZF2_`S&"?2SF8VVL\<]PS+Q938,TH#ZB>?70_Z,G1% MHADP+,)D MRYY9)DS#*[9Z'?[7VQ_G_E_O2Q*M$ES'G=?*^P*[_\>3Q>ODT%NC3_?^+Q+8 ML'(+E96*#PA'`MX27PY*%&$+VKB=Z@L26K)D--V MFOZV.T?"QQ#-A+M.H['1LW;0]S`Q;O/-Q<`,E,6F0YMG-S&D-SL> MYNX.;#<%#IA^YN!0X.3G82-.YVM[1C@4]CP$N)Z78[['@'4;""& M\U4M(TS,"%#`PAF>H.HY)EEDY:.G!6&V,%-CXN*/\NRG]^Y\;R/*P+!&-@Z+ M6TM%+&E=\,#O[^Y=\%^:9@E*)2D[47Z^&[M<%JL4=A')!1%IJU^,=X'"<*[3 M![@LWLRP6,MYJJAARM<_P7Y9Y@D96A?JF$)AD,AB)#`7-?ZZ/Y^G5*:5%8># MY_/]9JMILOAB?J3CW6L$Y>FZ+>"=XCN"X&\8&RGS`RTBC8&HI*=[J9B6GV'?W^C9SZ\6VA-YJWQ ML:[5VG-OVR[VC.88\F6W^FZ/6.^-6"R$1$?3#:#!>Z.:5Z&MC MO=$]@.4I]>>V-L.%=9^'HQ?6L9I:ZPK2DGCNG0B5O^W(GB.9?"7'Z.'#JPT) MIQ#[T%"E02"@)#H16$&1)(3\!@515!V!91LK[P'J3#6R&^R=$YF29L^UBT.# M\%=3D\$@<=^H&KCRZ3^/:V+3KA6'%M<7:K86!R#:/#)[SH#R#&.9[YT+51C\;Q&3\K39R:_[-L$A>0^&>#X/>G[?S*JIJ_O7LC+B7J(O3=33N_M:WC-] MC6;[[;0HSBE*R],4''!2)%LF$.Y:"XXKQS.V333F@:K%\NWSTH)3O9@T#ISS M$LV?L^SB)FAF\4#%+AY7[QA\#QF?I=H^QZ0UBA)UN_JK$LZBP6#2=5DL,JD/ M>LV(P^/Z9#)C!C&)&`Z9XWQ>&)*,K:.8L'+MA("(=[S2P.1*@7A M2I%2V!4I^P>C\M!@50Q'L:YBWL[LZ@Z"8T&R,[L#,3PSUH.(S8PQ726AD41\ M%Z\M8_BKHP"U^7X8WQ-`=EO*_$]`=UV$=,I(Q([0MD5OXEB_FP6PP/-;WL#I MQQ-@$>*^,GKR;P]^`T8(@C&)A(T2(*(K")%/N.F\X9AWOS-42)"-,8O0-1ZW MNY.3;HJ!_A:W7/)J4&T"BAZ!\0-OH\W=155TZ'GO5J]I+\/(J>]-P[^34\-J M*,#L+'8''3"Y4KG*$Y[F0:$X0,V.H\&+B/\VA@Z1#I?7D`8DEWO!XZ[Q<`4; M+?OZO7YNQY#L9W08XART2R&XN`D2(CD;=4**,T'>+ZQ>'=PW!LZY.S[K[@<&0>2A-XM9&&@:KY.U#388.2<1`P[2IY4,(2#($DCO*$ MZ$-5VT)"0"19`DN]AM.W8.BXY00VVW\\SQU%$NND0H1-5M-RDQ+S%7CQQS0P2>8P&W"495)+]^%Q__8\T!,KH/=I MBY$^70BZ9P.8S+::V7=Z-#W\;Z7(J`[<>%B1[?\?"<<.4W$ M27$5UQ&"04P7)T'Q8="?M1XX5"LM'DFMDRB\'/52@_:^.V^F'20K!D'*(B8( MCTYZ+11J"B6D5!&Q,<,F/*48[F,$TX8U*GE/,(RI:A@\3KW[&SB%5NB8X05%E.3I"D#$S@YAV)/7=,(YWK-&J&[A%XMU7)O1/EDX-[%?D M2TT--3!N9NFBC6FG7W27)<$[\%,=C)^F#^]`I^0]$::PNE(/D.\=]6<(O M$V_`O`6"[QXKQ>%$G6&T2(I(;&E2:^M>O\.H-6_6+Y6W;$[RV%Q"7?=';YZ<^@B'06> MF=IJQ?'">"Q4L7*U"XI$21P$P;ZG@L%U<,),EW![SK!@B@HL(B`*`L@BG'AX MY)N=O//%@'K5^/%01&'U$U"[I7Y\E1]C.2R]FJOR%TQZKN.JZW$CZ%11[`'' M<$`#L7`ED:[CU\V;`]B[+HF'?.9F3OI(:$T%<3+;#@_=R39Y#B/'J<5V#]E\ M*O0T.Y]_!):C>]]/U\#L+5>IL1KJ=LE(@614+UI(0=4Y_@G-_<%L#SS;`VYN MN_6&YOE[B<2&4=7@]VVQI+)=NPA?ETJ882=)E[R-;@V>4[-AQ-Y"U5=OF2(! MA7U`94%"TW0>G.ZQ?@XBAHZ2M[Y)S`XL-`FHVE;_)UAII+K`C"&K@)J+P:5U ML3481CQ:)GF)P\\)#WN0X<-JKG68(J'HI4Y/3C5BY"R=!.JM@);#502(IP]83I0>.?MP>Y1*;N M.91SN.IBZ&P6*:L>(>H",H$]2"#@T#`+(*/PC,DR8X+N)P#%_2@UH;;%EO!> MY/RR]K="1I(%H&AH/5TR@IC39@7\N"%M0,.?F4J_-*XR'(6.=XXMB/DXVTAB;38=I?()"H5=ZGH;F MQ$];N>1W<=Q1/7O!\8*/J$%B*6JJ<.F)`Y#KB^;*]!4X1)4Y$%YCUFT\"1". M#VE--(4TT%'GTE^`/`'6^#CTF[F\P.FIM7?3Y#84%S][X^!<\[@:,;UPPC#" MKQ,;5E-:;45='!);$U0B.V3ABE8/:>[.7T.CZ+FK/W==;E-$>Y9PZMU,75.+1<:L];N)3=DC<<&YU$X(8@XG,9B!4I[,11@D,, M>DY$"?4,G+HX(+O`R15MW04`P,/#G[E86G24X+MZ9+P5^9,CNL&5Z0@:LJ,L M>T4B'K3;#(Y.\O!2RD"!]SQF+!SY;.K.Y::V-AIP#0=Q@;DJ/+G<;2Z6,)?' M[L\`[%$SL/63YQ176P\[-9/KW!V)`$WERG.!PX'%9U"^`[+'V#0A9!@Z1@*>M@B6/ M>0K;#_Q@F<`"ZP_(-J%'6Q$@0/TK00&,1\\D(P6@^4W^B1^H\`XLXY1P^;EW M%QL.@:.#'ZFT_>,$-G,>=#[%Y6(D@'=%H:C3&J`D` M*4/&U,D1WV'"PT,`3,.%I11-.R213E`JD4H"`;FU(8J"W:#QA\1X)_(/.&`I M[/ZD`=`0(^Q=5.Y,?@P1I7&Z_)V'?=BT%K6+9N3#%_L>YT?E=7\T.IXNC8># MU#K,*,(%K=LM?J3;?0^Q^#O/$AI(8)#7/.'@'QH6WJ&`4O`F*+F[V[F'6=?` M^TL.9B]8VY^7*BL/83OG079.!F6XAB'93M'&-BX\Y@*DNMO\V"B:K;-EHG-O M/_5?2Y.HGR4]^'44A@FV2,$U>#169W#8#:]6ED6K)5+]1M5Q0=I_,P48.]53 M]5?R'L_+0?[-5&@<1R'$'^T&M,P(69!N+ MM&^.%>$;2"5P; M_E9U75\7EIROA\8S/RF5.4W+D&@=)G$N\8O?51%HIX-*=\Y&I=7MF6R(V=-W M!W1/2SQ`>`#R`Z@T/H3I8"P2X-5`>]'Z!L#;`O0PH"R?30A>>H#-!,#6!.0) MH(R/(=D.1441%!@RJ`Q$B*0(!B`4.8-N]-$`S#`@X@YA`L1:BIG*`4BD"P05 M#GS9I-*(/EQ2#?2W%'JEJ$"P4VZ0HO>A=#G(\@'E!,HC00(!`(A<[5BA!@DB MO9Y;Z[<0-B.3Z`F>4!BD!H!0E)!"4)8"QA:BBB(-M:EM*M++:(\L` M\,)["0]`0.CTR'*"'<4`H40I$"E"R2T658+$?7GH'6NC!`'7.K6'14.*)V`E@!M`?P$`\R>I@QB!^>$6FE:2! M'ZT;`](\XX[@;/@`=R:&``Z1@&X#[!YOL_DH!]1_EZGF(6B^=ZSU?L95BS5: MCZ:;D(3T@&`E80N@R!TAWX;08Z*!W5L(V_![4>9"(]014^`& M@-+%$D(6.3813FD[V1MY7I8P5%H(1J:C*`W!?.`LL'Y$N#B#?`+#BAOR`55A$_H\4,#\86F>55H])+`W6F+17`\`R" M@6V->;=&!=4"PX=MJ$H^C7P7OQMV2S83_>4E\L`.2FN#"#[?O"A0FVF\L/K; M\5T=X]M#RL-,$Z*UQPWN7`&!D8#B0C,KF`QR.%4.2;X!F$53> M#[=%9CO':8K,B@3)^@-^EMO&%#LM13D`_C?>4N79U`,%N3T>+)7)LR;*.+[# M01UD`L&<9/5<%I5%D#('N4:3Q,FPPI#(9@M"B#JYH%!D*:AO_9/MZ7PEX_!^ MI[N,!M4BS*)PW5I?SC-?E^3R].@,75:Y'884^,0H]FH#CZ.V!5.X<='2.B6Y;8 M6I2*UR:">@GMO?JQV!>,2GR?#Q;\M_FO#:Q<`-^6"1$_%\MXQB/XA!Y%EJH/ M9F9FFT(<;\!)=XO#";'D,J0#T/2(/%G/H'H26>HCUC]@:^T7BBNUH\VXU*>% M)N&=*TMF)X1K?Z8HWE)(:U<,.)!9AW!HF\"@JN69.Y6O50'2YDT;0B&$9_)O M8NSQQ4N@<7<]3*9Y?#7U(20;Z?=\W>L?'YP^I$OLOL<%MPLBR6+R]QN1%+=` M/"ICX1PD+*N`-NG5K1Z>+"H8PNF*`J.&NC#X#M M(EG7-^IDDV%,,AHVDT@Q0ISY)I-,F&\YE#DV'SB+WA M`67BB+THN7\Y:?J^;?Y$6*OEN_&O2H#UWSUW*K(LMBJ5*KG.6[00,QN-0PR. M!9*G,E66T!1Y$G=7G:#0G)2'C]:K:1P!]7H<]3:CT4;8TTH#"J5`U%>*&8I5 M[Y-)$G`KLBN>AV--IE,\'3F8D1.(LY)#9VX'W9)K"+F,$]W%^7J[MVL9,=1- M=M9F^.49RZ72G%'*Q"&*RR)KTNJXC$]8X#`*(,'WIY\89[+5S](+R^5U9ZY0 M?.Z:?-2OH&W'#'=)$1@(GZA,3_&Y\S2,7:3Q;I:!TOW5\^7Z:E>3TVN/5[_I MQP.F[AR^%Z;\<)Y;1A5+UE3#HE&F9"Q=,`;@YE[7@4J?'JV+-%TI#6OFNG+H M+ZCB/-L2YPH:2'CIC_04)H">A."*34T469XW^K;D-F[PY#= MC8GVPT7KV4.8)]%[!<6A[]=@JAW(206HB,`. MQO_8>1>>`E[A3SL1(@LZ*K)Z%ATZ=,4_IDB+R3)IRUZ_>]#,,>T`>.)E6SM% M1HFQF5D\;>B<5NU28RBA+0$]/EX/#]X7^8+-.S.'%7WNF/-T?XR)1^5;:I^& M(.53]SV`:#3]$>_#3\955:TM)8HM[95W?S\A^AE@N!SE7)\.%:%1XM17@7+, M)A78X\^H8NU\J+NU-&ZT*N;/:RI"MGHG6I-/1UP;U%J*)> MKJM;U#*)-R'(/,)A8YJIIR7N5+@WJC2>B8DC8%J)(E1M`KK91)ALWM%V:V42 M2WO.;-CUO4:W@9!N]\(-RXE&G;>B+>SL+&K*[0O3UMJ,MVSQQPK"#R?4V?,Q MLG/RM@=;DC07?8UX@^@P6R84R/)]+2:W)V%;#_>AGA/$TX-BLL':^UO=,(`[ M'%J,36[)X\5N#W(2J'J@$AH?$DQ@'*PW5555Y/G@Q/:YPF\/#L3)/C:7[K(B M?Q`/]0?Q"($0H5VL;SHX'[C#_\]GUS?1ZC)XWI"^Q]`PI@K)`]`P[;[7R M'[^U#%"![XF/IZ'_-ON&7(AIWI0V&QIPQ$?41"$8C%4^U[QSRL_Q?0Y#&/Z/ MX.B!F'KA]@T#SGM9\?*;ITKE"I,K8MR]-%$<\(!DM M/;V$$$&Z`3,`SA4,0U>8$P`<#\OH_@EP&O2VH'^C@<*R2]D%TQ.RJ:O MHX?3X??RJO/\1N?4`Q/-=2E9E,0,.<)OQ`@1R/PTIC8LCZ`Y//?U6#:QU`0D M?;8C][<;;"H:@9#.5@R/%6HO/]QP`\RFO>TD^X@?K]@[5(&2L M@20TAPM-Y+PY!U`O32G.^IC&,`8P<;@^CQ?,&L'0\'`]F3EGD]ZL&"OC!YA/ M.#[U'VV[\RI[ZZ>_]BFFD"L#4.X#XSFZJG\K&O&\,%3XFT-+"9RTBQ1Z9>0> M@T93!^'M#:*^G5`.UWNJH&(!O!R;J+\^2%:#Q`C2$0C_I+'Z8M8'#] M=[Z6.1H\'ZU<6B3.>F<:T\UGXAV!K")JCK?M^`6!<(P!O>"4!(A?MU M2H>`($\03SLL?:W,7GP"/4"^4%T"D3:H60+1%*`!\)*GV;DE+@7/\:'R>[UA MU)/]O;O:%I$D4D3M@413YQ_=[OZ?;@=RQ)WAW` M80YFP#C`"_6[-7H-)#8>(:VF)P`$0\O:'&[GPY(2H!@-JA") MI1&E$S;O7M@)B=]6MF#O_8*VV%(W;Y`:/+.AE;[2M#$(AF8TW%8AK#Z@^'I5 MS?JF?,/>/?RSCZ`SC2@539VI('6],PZ@AHS`S6!YXB?R)P/G`^69W9U=-Y;" M55O=/,7V0>`>6Z$1!#DA0_I)O?V#1\$S!>#:/MQ:F9QN?\-]]W`8=)6&2D`Z MPW'PG=BK[FR!2$&,.P$BH'T:'\V8\%3)V0A0D']!*0&IP(7VP.IQSLX]1\:W M5.X.@.X"#O!I#RHOK<0`S$:`/$KDG6+XGO)(2LLYJ@P(,S27:C`E%@#\?P"( M=F/I'CG&D&T=HD`>+!QI,4&UZI M\(^D,@>.J8S0=PS=(5-H(`RM+I12.[;!H%7;<+;`(%;`.N/F9WD?1]YNH!CN M)8$SJ(Q%Y9.=AI"&=`XP M&'48$+XS@Z`_$LJF0M*@4>^0.>`"R#KNNYGYZAH7WXG!(>V]!*E/>%('I!]5 MQL#^BAXQ^5#YP8IT=JP]8W3JB$C9?=L*!W>^GT.H_;M4K9'FAID#0\AWJ@=' MY$.+![-!^?4)S$D^MH[F3F/(E(ROUS""J+(L%6/^H('M^/,/&N2P8F"M`_#- MM!($(2*J`JR*H*H9"3KZ2`D]C\&9YPV"9V=7O#.`8$Y*X/X6CH0,S"C:'IY0 MG5"7V=>?)G"!U]YV%(T>WP7CX>JQL6`!OA6U`*!V`N9P#W_Q/.YN<5&6`#PIZ#,N>?O"EG+_CQ3J!K/3&<-3\*R'.#T].(;>&,?SFSVN>D M*^I0?7C_\HM(+9CC&$?E-)2Y%E#;0E3K_IOD/[O!,3%=B=AUVAS=/;%F2=:& M'&IW?"@B"<&0%HV0HA._[K&U_3>3Q@YW>MH>]_G]',[Q_L>\*`\#@!_0B8.` MF#BX--P8YO6_%]3HZ9*Z`W8.;]C9N[G^(TQ`B&JF+`8Y"M,AG0[17LL@%UV' MS`0/]L8F%#?\)\79V@/:TO(O_W*#,P#92L%+99P0KB'VN@??[1"RYCH#F+`L M@22(QH:6R*60W#LVRPKF,<7[\Q#`;L8TP:42FA//[>0#]2&@P&@V:/<8B3SW M(`W;#\7N@8@#J#1E!KX^'DX\P_&UX99HKEMJ`??ZPM8@D&Y-EF#SV3W[`$YL M>)K0UN&@>=Y0Y`?CDOWB7#FQ,#L$QI9#G#:GU:&PCQ?P-3RAMAX!0S4-BS"BK.KB!H$W@A@"N(YQ=\(P.=B6FZ,-*CK'6&26+,#0,X60&/0 MP$\"I MV#U$381;^C[@X"%LV`;,0ROCK!/,%T[(.80Y;D]J6UPT3`9PXJDD'SXZ#<$P M&DAQ>IT!QJC0@^O"FOSS@ETV1XRP/Z<`:.PN@CRL]5@;@IX(C(B68-B`350, MD,5\[%3`,0R;.]@/J@_^V"6B3V4\R'HD%(L1@0B,`8Q7FC:RR+*)`0H3-3F9 MY+]O#1AT?X\`#3YX\48$!\Z'GI)`+!(02S5`Q(V@%# M`=%S7D(%T"REW:%DL(E15[(!W5_5@.D!@$<3'<)#?$4Z@A&+&5&1%9L<$\[S M%MR/AKH"D!%16HF*./^O`0]C<:7$I1 MI>(A0>IM]0-M'1:.$2MVERZ7+K@4H9:B6?Z,0P@P3V>NMO[.R%`M((8 MQ=1Q--ZU%Q."0QKS6<8"OQ`0)ABDU,+MG1(%B2F4TWZQD>'H+ABH#LW,"14H MZOC,ZGK?4:^FJD[JD<+JI#=*AK%Q=,I*6#98,8U45A/;RM3VPMBWTE00;XCA M1J\!:OE-07=$FYF$ MHTD/9`TF^1E@:F"0.`@@/F+BBJ6W"Y)#=`R#<>!U+X.DK#J.ZE.PXRFUX&JS M5C:@43`R8P0(T-;E8E!27VJ.B""B:::1N/%,7U;@[K%F:!MTX4]6RYZ%&#A& M82KO`%*8YF5-@K%W6`IEL7`%Z8#(*HH`M5*+:7;E!S[3W)X1=2>)(ZCNLJ%P M`F=QAY89L>_*Q1IZ=S=X.7MQ)?,D@?()(%P!<#)GSI,(UYQ]OY>;B](0T(9& MN-P2PSC`H=[ M`"JKA84#=96K+1+=,+D.W89B=D>(\!,1Z6&9RYBAUP&P]*>_95V']6%NF(V5 MSV"8P+&T.:`.AV'64#"*GVPL@1`_OXAW)U:"=1HZ4N&/ZO6Q#@_O=AV=7"Q! MT3DT/D.9;$;NAO&@%&P2R;-VV1UQ-[NH=3=@;VV3,$TS%*DOU8%P-*BEH&:A84QY:V&KR$4Y1A8F M`V!RU$LMNL07T(:A=`.*H;2@U$BD39\6+:R.]\, MVX(XI(8`_$B)?=AZ8[AY` MNX(H(8#UD-;(-`Q*2-@#@N0P`ZV#200"D:*,*PYG%0NJT4T1.`/NN#8J(?$# M(`P&*D!D$P(FK!.:!9[4BD&"!((F%WU$":[NOVPS=!AOA%C%`"`2#""MF*41 M&R,8)!>]^<;(G+ZDUQ1_F'!SY8)PN(D#W+4,7`7O%+*4@&^A*NDJ#`/,@5IP MNG/<)UD']T:28!LWJ\B@;F`+98\!V;$/``^"M8IS8G>&FNI>(=0)B'8AI[0\ M$GN_+)V20#U@;`1!*!2C-%L0&$4]O]MK27Y_>-K-G\?U]E6=@XO6:*13:##F MCH-8=.$@4F'I8>[$/CS$I4(I`5$-`>.*3V\`)LBBR*(P)%!$4D&X?D#M&H,2 M,/9TWFH;7,,1@TP3O#`6H(3`\H,*&E8;F]W)L4.S9<"[@T,N&('AN'-NCJ@GY3W#UCK;*H1M@ZHX2OII!<[) M@,0"W!V3NB0<%A4'0._X`G6H<(MH'+;<880TC.TJ$(H>L8^F6!U(W^)##(P- M&2&?G=_Q0`D%(05D"F)$*@F[W=7LZS(AFS;.74;D+NXH!EMJ#F[D@_O8,:6, M$H^-"70_>EP:_6R(6LCMV[3L>AR;'$%S>(/QS5X^"@9O1!U`6C`OJ.M>#U.+ MB;`]6:?.,`ZP@/(<>]@DBYP&$YH-+N0@-.I,<7D_6)_.8\/Y+R%-%8P2/+T) M8*,4,>[UAV;R//JKMU?EJWDXDJ)U1.6"21`D(D!6(P6*#UC/*02Z*^O4'*7[CR'7&)1XCOUF@XI@'A0!L@[T#9^!D M%L@V#(UV&2$D)>SU9N[[_GUXD=D\46MH.O>,B.Z0R(0YQ?)Y(G=6CI#Q7>7P ML:/U0#-!B.8>U@ELYP0F!/]Z?^MZIH3X_,)\?Q"S3A$S/$"$/*^7.F(0@,8P MA#AE^^W1;';$#VH$*0,ADI4(0M2AJ/O!F\0T(2-32*]_;G$*($\NPR;49#L` M

WPA^O`!'6^Q`\(<48">WG-\#6 M-+L((<83%%V*:"*>V#@,8V#$\],NA5#2%,7\H,!+//K+.N..:>%NY.T+YU82 MS5S@[FOE]:)I;&T>/6D439&Q@#J0+8G?#;$(*1CNVL0E,>A,+A0,!+Y"Y@/*^3C[0%,!Q3P48HY@7)J&B MGL;1L"6''>B=S9#3S;GO2[ZTX&@>?%PB2$951# M@X(60=R;YV0KJ(7D4AA5*9)2F!M00HLD)HI:W)I!T#@78.4<")9&RB^\&XW+#$@&<+2H&!&B`V(7+'JL7$NN!1% MH$,&Z`:E&!9P84F"(81C$)(1#E\PH')@!8-1\&=#B/QRI+F\!?'9K)AP-!TJ:Q:0UT84NQ6-QLV4#1HZB@FH6* M01D4`34L+-@LA0(E!`:4P*"ZA0(%D;7@TJQ(V24D#:_C'%N[!P`!,;@=$+34 M>D3^!W'(L^R(]I%NP7N8%;1P/<6N&/CH,OO&"6]X,&)C'L0CAFE"\1(<'=UE M+JF?>YA:M!:&.3KUAW`.P9D>A0()U1\01'SH):BN,$)L7<]HA\81",8JDC!C M&*R,@,@ABNCX.$0V`=T1\:$VBD21"`$&+G+*S]2#7NL.(;MR\,@KKM&,H3&/ MR#L<5+Q(PB`,BL(K$D#Z^Y5+@A=/D!+&(F(7X+[QN- M01@J73DO*$4+]O7BBW+B)\/B#M"6V'YA;O":0%IQJ96/R"1$\L9.7Q$*#[@L\WY4 M7Q:K[`C`,K84?-,TUI#WC@E`>,?:/UCO!I4/@&X[S)'.U!B#>XP(P-B,>A@; MR"0+D%YHF*BTGX@0D-F`()W5=(3H/WQAA0[?.UU,0VD\H,*!<*P=F8&V0@?` M0T3K(`&1=E+(]0_G*M>$8$L6(VHM899S#U.@M`\@CY6<'U--08Q444@R'=W6 M"YW6;&1B6SB%N%&':F#O/8:AV9NMCH:8;X-Q[=-;7>X:X.A8P1(QF[?I(?C. M(,*YRELQLXI0_@^,`IP5G$FI&#!0/4,0:^E'!ZM0PDD8H8&1M#BQ$2'SJ$'% M!Q$P`4VFG]UTQ0"RJT88FR&PV`!9ZXG3!FX(D@D6`@2*Q7=EUG8ABCH^`Q2E M]CJY\?.)86) M!D2PY.@.P-F!2*M.[H@8--`<">&Y2E2Z$#..,5P(LAC,!A>!>"*>+0.%M(T0 M)90UA]!8W3L"0D@I6.I9[*6B1=4B#P!VJ.C MD0C$A$.8J;S64R$Y=&!@1*S0AEJ9L01EDJREDB],I"K40V%"6%8;V#7[8!/6 MQI(U"B#<#D*KDKH##(T^O,VX4)Q!5#LAP^&B0^<5(GTP#/#(;W;Q>=8`=%(P MHZ0&#I6'N8K!@E65H>`23BJQB(BHJT":"<>7S/+.J"'1>853U4752H#5P:`9 M%-KBXAD&*S&T+*Y,"@OS5,"BC&X.:@4DIGKR4T4H!C@I=_`H'.Q6;^I"I&RX MT8MK.+.#"&H3:-#+$9"]@M*MJL.4U:XP<0,9@P;`V.EDN0JY,B]1D*"N3?DV MV'I`PA-/ZI(M@V73@"B"II1H?![M#\@+GC<"$%3W`[,R,%A(S0& M&VU%$:6Q3*)!2(L"0@H7>V75#9U&8D,*=U#',RCF.PUH!7DN0($86P^BLC%" MQ>X4,6[NP'/);C''(ZG"<=`X9`Z@$-A%874\T1^2`#(+44!D4/+`:W8>",1= M0H>G;%,@]VQ6,`.KB!8))SP$9@+(R@^\DC4U3+5>Q<[#!Q._H-!6=A:Z1VL, M(FUBA=1D;,:N1Q,,Q*Z8JY"J$8&G%D8<(H]D5)$9!L#V+0Z/'@6#*+]4?J6" M>CK`Q1T:5#,,#PJ=XB,40LYQVFV`))DKAIT^^>!.@G6+@I1\J.;JJ&QT M3'\I,*H M-(.N8ZZPG6VP*PN9'FC/2BMFPIJJ$#<)]8Z9!]-Q$Q?BC?N1?3%$92902$#6 M'0=&6E#2=@!0)"#Z1OUQ'.LA(,S61^XPE]*2VZ[)&B,=J*^@0I8P],#*)9]3 M3ZG("N(.RB#"'N&'+@,V!D`77E&\0_AXST#9`/V5D_$J>Y4-5H)#JI_6#F#= M';`"/12)1%W"I`4M80HW@\,$U?"HDP[2+"!XPJB1E`44$$[(V(OA^'2ZP^P< MS>"<\T3!ZT&"P`8A$1A"$$/U"2`/MS+;16%PCW[,Q]Q"$YD1>U"2:?+4;X%/ MC:*0!S&BZ\+)HPPC&\(V2I!#Z=!AD8AZD"KK=&BO2UA!_;BF`IW*4*4!04A0 M7@EA-_Z=!F$C([^Y&.:=.;MUP\X>0*PA<-R''ED,^P$D&X$%V1;(84+-HOM@ MKV0:@]X"Q<38;4+("81._`75L/Y84!6C0^X2#_'(>:/J1MP1+AV%(D8,!^QH M1'40(07\(%_W)08,(`SX4H'LSRF#1S?/XQCP9P2E0*P3I,\D:DU-B?%]0V"S M=GU1,4@9F)CVRZ0_/X[X]X6%LB%U(0'-:NCJCS`W$/: MB\QF&>J#%0Q6D(@`5D,@%; Fri, 3 Aug 2001 10:16:54 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 03 Aug 2001 10:16:54 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id NAA12404 for ; Thu, 2 Aug 2001 13:57:41 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105] (may be forged)) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id LAA15417 for ; Thu, 2 Aug 2001 11:57:40 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 5CD8A197F0 for ; Thu, 2 Aug 2001 13:57:35 +0200 (CEST) Received: from hera.cwi.nl (hera.cwi.nl [192.16.191.8]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id MAA29536 for ; Thu, 2 Aug 2001 12:21:26 +0200 Received: from vlet.cwi.nl (vlet.cwi.nl [192.16.191.67]) by hera.cwi.nl with ESMTP id NAA22247 for ; Thu, 2 Aug 2001 13:55:51 +0200 (MEST) From: Andries.Brouwer@cwi.nl Received: (from aeb@localhost) by vlet.cwi.nl (8.8.6/8.9.3) id LAA89271; Thu, 2 Aug 2001 11:55:51 GMT Date: Thu, 2 Aug 2001 11:55:51 GMT Message-Id: <200108021155.LAA89271@vlet.cwi.nl> To: alan@lxorguk.ukuu.org.uk, garloff@suse.de, torvalds@transmeta.com Subject: Re: [PATCH] make psaux reconnect adjustable Cc: brent@linux1.org, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it X-UIDL: mH&!!69L!!)/N!!9H%!! Status: RO From: Kurt Garloff working on notebooks I got used to the touchpads. Now, a lot of notebooks have a Synaptics touchpad. It offers a few additional features, such as tossing or the third mouse button (by a short click in the corner) ... Unfortunately, the synps2 generates nonstandard codes when in extended mode, amongst which the reconnect (170) token. The kernel (since 2.2.15) does interpret it as such and empties the queue. This seems to appropriate for a real plug event. For a synps2, it's not, but makes your mouse dead for a second. Instead the data should just be passed to userspace (gpm). So I made the behaviour switchable via a sysctl.=20 Hmm. I don't think there exists a "reconnect token" AA. At power up or after a reset (FF) the mouse sends AA (self test passed) followed by 00 (the ID: I am a PS/2 mouse). During operation the value AA is entirely legal and has no special significance. Moreover, it seems that the specs say that the host should not react to the AA but wait for the 00. The expected protocol at power up is: Mouse: AA 00. Host: F4 (enable). Mouse: FA (ack). Afterwards the host will send F3 to set the sample rate (or to initialize a wheelmouse). A quote [1]: "At power-on, the PS/2 device performs a self-test and calibration, then transmits the completion code $AA and ID code $00. If the device fails its self-test, it transmits error code $FC and ID code $00. This processing also occurs when a software Reset ($FF) command is received. The host should not attempt to send commands to the device until the calibration/self-test is complete. Power-on self-test and calibration takes 300­1000ms." The reaction to FF (reset) from the host is an immediate FA (ack) followed half a second later by AA 00. Therefore, I think the kernel mouse handling was broken when this strange AUX_RECONNECT stuff was introduced. It caused a tiny trickle of complaints. Bug 1: AA is not necessarily anything special Bug 2: the sequence AA 00 from the mouse should not be interrupted I don't think that it is a good idea to start building infrastructure around it. By default this AUX_RECONNECT should be disabled, since it is just plain wrong. Then the Synaptics touchpad will work. In other words, no sysctl but #if 0 ... #endif. For people who unplug and replug their PS/2 mouse with running machine, or who use a KVM switch (I think it was only Brent Verner who asked for this code): if what I say is correct you should always see 00 following the AA. So, there may exist a more cautious patch that will bite fewer people and does not react to AA but to the sequence AA 00. Andries [1] See http://www.synaptics.com/decaf/utilities/tp-intf2-4.PDF From garloff@garloff.de Fri Aug 3 10:17:11 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id KAA03455 for ; Fri, 3 Aug 2001 10:17:11 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 03 Aug 2001 10:17:11 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id SAA25088 for ; Thu, 2 Aug 2001 18:20:32 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105] (may be forged)) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id QAA18370 for ; Thu, 2 Aug 2001 16:20:29 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 526AF197FD for ; Thu, 2 Aug 2001 18:20:28 +0200 (CEST) Received: from etpmod.phys.tue.nl (etpmod.phys.tue.nl [131.155.111.35]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id QAA31115 for ; Thu, 2 Aug 2001 16:44:17 +0200 Received: from pckurt.casa-etp.nl (root@pckurt.casa-etp.nl [192.168.157.2]) by etpmod.phys.tue.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) with ESMTP id SAA28559; Thu, 2 Aug 2001 18:20:24 +0200 Received: (from garloff@localhost) by pckurt.casa-etp.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) id SAA15174; Thu, 2 Aug 2001 18:18:34 +0200 Date: Thu, 2 Aug 2001 18:18:34 +0200 From: Kurt Garloff To: Andries.Brouwer@cwi.nl Cc: alan@lxorguk.ukuu.org.uk, brent@linux1.org, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com Subject: Re: [PATCH] make psaux reconnect adjustable Message-ID: <20010802181834.B14708@pckurt.casa-etp.nl> Mail-Followup-To: Kurt Garloff , Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, brent@linux1.org, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com References: <200108021602.QAA113498@vlet.cwi.nl> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="8GpibOaaTibBMecb" Content-Disposition: inline In-Reply-To: <200108021602.QAA113498@vlet.cwi.nl> User-Agent: Mutt/1.3.20i X-Operating-System: Linux 2.4.7-SMP i686 X-PGP-Info: on http://www.garloff.de/kurt/mykeys.pgp X-PGP-Key: 1024D/1C98774E, 1024R/CEFC9215 Organization: TU/e(NL), SuSE(DE) X-UIDL: D\h"!`_h!!Sci!!p3S"! Status: RO --8GpibOaaTibBMecb Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Aug 02, 2001 at 04:02:38PM +0000, Andries Brouwer wrote: > From: Alan Cox : >=20 > > 2.2 has had the sysctl for ages, and it defaults to off I would definitely not object to defaulting to off. > Not precisely - it is a boot parameter "psaux-reconnect". > That is better than a sysctl. Why should that be better than a sysctl? Boot parameters are ugly. You=20 need to reboot in order to change them ... Your other mail implies that we can fix the problem without manual intervention by parsing AA 00 instead of just AA. If it's true, I'd=20 consider that the best solution.=20 Otherwise, I'd like my patch to be applied maybe with a changed default. Regards, --=20 Kurt Garloff Eindhoven, NL GPG key: See mail header, key servers Linux kernel development SuSE GmbH, Nuernberg, DE SCSI, Security --8GpibOaaTibBMecb Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7aX1ZxmLh6hyYd04RApT9AKDHFa2hTt8CIkrzSQ2hLGjNUBBsugCgpXHZ 6yFa+mIM8HhuiH2NRCRhd04= =5vOe -----END PGP SIGNATURE----- --8GpibOaaTibBMecb-- From aeb@cwi.nl Fri Aug 3 10:17:13 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id KAA03487 for ; Fri, 3 Aug 2001 10:17:12 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 03 Aug 2001 10:17:12 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id TAA26954 for ; Thu, 2 Aug 2001 19:27:15 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105] (may be forged)) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id RAA18729 for ; Thu, 2 Aug 2001 17:27:12 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 18E5119805 for ; Thu, 2 Aug 2001 19:27:11 +0200 (CEST) Received: from hera.cwi.nl (hera.cwi.nl [192.16.191.8]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id RAA31523 for ; Thu, 2 Aug 2001 17:51:00 +0200 Received: from vlet.cwi.nl (vlet.cwi.nl [192.16.191.67]) by hera.cwi.nl with ESMTP id TAA28832 for ; Thu, 2 Aug 2001 19:27:08 +0200 (MEST) From: Andries.Brouwer@cwi.nl Received: (from aeb@localhost) by vlet.cwi.nl (8.8.6/8.9.3) id RAA113816; Thu, 2 Aug 2001 17:27:07 GMT Date: Thu, 2 Aug 2001 17:27:07 GMT Message-Id: <200108021727.RAA113816@vlet.cwi.nl> To: Andries.Brouwer@cwi.nl, garloff@suse.de Subject: Re: [PATCH] make psaux reconnect adjustable Cc: alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com X-UIDL: 8El!!!\_!![&!#!ZU<"! Status: RO From: Kurt Garloff > Not precisely - it is a boot parameter "psaux-reconnect". > That is better than a sysctl. Why should that be better than a sysctl? Boot parameters are ugly. You need to reboot in order to change them ... Of course I hope that we'll handle this correctly at some point, without any options or parameters. In my eyes a sysctl is heavier infrastructure than a boot parameter, so I prefer the latter when a temporary fix is needed. Your other mail implies that we can fix the problem without manual intervention by parsing AA 00 instead of just AA. If it's true, I'd=20 consider that the best solution.=20 Maybe precisely one person reported this, and his address now bounces. If there exist people who need this "psaux-reconnect" they can report on the codes they see. Note that just like AA is a perfectly normal code, also the sequence AA 00 is perfectly normal. Testing for that only diminishes the probability of getting it by accident. Instead of adding boot parameters or sysctls or heuristics, probably we should just transfer the codes seen to user space, e.g. to gpm. Then it is up to gpm to recognize an AA 00 sequence and decide whether that is something special. Andries From alan@lxorguk.ukuu.org.uk Fri Aug 3 10:17:13 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id KAA03497 for ; Fri, 3 Aug 2001 10:17:13 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 03 Aug 2001 10:17:13 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id TAA27204 for ; Thu, 2 Aug 2001 19:34:02 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105] (may be forged)) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id RAA18757 for ; Thu, 2 Aug 2001 17:33:59 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 7E3B219805 for ; Thu, 2 Aug 2001 19:33:59 +0200 (CEST) Received: from the-village.bc.nu (router-100M.swansea.linux.org.uk [194.168.151.17]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id RAA31555 for ; Thu, 2 Aug 2001 17:57:46 +0200 Received: from alan by the-village.bc.nu with local (Exim 3.22 #1) id 15SMN6-00015y-00; Thu, 02 Aug 2001 18:34:56 +0100 Subject: Re: [PATCH] make psaux reconnect adjustable To: Andries.Brouwer@cwi.nl Date: Thu, 2 Aug 2001 18:34:56 +0100 (BST) Cc: garloff@suse.de, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com In-Reply-To: from "Andries.Brouwer@cwi.nl" at Aug 02, 2001 05:27:07 PM X-Mailer: ELM [version 2.5 PL5] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: From: Alan Cox X-UIDL: ,k9!!~k2!!E1k!!Ybi"! Status: RO > Of course I hope that we'll handle this correctly at some point, > without any options or parameters. In my eyes a sysctl is heavier > infrastructure than a boot parameter, so I prefer the latter > when a temporary fix is needed. The input device infrastructure pending for 2.5 already handles all of these issues From garloff@garloff.de Thu Aug 2 10:27:44 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id KAA28565 for ; Thu, 2 Aug 2001 10:27:43 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Thu, 02 Aug 2001 10:27:43 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id EAA25642 for ; Thu, 2 Aug 2001 04:23:33 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105] (may be forged)) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id CAA11977 for ; Thu, 2 Aug 2001 02:23:32 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 09411197E8 for ; Thu, 2 Aug 2001 04:23:29 +0200 (CEST) Received: from etpmod.phys.tue.nl (etpmod.phys.tue.nl [131.155.111.35]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id CAA25998 for ; Thu, 2 Aug 2001 02:47:24 +0200 Received: from pckurt.casa-etp.nl (root@pckurt.casa-etp.nl [192.168.157.2]) by etpmod.phys.tue.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) with ESMTP id EAA18388; Thu, 2 Aug 2001 04:23:24 +0200 Received: (from garloff@localhost) by pckurt.casa-etp.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) id EAA15231; Thu, 2 Aug 2001 04:21:00 +0200 Date: Thu, 2 Aug 2001 04:21:00 +0200 From: Kurt Garloff To: Linus Torvalds , Alan Cox Cc: Alessandro Rubini , Hubert Mantel , Linux kernel list Subject: [PATCH] make psaux reconnect adjustable Message-ID: <20010802042100.B14010@pckurt.casa-etp.nl> Mail-Followup-To: Kurt Garloff , Linus Torvalds , Alan Cox , Alessandro Rubini , Hubert Mantel , Linux kernel list Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="69pVuxX8awAiJ7fD" Content-Disposition: inline User-Agent: Mutt/1.3.20i X-Operating-System: Linux 2.4.7-SMP i686 X-PGP-Info: on http://www.garloff.de/kurt/mykeys.pgp X-PGP-Key: 1024D/1C98774E, 1024R/CEFC9215 Organization: TU/e(NL), SuSE(DE) X-UIDL: 8JL"!c8N!!e'[!!jN;"! Status: RO --69pVuxX8awAiJ7fD Content-Type: multipart/mixed; boundary="i9LlY+UWpKt15+FH" Content-Disposition: inline --i9LlY+UWpKt15+FH Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Linus Alan, working on notebooks I got used to the touchpads. Now, a lot of notebooks have a Synaptics touchpad. It offers a few additional features, such as tossing or the third mouse button (by a short click in the corner) ... gpm -t synps2 does support those additional features and via the -R epeater mode you also get it under X11. Unfortunately, the synps2 generates nonstandard codes when in extended mode, amongst which the reconnect (170) token. The kernel (since 2.2.15) does interpret it as such and empties the queue. This seems to appropriate for a real plug event. For a synps2, it's not, but makes your mouse dead for a second. Instead the data should just be passed to userspace (gpm). So I made the behaviour switchable via a sysctl.=20 /proc/sys/dev/ps2/psmouse_reconnect (defaults to 1 =3D the interpret behavi= our) Being at it, I also made the kbd error and unknown scancode reporting switchable. (It used to be ifdefs.) Please apply attached patch (against 2.4.7). Allesandro, should I submit a patch for gpm to automatically handle this for synps2 in case the kernel patch gets accepted? Regards, --=20 Kurt Garloff [Eindhoven, NL] Physics: Plasma simulations [TU Eindhoven, NL] Linux: SCSI, Security [SuSE Nuernberg, DE] (See mail header or public key servers for PGP2 and GPG public keys.) --i9LlY+UWpKt15+FH Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="247-psaux-reconnect-sysctl.diff" Content-Transfer-Encoding: quoted-printable --- linux/include/linux/sysctl.h.orig Tue Jul 31 23:49:42 2001 +++ linux/include/linux/sysctl.h Thu Aug 2 03:41:34 2001 @@ -594,7 +594,8 @@ DEV_HWMON=3D2, DEV_PARPORT=3D3, DEV_RAID=3D4, - DEV_MAC_HID=3D5 + DEV_MAC_HID=3D5, + DEV_PSAUX=3D6, }; =20 /* /proc/sys/dev/cdrom */ @@ -653,6 +654,13 @@ DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE=3D4, DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE=3D5, DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=3D6 +}; + +/* /proc/sys/dev/psaux */ +enum { + DEV_PSMOUSE_RECONNECT=3D1, + DEV_KBD_REPORT_UNKN=3D2, + DEV_KBD_REPORT_TO=3D3, }; =20 #ifdef __KERNEL__ --- linux/drivers/char/pc_keyb.c.orig Fri Apr 6 19:42:55 2001 +++ linux/drivers/char/pc_keyb.c Thu Aug 2 04:01:15 2001 @@ -92,8 +92,83 @@ #define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | K= BD_MODE_KBD_INT) =20 #define MAX_RETRIES 60 /* some aux operations take long time*/ + #endif /* CONFIG_PSMOUSE */ =20 +/* We want to be able to handle the psmouse reconnect token; unfortunately= the + * Synaptics touchpads (and probably others too) use it for their extented + * functionality and produce them in extended mode (as set by gpm -t synps= 2). + * So we make this adjustable via a sysctl. garloff@suse.de, 2001-08-01 */ + +#ifdef CONFIG_SYSCTL +#include +#ifdef CONFIG_PSMOUSE +int sysctl_psmouse_reconnect =3D 1; +#endif +int sysctl_kbd_report_unkn =3D 0; +int sysctl_kbd_report_to =3D 0; + +static int psaux_sysctl_handler (ctl_table *ctl, int write, struct file *f= ilp, + void *buffer, size_t *lenp) +{ + int *valp =3D ctl->data; + int ret =3D proc_dointvec(ctl, write, filp, buffer, lenp);=20 + if (write) { + if (*valp) + *valp =3D 1; + } + return ret; +} + =09 + +ctl_table psaux_table[] =3D { +#ifdef CONFIG_PSMOUSE =20 + {DEV_PSMOUSE_RECONNECT, "psmouse_reconnect", &sysctl_psmouse_recon= nect, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, +#endif =20 + {DEV_KBD_REPORT_UNKN, "kbd_report_unknown", &sysctl_kbd_report_unkn, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {DEV_KBD_REPORT_TO, "kbd_report_timeout", &sysctl_kbd_report_to, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {0} +}; + +ctl_table psaux_psaux_table[] =3D { + {DEV_CDROM, "ps2", NULL, 0, 0555, psaux_table}, + {0} + }; + +ctl_table psaux_root_table[] =3D { +#ifdef CONFIG_PROC_FS + {CTL_DEV, "dev", NULL, 0, 0555, psaux_psaux_table}, +#endif /* CONFIG_PROC_FS */ + {0} + }; +static struct ctl_table_header *psaux_sysctl_header; + +static void psaux_sysctl_register (void) +{ + static int initialized; + if (initialized) return; +=09 + psaux_sysctl_header =3D register_sysctl_table (psaux_root_table, 1); + /*psaux_root_table->child->de->owner =3D THIS_MODULE;*/ + initialized++; +} + +/* +static void psaux_sysctl_unregister (void) +{ + if (psaux_sysctl_header) + unregister_sysctl_table (psaux_sysctl_header); +} + */ +#else /* CONFIG_SYSCTL */ +#define sysctl_psmouse_reconnect 1 +#define sysctl_kbd_report_unkn 0 +#define sysctl_kbd_report_to 0 +#endif /* CONFIG_SYSCTL */ + /* * Wait for keyboard controller input buffer to drain. * @@ -123,9 +198,8 @@ mdelay(1); timeout--; } while (timeout); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "Keyboard timed out[1]\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "Keyboard timed out[1]\n"); } =20 /* @@ -320,10 +394,8 @@ *keycode =3D E1_PAUSE; prev_scancode =3D 0; } else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown e1 escape sequence\n"); -#endif prev_scancode =3D 0; return 0; } @@ -348,11 +420,9 @@ if (e0_keys[scancode]) *keycode =3D e0_keys[scancode]; else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n", scancode); -#endif return 0; } } @@ -370,11 +440,9 @@ *keycode =3D high_keys[scancode - SC_LIM]; =20 if (!*keycode) { - if (!raw_mode) { -#ifdef KBD_REPORT_UNKN + if (!raw_mode && sysctl_kbd_report_unkn) { printk(KERN_INFO "keyboard: unrecognized scancode (%02x)" " - ignored\n", scancode); -#endif } return 0; } @@ -404,12 +472,15 @@ mouse_reply_expected =3D 0; } else if(scancode =3D=3D AUX_RECONNECT){ - queue->head =3D queue->tail =3D 0; /* Flush input queue */ - __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ - return; + if (sysctl_psmouse_reconnect) { + queue->head =3D queue->tail =3D 0; /* Flush input queue */ + __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ + return; + } } + else + add_mouse_randomness(scancode); =20 - add_mouse_randomness(scancode); if (aux_count) { int head =3D queue->head; =20 @@ -511,17 +582,14 @@ if (resend) break; mdelay(1); - if (!--timeout) { -#ifdef KBD_REPORT_TIMEOUTS + if (!--timeout && sysctl_kbd_report_to) { printk(KERN_WARNING "keyboard: Timeout - AT keyboard not present?\n"); -#endif return 0; } } } while (retries-- > 0); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); return 0; } =20 @@ -751,6 +819,7 @@ =20 /* Ok, finally allocate the IRQ, and off we go.. */ kbd_request_irq(keyboard_interrupt); + psaux_sysctl_register (); } =20 #if defined CONFIG_PSMOUSE --i9LlY+UWpKt15+FH-- --69pVuxX8awAiJ7fD Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7aLkLxmLh6hyYd04RAtTfAJ0Y5pDpKz/cMablMNOe7Et6KOIYXQCg0hQ2 VP6sTljkegsAQX4fy5vGwzI= =8pPh -----END PGP SIGNATURE----- --69pVuxX8awAiJ7fD-- From garloff@garloff.de Wed Aug 15 15:40:12 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA12797 for ; Wed, 15 Aug 2001 15:40:11 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:40:11 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id LAA04351 for ; Tue, 14 Aug 2001 11:57:18 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id JAA25466 for ; Tue, 14 Aug 2001 09:57:18 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 84F3C197E6 for ; Tue, 14 Aug 2001 11:08:53 +0200 (CEST) Received: from etpmod.phys.tue.nl (etpmod.phys.tue.nl [131.155.111.35]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id KAA29979 for ; Tue, 14 Aug 2001 10:18:46 +0200 Received: from garloff.etpnet.phys.tue.nl (gum01m.etpnet.phys.tue.nl [192.168.84.65]) by etpmod.phys.tue.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) with ESMTP id LAA30279; Tue, 14 Aug 2001 11:57:05 +0200 Received: (from garloff@localhost) by garloff.etpnet.phys.tue.nl (8.11.3/8.11.3/SuSE Linux 8.11.1-0.5) id f7E9v1S02420; Tue, 14 Aug 2001 11:57:01 +0200 Date: Tue, 14 Aug 2001 11:57:01 +0200 From: Kurt Garloff To: Andries.Brouwer@cwi.nl Cc: alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com Subject: Re: [PATCH] make psaux reconnect adjustable Message-ID: <20010814115701.A1952@gum01m.etpnet.phys.tue.nl> Mail-Followup-To: Kurt Garloff , Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com References: <200108021727.RAA113816@vlet.cwi.nl> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="jho1yZJdad60DJr+" Content-Disposition: inline In-Reply-To: <200108021727.RAA113816@vlet.cwi.nl> User-Agent: Mutt/1.3.20i X-Operating-System: Linux 2.4.7 i686 X-PGP-Info: on http://www.garloff.de/kurt/mykeys.pgp X-PGP-Key: 1024D/1C98774E, 1024R/CEFC9215 Organization: TU/e(NL), SuSE(DE) X-UIDL: 481f3d3391eba7ce48596873968fe7df Status: RO --jho1yZJdad60DJr+ Content-Type: multipart/mixed; boundary="OgqxwSJOaUobr8KG" Content-Disposition: inline --OgqxwSJOaUobr8KG Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Andries, On Thu, Aug 02, 2001 at 05:27:07PM +0000, Andries Brouwer wrote: > Your other mail implies that we can fix the problem without manual > intervention by parsing AA 00 instead of just AA. If it's true, I'd= =3D20 > consider that the best solution.=3D20 >=20 > Maybe precisely one person reported this, and his address > now bounces. If there exist people who need this "psaux-reconnect" > they can report on the codes they see. Note that just like AA is > a perfectly normal code, also the sequence AA 00 is perfectly > normal. Testing for that only diminishes the probability of > getting it by accident. I can confirm what you suggest: My mouse (Logitech wheel USB/PS2) sends indeed AA 00.=20 So, I extended my patch (which you will dislike even more, I know, as you're against sysctls unlike me): psmouse_reconnect =3D 0: Do nothing (just pass all to userspace) psmouse_reconnect =3D 1: Flush Q & ping mouse on AA 00 (default) psmouse_reconnect =3D 2: Flush Q & ping mouse on AA (old behaviour) > Instead of adding boot parameters or sysctls or heuristics, > probably we should just transfer the codes seen to user space, > e.g. to gpm. Then it is up to gpm to recognize an AA 00 sequence > and decide whether that is something special. With reconnect 1 or 2: After reconnecting, mouse behaves strange (jumping around the screen) With reconnect 0: Mouse is dead In both cases restarting gpm gets the mouse back to work again. It seems the imps2 driver does some initialization to the mouse. If I use the plain ps2 driver, then finally, I see the benefit of the reconnect code in the kernel: With reconnect =3D 1 or 2: It works after replugging With reconnect =3D 0: Mouse is dead after replugging In the latter case restarting gpm helps. Patch is attached. It adds the sysctls as the last patch did, but now the psmouse_reconnect has 3 possible values. Also, I added a printk, so the kernel logs detected mouse reconnect events. Linus, Alan, I'd like to have your input: Do you like the patch as is? Should I remove the sysctls and just look for AA 00 (as Andries may prefer)? Shouldn't the AA 00 be passed to userspace as well in any case (to allow e.g. the imps2 driver to do reinitialization)? Regards, --=20 Kurt Garloff Eindhoven, NL GPG key: See mail header, key servers Linux kernel development SuSE GmbH, Nuernberg, DE SCSI, Security --OgqxwSJOaUobr8KG Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="247-psaux-reconnect-sysctl2.diff" Content-Transfer-Encoding: quoted-printable diff -uNr linux-2.4.7.kurt-1/drivers/char/pc_keyb.c linux-2.4.7.kurt-1-psau= x/drivers/char/pc_keyb.c --- linux-2.4.7.kurt-1/drivers/char/pc_keyb.c Tue Jul 24 18:42:36 2001 +++ linux-2.4.7.kurt-1-psaux/drivers/char/pc_keyb.c Tue Aug 14 10:44:50 2001 @@ -81,8 +81,9 @@ =20 static int __init psaux_init(void); =20 -#define AUX_RECONNECT 170 /* scancode when ps2 device is plugged (back) in= */ -=20 +#define AUX_RECONNECT1 170 /* scancode when ps2 device is plugged (back) i= n */ +#define AUX_RECONNECT2 0 /* scancode when ps2 device is plugged (back) i= n */ + static struct aux_queue *queue; /* Mouse data buffer. */ static int aux_count; /* used when we send commands to the mouse that expect an ACK. */ @@ -92,8 +93,83 @@ #define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | K= BD_MODE_KBD_INT) =20 #define MAX_RETRIES 60 /* some aux operations take long time*/ + #endif /* CONFIG_PSMOUSE */ =20 +/* We want to be able to handle the psmouse reconnect token; unfortunately= the + * Synaptics touchpads (and probably others too) use it for their extented + * functionality and produce them in extended mode (as set by gpm -t synps= 2). + * So we make this adjustable via a sysctl. garloff@suse.de, 2001-08-01 */ + +#ifdef CONFIG_SYSCTL +#include +#ifdef CONFIG_PSMOUSE +int sysctl_psmouse_reconnect =3D 1; +#endif +int sysctl_kbd_report_unkn =3D 0; +int sysctl_kbd_report_to =3D 0; + +static int psaux_sysctl_handler (ctl_table *ctl, int write, struct file *f= ilp, + void *buffer, size_t *lenp) +{ + int *valp =3D ctl->data; + int ret =3D proc_dointvec(ctl, write, filp, buffer, lenp);=20 + if (write) { + if (*valp > 2) + *valp =3D 2; + } + return ret; +} + =09 + +ctl_table psaux_table[] =3D { +#ifdef CONFIG_PSMOUSE =20 + {DEV_PSMOUSE_RECONNECT, "psmouse_reconnect", &sysctl_psmouse_recon= nect, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, +#endif =20 + {DEV_KBD_REPORT_UNKN, "kbd_report_unknown", &sysctl_kbd_report_unkn, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {DEV_KBD_REPORT_TO, "kbd_report_timeout", &sysctl_kbd_report_to, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {0} +}; + +ctl_table psaux_psaux_table[] =3D { + {DEV_CDROM, "ps2", NULL, 0, 0555, psaux_table}, + {0} + }; + +ctl_table psaux_root_table[] =3D { +#ifdef CONFIG_PROC_FS + {CTL_DEV, "dev", NULL, 0, 0555, psaux_psaux_table}, +#endif /* CONFIG_PROC_FS */ + {0} + }; +static struct ctl_table_header *psaux_sysctl_header; + +static void psaux_sysctl_register (void) +{ + static int initialized; + if (initialized) return; +=09 + psaux_sysctl_header =3D register_sysctl_table (psaux_root_table, 1); + /*psaux_root_table->child->de->owner =3D THIS_MODULE;*/ + initialized++; +} + +/* +static void psaux_sysctl_unregister (void) +{ + if (psaux_sysctl_header) + unregister_sysctl_table (psaux_sysctl_header); +} + */ +#else /* CONFIG_SYSCTL */ +#define sysctl_psmouse_reconnect 1 +#define sysctl_kbd_report_unkn 0 +#define sysctl_kbd_report_to 0 +#endif /* CONFIG_SYSCTL */ + /* * Wait for keyboard controller input buffer to drain. * @@ -123,9 +199,8 @@ mdelay(1); timeout--; } while (timeout); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "Keyboard timed out[1]\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "Keyboard timed out[1]\n"); } =20 /* @@ -324,10 +399,8 @@ *keycode =3D E1_PAUSE; prev_scancode =3D 0; } else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown e1 escape sequence\n"); -#endif prev_scancode =3D 0; return 0; } @@ -352,11 +425,9 @@ if (e0_keys[scancode]) *keycode =3D e0_keys[scancode]; else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n", scancode); -#endif return 0; } } @@ -374,11 +445,9 @@ *keycode =3D high_keys[scancode - SC_LIM]; =20 if (!*keycode) { - if (!raw_mode) { -#ifdef KBD_REPORT_UNKN + if (!raw_mode && sysctl_kbd_report_unkn) { printk(KERN_INFO "keyboard: unrecognized scancode (%02x)" " - ignored\n", scancode); -#endif } return 0; } @@ -397,6 +466,7 @@ return 0200; } =20 +static unsigned char psaux_prev; static inline void handle_mouse_event(unsigned char scancode) { #ifdef CONFIG_PSMOUSE @@ -407,13 +477,24 @@ } mouse_reply_expected =3D 0; } - else if(scancode =3D=3D AUX_RECONNECT){ + else if(scancode =3D=3D AUX_RECONNECT1=20 + && sysctl_psmouse_reconnect =3D=3D 2) { + printk (KERN_DEBUG "PS2 mouse reconnect detected.\n"); + queue->head =3D queue->tail =3D 0; /* Flush input queue */ + __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ + return; + } + else if (scancode =3D=3D AUX_RECONNECT2 && psaux_prev =3D=3D AUX_RECONNEC= T1 + && sysctl_psmouse_reconnect =3D=3D 1 ) { + printk (KERN_DEBUG "PS2 mouse reconnect detected.\n"); queue->head =3D queue->tail =3D 0; /* Flush input queue */ __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ return; } =20 add_mouse_randomness(scancode); + psaux_prev =3D scancode; + if (aux_count) { int head =3D queue->head; =20 @@ -515,17 +596,14 @@ if (resend) break; mdelay(1); - if (!--timeout) { -#ifdef KBD_REPORT_TIMEOUTS + if (!--timeout && sysctl_kbd_report_to) { printk(KERN_WARNING "keyboard: Timeout - AT keyboard not present?\n"); -#endif return 0; } } } while (retries-- > 0); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); return 0; } =20 @@ -755,6 +833,7 @@ =20 /* Ok, finally allocate the IRQ, and off we go.. */ kbd_request_irq(keyboard_interrupt); + psaux_sysctl_register (); } =20 #if defined CONFIG_PSMOUSE diff -uNr linux-2.4.7.kurt-1/include/linux/sysctl.h linux-2.4.7.kurt-1-psau= x/include/linux/sysctl.h --- linux-2.4.7.kurt-1/include/linux/sysctl.h Tue Jul 24 18:48:05 2001 +++ linux-2.4.7.kurt-1-psaux/include/linux/sysctl.h Tue Aug 14 10:37:54 2001 @@ -594,7 +594,8 @@ DEV_HWMON=3D2, DEV_PARPORT=3D3, DEV_RAID=3D4, - DEV_MAC_HID=3D5 + DEV_MAC_HID=3D5, + DEV_PSAUX=3D6, }; =20 /* /proc/sys/dev/cdrom */ @@ -653,6 +654,13 @@ DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE=3D4, DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE=3D5, DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=3D6 +}; + +/* /proc/sys/dev/psaux */ +enum { + DEV_PSMOUSE_RECONNECT=3D1, + DEV_KBD_REPORT_UNKN=3D2, + DEV_KBD_REPORT_TO=3D3, }; =20 #ifdef __KERNEL__ --OgqxwSJOaUobr8KG-- --jho1yZJdad60DJr+ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7ePXtxmLh6hyYd04RAtjyAJ9yB7UclerJDTGLJ7/fRRuKKpt3UQCgv8lZ DkKvb6jTel1rBPPB1U3zEwI= =nhjD -----END PGP SIGNATURE----- --jho1yZJdad60DJr+-- From aeb@cwi.nl Wed Aug 15 15:40:17 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA12838 for ; Wed, 15 Aug 2001 15:40:16 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:40:16 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id NAA06534 for ; Tue, 14 Aug 2001 13:12:41 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id LAA26110 for ; Tue, 14 Aug 2001 11:12:39 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 1CDEC197B0 for ; Tue, 14 Aug 2001 12:24:16 +0200 (CEST) Received: from hera.cwi.nl (hera.cwi.nl [192.16.191.8]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id LAA30422 for ; Tue, 14 Aug 2001 11:34:09 +0200 Received: from vlet.cwi.nl (vlet.cwi.nl [192.16.191.54]) by hera.cwi.nl with ESMTP id NAA25182 for ; Tue, 14 Aug 2001 13:12:30 +0200 (MEST) From: Andries.Brouwer@cwi.nl Received: (from aeb@localhost) by vlet.cwi.nl (8.8.6/8.9.3) id LAA99888; Tue, 14 Aug 2001 11:12:29 GMT Date: Tue, 14 Aug 2001 11:12:29 GMT Message-Id: <200108141112.LAA99888@vlet.cwi.nl> To: Andries.Brouwer@cwi.nl, garloff@suse.de Subject: Re: [PATCH] make psaux reconnect adjustable Cc: alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com X-UIDL: 01036beb2df8ccc4bba2d0dc24296831 Status: RO From garloff@garloff.de Tue Aug 14 11:57:23 2001 I can confirm what you suggest: My mouse (Logitech wheel USB/PS2) sends indeed AA 00. So, I extended my patch: psmouse_reconnect = 0: Do nothing (just pass all to userspace) psmouse_reconnect = 1: Flush Q & ping mouse on AA 00 (default) psmouse_reconnect = 2: Flush Q & ping mouse on AA (old behaviour) With reconnect 1 or 2: After reconnecting, mouse behaves strange (jumping around the screen) With reconnect 0: Mouse is dead In both cases restarting gpm gets the mouse back to work again. It seems the imps2 driver does some initialization to the mouse. If I use the plain ps2 driver, then finally, I see the benefit of the reconnect code in the kernel: With reconnect = 1 or 2: It works after replugging With reconnect = 0: Mouse is dead after replugging In the latter case restarting gpm helps. Before having an opinion about what would be appropriate, let me make sure that I understand the facts that you report. You talk about reconnect, but what is your definition of reconnect? Is it that the mouse sends AA or AA 00, or is it that you unplug and replug the mouse? Andries From garloff@garloff.de Wed Aug 15 15:40:27 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA12966 for ; Wed, 15 Aug 2001 15:40:27 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:40:27 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id RAA11366 for ; Tue, 14 Aug 2001 17:06:23 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id PAA27516 for ; Tue, 14 Aug 2001 15:06:22 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 3A388197B0 for ; Tue, 14 Aug 2001 16:16:44 +0200 (CEST) Received: from etpmod.phys.tue.nl (etpmod.phys.tue.nl [131.155.111.35]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id PAA31732 for ; Tue, 14 Aug 2001 15:26:35 +0200 Received: from garloff.etpnet.phys.tue.nl (gum01m.etpnet.phys.tue.nl [192.168.84.65]) by etpmod.phys.tue.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) with ESMTP id RAA01811; Tue, 14 Aug 2001 17:03:47 +0200 Received: (from garloff@localhost) by garloff.etpnet.phys.tue.nl (8.11.3/8.11.3/SuSE Linux 8.11.1-0.5) id f7EF36O05943; Tue, 14 Aug 2001 17:03:06 +0200 Date: Tue, 14 Aug 2001 17:03:06 +0200 From: Kurt Garloff To: Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com Subject: Re: [PATCH] make psaux reconnect adjustable Message-ID: <20010814170306.Q1085@gum01m.etpnet.phys.tue.nl> Mail-Followup-To: Kurt Garloff , Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it, torvalds@transmeta.com References: <200108021727.RAA113816@vlet.cwi.nl> <20010814115701.A1952@gum01m.etpnet.phys.tue.nl> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="GFHULmA0mO3kKGOo" Content-Disposition: inline In-Reply-To: <20010814115701.A1952@gum01m.etpnet.phys.tue.nl> User-Agent: Mutt/1.3.20i X-Operating-System: Linux 2.4.7 i686 X-PGP-Info: on http://www.garloff.de/kurt/mykeys.pgp X-PGP-Key: 1024D/1C98774E, 1024R/CEFC9215 Organization: TU/e(NL), SuSE(DE) X-UIDL: 2657c8b50ec315e0f9505a3199547b77 Status: RO --GFHULmA0mO3kKGOo Content-Type: multipart/mixed; boundary="+S4DbcR7QPeSsP0V" Content-Disposition: inline --+S4DbcR7QPeSsP0V Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Aug 14, 2001 at 11:57:01AM +0200, Kurt Garloff wrote: > Linus, Alan, I'd like to have your input: >=20 > Do you like the patch as is?=20 Well, probably not, as it contains a typo which lets machines without kbd hang. Fixed version attached. Sorry! Regards, --=20 Kurt Garloff Eindhoven, NL GPG key: See mail header, key servers Linux kernel development SuSE GmbH, Nuernberg, DE SCSI, Security --+S4DbcR7QPeSsP0V Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="247-psaux-reconnect-sysctl3.diff" Content-Transfer-Encoding: quoted-printable diff -uNr linux-2.4.7.kurt-1/drivers/char/pc_keyb.c linux-2.4.7.kurt-1-psau= x/drivers/char/pc_keyb.c --- linux-2.4.7.kurt-1/drivers/char/pc_keyb.c Tue Jul 24 18:42:36 2001 +++ linux-2.4.7.kurt-1-psaux/drivers/char/pc_keyb.c Tue Aug 14 16:56:58 2001 @@ -81,8 +81,9 @@ =20 static int __init psaux_init(void); =20 -#define AUX_RECONNECT 170 /* scancode when ps2 device is plugged (back) in= */ -=20 +#define AUX_RECONNECT1 170 /* scancode when ps2 device is plugged (back) i= n */ +#define AUX_RECONNECT2 0 /* scancode when ps2 device is plugged (back) i= n */ + static struct aux_queue *queue; /* Mouse data buffer. */ static int aux_count; /* used when we send commands to the mouse that expect an ACK. */ @@ -92,8 +93,83 @@ #define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | K= BD_MODE_KBD_INT) =20 #define MAX_RETRIES 60 /* some aux operations take long time*/ + #endif /* CONFIG_PSMOUSE */ =20 +/* We want to be able to handle the psmouse reconnect token; unfortunately= the + * Synaptics touchpads (and probably others too) use it for their extented + * functionality and produce them in extended mode (as set by gpm -t synps= 2). + * So we make this adjustable via a sysctl. garloff@suse.de, 2001-08-01 */ + +#ifdef CONFIG_SYSCTL +#include +#ifdef CONFIG_PSMOUSE +int sysctl_psmouse_reconnect =3D 1; +#endif +int sysctl_kbd_report_unkn =3D 1; +int sysctl_kbd_report_to =3D 1; + +static int psaux_sysctl_handler (ctl_table *ctl, int write, struct file *f= ilp, + void *buffer, size_t *lenp) +{ + int *valp =3D ctl->data; + int ret =3D proc_dointvec(ctl, write, filp, buffer, lenp);=20 + if (write) { + if (*valp > 2) + *valp =3D 2; + } + return ret; +} + =09 + +ctl_table psaux_table[] =3D { +#ifdef CONFIG_PSMOUSE =20 + {DEV_PSMOUSE_RECONNECT, "psmouse_reconnect", &sysctl_psmouse_recon= nect, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, +#endif =20 + {DEV_KBD_REPORT_UNKN, "kbd_report_unknown", &sysctl_kbd_report_unkn, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {DEV_KBD_REPORT_TO, "kbd_report_timeout", &sysctl_kbd_report_to, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {0} +}; + +ctl_table psaux_psaux_table[] =3D { + {DEV_CDROM, "ps2", NULL, 0, 0555, psaux_table}, + {0} + }; + +ctl_table psaux_root_table[] =3D { +#ifdef CONFIG_PROC_FS + {CTL_DEV, "dev", NULL, 0, 0555, psaux_psaux_table}, +#endif /* CONFIG_PROC_FS */ + {0} + }; +static struct ctl_table_header *psaux_sysctl_header; + +static void psaux_sysctl_register (void) +{ + static int initialized; + if (initialized) return; +=09 + psaux_sysctl_header =3D register_sysctl_table (psaux_root_table, 1); + /*psaux_root_table->child->de->owner =3D THIS_MODULE;*/ + initialized++; +} + +/* +static void psaux_sysctl_unregister (void) +{ + if (psaux_sysctl_header) + unregister_sysctl_table (psaux_sysctl_header); +} + */ +#else /* CONFIG_SYSCTL */ +#define sysctl_psmouse_reconnect 1 +#define sysctl_kbd_report_unkn 1 +#define sysctl_kbd_report_to 1 +#endif /* CONFIG_SYSCTL */ + /* * Wait for keyboard controller input buffer to drain. * @@ -123,9 +199,8 @@ mdelay(1); timeout--; } while (timeout); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "Keyboard timed out[1]\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "Keyboard timed out[1]\n"); } =20 /* @@ -324,10 +399,8 @@ *keycode =3D E1_PAUSE; prev_scancode =3D 0; } else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown e1 escape sequence\n"); -#endif prev_scancode =3D 0; return 0; } @@ -352,11 +425,9 @@ if (e0_keys[scancode]) *keycode =3D e0_keys[scancode]; else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n", scancode); -#endif return 0; } } @@ -374,11 +445,9 @@ *keycode =3D high_keys[scancode - SC_LIM]; =20 if (!*keycode) { - if (!raw_mode) { -#ifdef KBD_REPORT_UNKN + if (!raw_mode && sysctl_kbd_report_unkn) { printk(KERN_INFO "keyboard: unrecognized scancode (%02x)" " - ignored\n", scancode); -#endif } return 0; } @@ -397,6 +466,7 @@ return 0200; } =20 +static unsigned char psaux_prev; static inline void handle_mouse_event(unsigned char scancode) { #ifdef CONFIG_PSMOUSE @@ -407,13 +477,24 @@ } mouse_reply_expected =3D 0; } - else if(scancode =3D=3D AUX_RECONNECT){ + else if(scancode =3D=3D AUX_RECONNECT1=20 + && sysctl_psmouse_reconnect =3D=3D 2) { + printk (KERN_DEBUG "PS2 mouse reconnect detected.\n"); + queue->head =3D queue->tail =3D 0; /* Flush input queue */ + __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ + return; + } + else if (scancode =3D=3D AUX_RECONNECT2 && psaux_prev =3D=3D AUX_RECONNEC= T1 + && sysctl_psmouse_reconnect =3D=3D 1 ) { + printk (KERN_DEBUG "PS2 mouse reconnect detected.\n"); queue->head =3D queue->tail =3D 0; /* Flush input queue */ __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ return; } =20 add_mouse_randomness(scancode); + psaux_prev =3D scancode; + if (aux_count) { int head =3D queue->head; =20 @@ -516,16 +597,14 @@ break; mdelay(1); if (!--timeout) { -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "keyboard: Timeout - AT keyboard not present?\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "keyboard: Timeout - AT keyboard not present?\n"); return 0; } } } while (retries-- > 0); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); return 0; } =20 @@ -755,6 +834,7 @@ =20 /* Ok, finally allocate the IRQ, and off we go.. */ kbd_request_irq(keyboard_interrupt); + psaux_sysctl_register (); } =20 #if defined CONFIG_PSMOUSE diff -uNr linux-2.4.7.kurt-1/include/linux/sysctl.h linux-2.4.7.kurt-1-psau= x/include/linux/sysctl.h --- linux-2.4.7.kurt-1/include/linux/sysctl.h Tue Jul 24 18:48:05 2001 +++ linux-2.4.7.kurt-1-psaux/include/linux/sysctl.h Tue Aug 14 10:37:54 2001 @@ -594,7 +594,8 @@ DEV_HWMON=3D2, DEV_PARPORT=3D3, DEV_RAID=3D4, - DEV_MAC_HID=3D5 + DEV_MAC_HID=3D5, + DEV_PSAUX=3D6, }; =20 /* /proc/sys/dev/cdrom */ @@ -653,6 +654,13 @@ DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE=3D4, DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE=3D5, DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=3D6 +}; + +/* /proc/sys/dev/psaux */ +enum { + DEV_PSMOUSE_RECONNECT=3D1, + DEV_KBD_REPORT_UNKN=3D2, + DEV_KBD_REPORT_TO=3D3, }; =20 #ifdef __KERNEL__ --+S4DbcR7QPeSsP0V-- --GFHULmA0mO3kKGOo Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7eT2qxmLh6hyYd04RAkdVAKDWsk64qjIijqnd7OhfUabDk93DuwCeNs8v 2N8GBj91DmP0Sxgh6OamUaw= =F2r7 -----END PGP SIGNATURE----- --GFHULmA0mO3kKGOo-- From torvalds@transmeta.com Wed Aug 15 15:40:51 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA13043 for ; Wed, 15 Aug 2001 15:40:51 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:40:51 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id TAA12956 for ; Tue, 14 Aug 2001 19:01:01 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id RAA27985 for ; Tue, 14 Aug 2001 17:00:58 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 1C28219853 for ; Tue, 14 Aug 2001 18:11:20 +0200 (CEST) Received: from neon-gw.transmeta.com (neon-gw-l3.transmeta.com [63.209.4.196]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id RAA32362 for ; Tue, 14 Aug 2001 17:21:08 +0200 Received: (from root@localhost) by neon-gw.transmeta.com (8.9.3/8.9.3) id JAA00580; Tue, 14 Aug 2001 09:59:33 -0700 Received: from mailhost.transmeta.com(10.1.1.15) by neon-gw.transmeta.com via smap (V2.1) id xma000571; Tue, 14 Aug 01 09:59:28 -0700 Received: from penguin.transmeta.com (penguin.transmeta.com [10.10.27.78]) by deepthought.transmeta.com (8.9.3/8.9.3) with ESMTP id JAA13406; Tue, 14 Aug 2001 09:59:30 -0700 (PDT) Received: from localhost (torvalds@localhost) by penguin.transmeta.com (8.11.2/8.7.3) with ESMTP id f7EGwtS01753; Tue, 14 Aug 2001 09:58:55 -0700 X-Authentication-Warning: penguin.transmeta.com: torvalds owned process doing -bs Date: Tue, 14 Aug 2001 09:58:55 -0700 (PDT) From: Linus Torvalds To: Kurt Garloff Cc: , , , , Subject: Re: [PATCH] make psaux reconnect adjustable In-Reply-To: <20010814170306.Q1085@gum01m.etpnet.phys.tue.nl> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-UIDL: ca99923198dca96e1919c7a0ca08e81b Status: RO > Well, probably not, as it contains a typo which lets machines without kbd > hang. Fixed version attached. Sorry! Hmm.. I really have two comments, but I haven't followed the whole discussion, so feel free to just say that it's been hashed out already: - sysconf entries are suspicious for stuff like this. If some code really requires this to work correctly, that's exactly the kind of code that would run automatically at bootup. A sysconf doesn't really help people in that case - we'd be much better off with just a bootup switch. - do we actually need the config switch AT ALL, whether at bootup or not? What exactly breaks if we just always pass the AA 00 values through? Apparently nothing ever breaks, which makes me suspect that people are just being unnecessarily defensive. In short, I'd prefer a patch that just unconditionally removes the code, unless somebody KNOWS that it could break something. That failing, a simple kernel command line option sounds better than more files in /proc. Remember: the biggest mistake to do is to overdesign. The road to hell is paved with good intentions. Linus From garloff@garloff.de Wed Aug 15 15:41:03 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA13073 for ; Wed, 15 Aug 2001 15:41:03 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:41:03 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id TAA13510 for ; Tue, 14 Aug 2001 19:38:57 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id RAA28130 for ; Tue, 14 Aug 2001 17:38:55 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 4A6C719873 for ; Tue, 14 Aug 2001 18:49:18 +0200 (CEST) Received: from etpmod.phys.tue.nl (etpmod.phys.tue.nl [131.155.111.35]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id RAA32525 for ; Tue, 14 Aug 2001 17:57:53 +0200 Received: from garloff.etpnet.phys.tue.nl (gum01m.etpnet.phys.tue.nl [192.168.84.65]) by etpmod.phys.tue.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) with ESMTP id TAA03978; Tue, 14 Aug 2001 19:36:23 +0200 Received: (from garloff@localhost) by garloff.etpnet.phys.tue.nl (8.11.3/8.11.3/SuSE Linux 8.11.1-0.5) id f7EHZhq10174; Tue, 14 Aug 2001 19:35:43 +0200 Date: Tue, 14 Aug 2001 19:35:43 +0200 From: Kurt Garloff To: Linus Torvalds Cc: Kurt Garloff , Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it Subject: Re: [PATCH] make psaux reconnect adjustable Message-ID: <20010814193543.V1085@gum01m.etpnet.phys.tue.nl> Mail-Followup-To: Kurt Garloff , Linus Torvalds , Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it References: <20010814170306.Q1085@gum01m.etpnet.phys.tue.nl> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="GOaLjq+VdFesH+wR" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.20i X-Operating-System: Linux 2.4.7 i686 X-PGP-Info: on http://www.garloff.de/kurt/mykeys.pgp X-PGP-Key: 1024D/1C98774E, 1024R/CEFC9215 Organization: TU/e(NL), SuSE(DE) X-UIDL: 0b1ef96a0d05d0b79e99084d0eba334c Status: RO --GOaLjq+VdFesH+wR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Linus, thanks for your comments. On Tue, Aug 14, 2001 at 09:58:55AM -0700, Linus Torvalds wrote: > I really have two comments, but I haven't followed the whole discussion, > so feel free to just say that it's been hashed out already: >=20 > - sysconf entries are suspicious for stuff like this. If some code really > requires this to work correctly, that's exactly the kind of code that > would run automatically at bootup. A sysconf doesn't really help people > in that case - we'd be much better off with just a bootup switch. Maybe that's the difference of whether you define the kernel behaviour by deciding what goes in and the one that tries to avoid a breakage without changing the default behaviour ... Of course the sysctl is less intrusive (from a user's point of view). > - do we actually need the config switch AT ALL, whether at bootup or not? > What exactly breaks if we just always pass the AA 00 values through? > Apparently nothing ever breaks, which makes me suspect that people are > just being unnecessarily defensive. PS2 mouses need this ping thing to be operational after being plugged. But, there's no reason it needs to be done in the kernel. * It works for plain PS2 only (not: imps2, synps2, ...) * The userspace driver (gpm, X11) can do it as well, AFAICS I guess the thing has been introduced because it was more convenient than fixing userspace. Maybe the kernel does it a bit more efficient by throwing away the queue ... > In short, I'd prefer a patch that just unconditionally removes the code, > unless somebody KNOWS that it could break something. That failing, a > simple kernel command line option sounds better than more files in /proc. I'd be happy with removing it. Patch will follow! > Remember: the biggest mistake to do is to overdesign. The road to hell is > paved with good intentions. A few sysctls don't qualify as overdesign yet, I hope. Regards, --=20 Kurt Garloff Eindhoven, NL GPG key: See mail header, key servers Linux kernel development SuSE GmbH, Nuernberg, DE SCSI, Security --GOaLjq+VdFesH+wR Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7eWFvxmLh6hyYd04RAid0AJkBRbQAelKjAXzaA8rRQifEPscH2ACfUUsp BqZqeLRrmag8Bsup3yELdnY= =dhec -----END PGP SIGNATURE----- --GOaLjq+VdFesH+wR-- From garloff@garloff.de Wed Aug 15 15:41:42 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA13231 for ; Wed, 15 Aug 2001 15:41:41 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:41:41 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id XAA17995 for ; Tue, 14 Aug 2001 23:29:52 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id VAA28856 for ; Tue, 14 Aug 2001 21:29:50 GMT Received: from vision.unipv.it (vision.unipv.it [193.204.34.82]) by spock.linux.it (Postfix) with ESMTP id 6CDD9197B0 for ; Tue, 14 Aug 2001 22:41:27 +0200 (CEST) Received: from etpmod.phys.tue.nl (etpmod.phys.tue.nl [131.155.111.35]) by vision.unipv.it (8.9.3/8.9.3) with ESMTP id VAA01350 for ; Tue, 14 Aug 2001 21:51:15 +0200 Received: from garloff.etpnet.phys.tue.nl (gum01m.etpnet.phys.tue.nl [192.168.84.65]) by etpmod.phys.tue.nl (8.9.3/8.9.3/SuSE Linux 8.9.3-0.1) with ESMTP id XAA07270; Tue, 14 Aug 2001 23:29:48 +0200 Received: (from garloff@localhost) by garloff.etpnet.phys.tue.nl (8.11.3/8.11.3/SuSE Linux 8.11.1-0.5) id f7ELTlV16541; Tue, 14 Aug 2001 23:29:47 +0200 Date: Tue, 14 Aug 2001 23:29:47 +0200 From: Kurt Garloff To: Linus Torvalds Cc: Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it Subject: Re: [PATCH] make psaux reconnect adjustable Message-ID: <20010814232947.A16332@gum01m.etpnet.phys.tue.nl> Mail-Followup-To: Kurt Garloff , Linus Torvalds , Andries.Brouwer@cwi.nl, alan@lxorguk.ukuu.org.uk, linux-kernel@vger.kernel.org, mantel@suse.de, rubini@vision.unipv.it References: <20010814170306.Q1085@gum01m.etpnet.phys.tue.nl> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="pAwQNkOnpTn9IO2O" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.20i X-Operating-System: Linux 2.4.7 i686 X-PGP-Info: on http://www.garloff.de/kurt/mykeys.pgp X-PGP-Key: 1024D/1C98774E, 1024R/CEFC9215 Organization: TU/e(NL), SuSE(DE) X-UIDL: 186d845e4a17613c167f0da418f5f7f5 Status: RO --pAwQNkOnpTn9IO2O Content-Type: multipart/mixed; boundary="RASg3xLB4tUQ4RcS" Content-Disposition: inline --RASg3xLB4tUQ4RcS Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Aug 14, 2001 at 09:58:55AM -0700, Linus Torvalds wrote: > - do we actually need the config switch AT ALL, whether at bootup or not? > What exactly breaks if we just always pass the AA 00 values through? > Apparently nothing ever breaks, which makes me suspect that people are > just being unnecessarily defensive. >=20 > In short, I'd prefer a patch that just unconditionally removes the code, > unless somebody KNOWS that it could break something. That failing, a > simple kernel command line option sounds better than more files in /proc. OK, here come two patches. The first one removes the special PSAUX reconnect handling completely. So userspace should handle it. (Which is possible; just not implemented in gpm/X11 at this time AFAIK.) Second patch reintroduces the special handling again, but does * react on AA 00 instead of just AA, thus much less likely breaking other drivers (such as synps2). All PS/2 mouses I could access (about 5 different models) produced AA 00, so this seems OK. * is disabled by default, and needs to be enabled by the psaux-reconnect boot parameter, like in 2.2.19. Second patch depends on first. Please apply just the first or both. (Current failure of gpm/X11 would make me choose for both, but then I'm=20 more the one thinking of customers of a distro than the one trying to keep the kernel clean. On the long term, I'd drop the second in any case.) Regards, --=20 Kurt Garloff Eindhoven, NL GPG key: See mail header, key servers Linux kernel development SuSE GmbH, Nuernberg, DE SCSI, Security --RASg3xLB4tUQ4RcS Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="247-noreconnect.diff" Content-Transfer-Encoding: quoted-printable diff -uNr linux-2.4.7.kurt-1/drivers/char/pc_keyb.c linux-2.4.7.kurt-1-nore= connect/drivers/char/pc_keyb.c --- linux-2.4.7.kurt-1/drivers/char/pc_keyb.c Tue Jul 24 18:42:36 2001 +++ linux-2.4.7.kurt-1-noreconnect/drivers/char/pc_keyb.c Tue Aug 14 22:47:= 38 2001 @@ -81,8 +81,6 @@ =20 static int __init psaux_init(void); =20 -#define AUX_RECONNECT 170 /* scancode when ps2 device is plugged (back) in= */ -=20 static struct aux_queue *queue; /* Mouse data buffer. */ static int aux_count; /* used when we send commands to the mouse that expect an ACK. */ @@ -406,11 +404,6 @@ return; } mouse_reply_expected =3D 0; - } - else if(scancode =3D=3D AUX_RECONNECT){ - queue->head =3D queue->tail =3D 0; /* Flush input queue */ - __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ - return; } =20 add_mouse_randomness(scancode); --RASg3xLB4tUQ4RcS Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="247-reconnect_bootpar.diff" Content-Transfer-Encoding: quoted-printable diff -uNr linux-2.4.7.kurt-1-noreconnect/drivers/char/pc_keyb.c linux-2.4.7= .kurt-1-recon_bootpar/drivers/char/pc_keyb.c --- linux-2.4.7.kurt-1-noreconnect/drivers/char/pc_keyb.c Tue Aug 14 22:47:= 38 2001 +++ linux-2.4.7.kurt-1-recon_bootpar/drivers/char/pc_keyb.c Tue Aug 14 23:1= 3:49 2001 @@ -63,6 +63,7 @@ #ifdef CONFIG_PSMOUSE static void aux_write_ack(int val); static void __aux_write_ack(int val); +static int aux_reconnect =3D 0; #endif =20 static spinlock_t kbd_controller_lock =3D SPIN_LOCK_UNLOCKED; @@ -81,6 +82,9 @@ =20 static int __init psaux_init(void); =20 +#define AUX_RECONNECT1 0xaa /* scancode1 when ps2 device is plugged (back)= in */ +#define AUX_RECONNECT2 0x00 /* scancode2 when ps2 device is plugged (back)= in */ +=20 static struct aux_queue *queue; /* Mouse data buffer. */ static int aux_count; /* used when we send commands to the mouse that expect an ACK. */ @@ -398,6 +402,7 @@ static inline void handle_mouse_event(unsigned char scancode) { #ifdef CONFIG_PSMOUSE + static unsigned char prev_code; if (mouse_reply_expected) { if (scancode =3D=3D AUX_ACK) { mouse_reply_expected--; @@ -405,7 +410,15 @@ } mouse_reply_expected =3D 0; } + else if(scancode =3D=3D AUX_RECONNECT2 && prev_code =3D=3D AUX_RECONNECT1 + && aux_reconnect) { + printk (KERN_INFO "PS/2 mouse reconnect detected\n"); + queue->head =3D queue->tail =3D 0; /* Flush input queue */ + __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ + return; + } =20 + prev_code =3D scancode; add_mouse_randomness(scancode); if (aux_count) { int head =3D queue->head; @@ -751,6 +764,14 @@ } =20 #if defined CONFIG_PSMOUSE + +static int __init aux_reconnect_setup (char *str) +{ + aux_reconnect =3D 1; + return 1; +} + +__setup("psaux-reconnect", aux_reconnect_setup); =20 /* * Check if this is a dual port controller. --RASg3xLB4tUQ4RcS-- --pAwQNkOnpTn9IO2O Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE7eZhLxmLh6hyYd04RAnJTAJ9CyWixEyMZ8qkmapcBwl/73IM7DwCfRR5s TJ1yuGaW+r28gNeBOI1sVP8= =HZo+ -----END PGP SIGNATURE----- --pAwQNkOnpTn9IO2O-- From aeb@cwi.nl Wed Aug 15 15:41:58 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id PAA13289 for ; Wed, 15 Aug 2001 15:41:58 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Wed, 15 Aug 2001 15:41:58 MEST Received: from systemy.systemy.it (systemy.systemy.it [194.20.140.20]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id CAA20482 for ; Wed, 15 Aug 2001 02:21:05 +0200 Received: from spock.linux.it (spock.linux.it [62.177.1.105]) by systemy.systemy.it (8.8.8/8.8.8) with ESMTP id AAA29238 for ; Wed, 15 Aug 2001 00:21:05 GMT Received: from hera.cwi.nl (hera.cwi.nl [192.16.191.8]) by spock.linux.it (Postfix) with ESMTP id 6A5D6197B0 for ; Wed, 15 Aug 2001 01:32:41 +0200 (CEST) Received: from vlet.cwi.nl (vlet.cwi.nl [192.16.191.54]) by hera.cwi.nl with ESMTP id CAA29683 for ; Wed, 15 Aug 2001 02:21:01 +0200 (MEST) From: Andries.Brouwer@cwi.nl Received: (from aeb@localhost) by vlet.cwi.nl (8.8.6/8.9.3) id AAA100247 for rubini@linux.it; Wed, 15 Aug 2001 00:21:01 GMT Date: Wed, 15 Aug 2001 00:21:01 GMT Message-Id: <200108150021.AAA100247@vlet.cwi.nl> To: rubini@linux.it Subject: gpm X-UIDL: 9ee7c4ae6dd7eb661b4e97eedfbe1025 Status: RO Dear Alessandro, [Long ago!] There was some discussion on linux-kernel about the right way to handle mouse disconnect and reconnect events. A PS/2 mouse, and also the imps2 mouse, will send AA 00 after reconnection (that is, at mouse power-on time). At this moment the imps2 mouse needs an initialization sequence, otherwise it reverts to being an ordinary ps2. So, the right setup probably is to let gpm recognize this AA 00. If it recognizes this, perhaps the fd should be closed and reopened, somewhat like happens now in wait_text(). Any idea on how you would like this added to gpm.c / mice.c ? It will be a bit messy in all cases, I am afraid. Andries gpm-1.20.4/patches/todo/gpm-root.patch010060000017500001750000000077600760216311400164070ustar00niconico00--- gpm-1.19.2/gpm-root.y.root Wed Apr 19 01:48:41 2000 +++ gpm-1.19.2/gpm-root.y Mon Jun 12 23:24:14 2000 @@ -49,7 +49,8 @@ #include /* OPEN_MAX */ #include /* VT_ACTIVATE */ #include /* K_SHIFT */ -#include +#include +#include #ifdef HAVE_SYS_SYSMACROS_H #include @@ -447,9 +448,10 @@ /*====================================================================*/ void f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + if (setgid(pass->pw_gid) < 0 || + initgroups(pass->pw_name, pass->pw_gid) < 0 || + setuid(pass->pw_uid) < 0) + exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); @@ -1045,6 +1047,12 @@ static int postcount; static Posted *activemenu; +#if __BYTE_ORDER == __BIG_ENDIAN +#define bigendian 1 +#else +#define bigendian 0 +#endif + Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) { Posted *new; @@ -1062,9 +1070,9 @@ lines=dump[0]; columns=dump[1]; i=(columns*dump[3]+dump[2])*2+1; /* where to get it */ if (i<0) i=1; - new->colorcell=dump[4+i]; + new->colorcell=dump[4+i-bigendian]; gpm_debug_log(LOG_DEBUG,"Colorcell=%02x (at %i,%i = %i)", - new->colorcell,dump[2],dump[3],i); + new->colorcell,dump[2],dump[3],i-bigendian); /* place the box relative to the mouse */ if (!postcount) x -= draw->width/2; else x+=2; @@ -1078,7 +1086,11 @@ new->y=y; new->Y=y+draw->height-1; /* these definitions are dirty hacks, but they help in writing to the screen */ +#if __BYTE_ORDER == __BIG_ENDIAN +#define PUTC(c,f,b) (*(curr++)=((b)<<4)+(f),*(curr++)=(c)) +#else #define PUTC(c,f,b) (*(curr++)=(c),*(curr++)=((b)<<4)+(f)) +#endif #define PUTS(s,f,b) for(curr2=s;*curr2;PUTC(*(curr2++),f,b)) #define GOTO(x,y) (curr=dump+4+2*((y)*columns+(x))) --- gpm-1.19.2/gpm-root.c.root Wed Apr 19 01:53:38 2000 +++ gpm-1.19.2/gpm-root.c Mon Jun 12 23:25:05 2000 @@ -43,7 +43,8 @@ #include /* OPEN_MAX */ #include /* VT_ACTIVATE */ #include /* K_SHIFT */ -#include +#include +#include #ifdef HAVE_SYS_SYSMACROS_H #include @@ -1305,9 +1306,10 @@ /*====================================================================*/ void f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + if (setgid(pass->pw_gid) < 0 || + initgroups(pass->pw_name, pass->pw_gid) < 0 || + setuid(pass->pw_uid) < 0) + exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); @@ -1903,6 +1905,12 @@ static int postcount; static Posted *activemenu; +#if __BYTE_ORDER == __BIG_ENDIAN +#define bigendian 1 +#else +#define bigendian 0 +#endif + Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) { Posted *new; @@ -1920,9 +1928,9 @@ lines=dump[0]; columns=dump[1]; i=(columns*dump[3]+dump[2])*2+1; /* where to get it */ if (i<0) i=1; - new->colorcell=dump[4+i]; + new->colorcell=dump[4+i-bigendian]; gpm_debug_log(LOG_DEBUG,"Colorcell=%02x (at %i,%i = %i)", - new->colorcell,dump[2],dump[3],i); + new->colorcell,dump[2],dump[3],i-bigendian); /* place the box relative to the mouse */ if (!postcount) x -= draw->width/2; else x+=2; @@ -1936,7 +1944,11 @@ new->y=y; new->Y=y+draw->height-1; /* these definitions are dirty hacks, but they help in writing to the screen */ +#if __BYTE_ORDER == __BIG_ENDIAN +#define PUTC(c,f,b) (*(curr++)=((b)<<4)+(f),*(curr++)=(c)) +#else #define PUTC(c,f,b) (*(curr++)=(c),*(curr++)=((b)<<4)+(f)) +#endif #define PUTS(s,f,b) for(curr2=s;*curr2;PUTC(*(curr2++),f,b)) #define GOTO(x,y) (curr=dump+4+2*((y)*columns+(x))) gpm-1.20.4/patches/todo/gpm.patch-rich-felker010060000017500001750000000026320760216311400176100ustar00niconico00diff -ru gpm-1.19.6/src/gpn.c gpm-1.19.6-patched/src/gpn.c --- gpm-1.19.6/src/gpn.c Sun Sep 23 15:00:03 2001 +++ gpm-1.19.6-patched/src/gpn.c Mon Jan 21 23:07:52 2002 @@ -445,7 +445,10 @@ /* report should be here and nothing else! */ #if 1 /* was: "if (!defined(HAVE_SYSLOG) || !defined(HAVE_VSYSLOG))" */ +#if 0 if (!freopen("/dev/console","w",stderr)) /* the currently current console */ +#endif + if (!freopen("/dev/null","w",stderr)) /* the currently current console */ { oops("freopen(stderr) failed"); } diff -ru gpm-1.19.6/src/mice.c gpm-1.19.6-patched/src/mice.c --- gpm-1.19.6/src/mice.c Thu Sep 27 08:50:29 2001 +++ gpm-1.19.6-patched/src/mice.c Mon Jan 21 22:50:26 2002 @@ -1409,13 +1409,14 @@ /* Non mman: change from any available speed to the chosen one */ for (i=9600; i>=1200; i/=2) - setspeed(fd, i, opt_baud, (type->fun != M_mman) /* write */, flags); + setspeed(fd, i, opt_baud, 1 /* (type->fun != M_mman) */ /* write */, flags); /* * reset the MouseMan/TrackMan to use the 3/4 byte protocol * (Stephen Lee, sl14@crux1.cit.cornell.edu) * Changed after 1.14; why not having "I_mman" now? */ +#if 0 if (type->fun==M_mman) { setspeed(fd, 1200, 1200, 0, flags); /* no write */ @@ -1423,6 +1424,7 @@ setspeed(fd, 1200, opt_baud, 0, flags); /* no write */ return type; } +#endif if(type->fun==M_geni) { gpm-1.20.4/patches/todo/imwheel004070000017500001750000000000001075432545600151775ustar00niconico00gpm-1.20.4/patches/todo/imwheel/imwheel.patch010060000017500001750000001331340760216311400177220ustar00niconico00diff -ru --exclude=Makefile ./ChangeLog ../imwheel/gpm-imwheel/ChangeLog --- ./ChangeLog Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/ChangeLog Sun Feb 27 16:30:46 2000 @@ -346,6 +346,8 @@ for braindead chords in t-mouse with 2 button mice. +CHANGED 12/16/98 by Jonathan Atkins. updated for imwheel. + Tue Nov 17 23:10:04 1998 Ian T Zimmerman * configure.in (release): Step to 1.16.0 @@ -806,6 +808,8 @@ Sat Jul 25 21:08:46 1998 Edmund Grimley Evans (edmund@vocalis.com) * mice.c: added M_ms_plus and M_ms_plus_lr + +CHANGED 9/8/98 for imwheel by Jonathan Atkins. Diff in imwheel contains changes Mon Jul 6 13:00:23 1998 Robin Houston (robin.houston@guardian.co.uk) Only in ../imwheel/gpm-imwheel: ChangeLog.orig diff -ru --exclude=Makefile ./debuglog.c ../imwheel/gpm-imwheel/debuglog.c --- ./debuglog.c Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/debuglog.c Sun Feb 27 16:30:46 2000 @@ -58,6 +58,8 @@ void gpm_debug_log(int level, char* fmt, ...) { + //printf("level=%d\n",level); + //printf("gpm_debug_level=%d\n",gpm_debug_level); if (level <= gpm_debug_level) { va_list ap; va_start(ap, fmt); Only in ../imwheel/gpm-imwheel: debuglog.c.orig diff -ru --exclude=Makefile ./gpm.c ../imwheel/gpm-imwheel/gpm.c --- ./gpm.c Fri Nov 12 08:27:36 1999 +++ ../imwheel/gpm-imwheel/gpm.c Sun Feb 27 16:30:46 2000 @@ -5,6 +5,9 @@ * Copyright 1994-1997 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -61,6 +64,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_WHEEL, DEF_NO_MIDDLE, (Gpm_Type *)NULL }, }; @@ -74,6 +78,7 @@ int opt_ptrdrag=DEF_PTRDRAG; int opt_kill=0; int opt_repeater=0, opt_double=0; +int opt_wheel_repeater=0; char* opt_repeater_type = 0; int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ @@ -86,6 +91,7 @@ struct winsize win; int maxx, maxy; int fifofd=-1; +int wheel_fifofd=-1; int eventFlag=0; Gpm_Cinfo *cinfo[MAX_VC+1]; @@ -349,7 +355,7 @@ gpm_debug_log(LOG_NOTICE,"Skipping a data packet (?)"); return NULL; } - gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x (%02x)",data[0],data[1],data[2],data[3]); + gpm_debug_log(LOG_DEBUG,"Data %02x %02x %02x (%02x %02x %02x %02x %02x %02x)",data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],data[8]); return data; } @@ -368,28 +374,52 @@ static struct vt_stat stat; static struct timeval tv1={0,0}, tv2; /* tv1==0: first click is single */ static struct timeval timeout={0,0}; + int stick; fd_set fdSet; static int newB=0, oldB=0, oldT=0; /* old buttons and Type to chain events */ /* static int buttonlock, buttonlockflag; */ + static int wheel_fakeup; + static unsigned char buttons; #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ (t2.tv_usec-t1.tv_usec)/1000) + gpm_debug_log(LOG_DEBUG,"processMouse(%d,%p,%p,%d)",fd,event,type,kd_mode); oldT=event->type; + wheel_fakeup=0; if (eventFlag) { eventFlag=0; + gpm_debug_log(LOG_DEBUG,"nEvent.dx=%d nEvent.dy=%d",nEvent.dx,nEvent.dy); if (m_type->absolute) /* a pen or other absolute device */ { + gpm_debug_log(LOG_DEBUG,"absolute coords."); event->x=nEvent.x; event->y=nEvent.y; } + else + gpm_debug_log(LOG_DEBUG,"not absolute coords."); event->dx=nEvent.dx; event->dy=nEvent.dy; + if(opt_wheel) + { + gpm_debug_log(LOG_DEBUG,"nEvent.stick_x=%d nEvent.stick_y=%d",nEvent.stick_x,nEvent.stick_y); + event->stick_x=nEvent.stick_x; + event->stick_y=nEvent.stick_y; + } + if(opt_wheel && nEvent.buttons&(GPM_W_UP|GPM_W_DOWN|GPM_W_RIGHT|GPM_W_LEFT)) + { + gpm_debug_log(LOG_DEBUG,"Doing wheel button fakeup."); + event->buttons=nEvent.buttons&7; + oldB=newB; newB=event->buttons; + event->type=GPM_UP; + wheel_fakeup=1; + } + else event->buttons=nEvent.buttons; } else @@ -411,9 +441,21 @@ event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ - nEvent.buttons = opt_sequence[nEvent.buttons]&7; /* change the order */ + gpm_debug_log(LOG_DEBUG,"nEvent.buttons=%d opt_sequence=%d opt_wheel=%d",nEvent.buttons,opt_sequence[nEvent.buttons&7]&7,opt_wheel); + stick=nEvent.buttons&GPM_STICK; + nEvent.buttons = (opt_sequence[nEvent.buttons&7]&7)| + (opt_wheel?((nEvent.buttons&GPM_W_UP)|(nEvent.buttons&GPM_W_DOWN)| + (nEvent.buttons&GPM_W_RIGHT)|(nEvent.buttons&GPM_W_LEFT)) + :0); oldB=newB; newB=nEvent.buttons; + gpm_debug_log(LOG_DEBUG,"nEvent.buttons=%d", nEvent.buttons); if (!i) event->buttons=nEvent.buttons; + if(opt_wheel) + { + gpm_debug_log(LOG_DEBUG,"nEvent.stick_x=%d nEvent.stick_y=%d",nEvent.stick_x,nEvent.stick_y); + event->stick_x=nEvent.stick_x; + event->stick_y=nEvent.stick_y; + } if (oldB!=newB) { @@ -425,7 +467,12 @@ if (!(m_type->absolute)) /* mouse */ { if (abs(nEvent.dx)+abs(nEvent.dy) > opt_delta) + { + gpm_debug_log(LOG_DEBUG,"opt_delta met."); nEvent.dx*=opt_accel, nEvent.dy*=opt_accel; + } + else + gpm_debug_log(LOG_DEBUG,"opt_delta met."); /* increment the reported dx,dy */ event->dx+=nEvent.dx; @@ -444,9 +491,72 @@ } /* eventFlag */ + if(!wheel_fakeup) + { /*....................................... update the button number */ if ((event->buttons&GPM_B_MIDDLE) && !opt_three) opt_three++; + if ((event->buttons&GPM_W_UP || event->buttons&GPM_W_DOWN || + event->buttons&GPM_W_LEFT || event->buttons&GPM_W_RIGHT) + && !opt_wheel) + opt_wheel++; + if(opt_wheel && event->buttons&(GPM_W_UP|GPM_W_DOWN)) + gpm_debug_log(LOG_DEBUG,"Wheel - %s%s",(event->buttons&GPM_W_UP?"Up ":""), + (event->buttons&GPM_W_DOWN?"Down":"")); + if(opt_wheel && (event->stick_x || event->stick_y)) + gpm_debug_log(LOG_DEBUG,"Stick - %d,%d",event->stick_x,event->stick_y); + +/* .................................... repeat wheel to special fifo */ + + if(wheel_fifofd) + { + char buffer; + + if((event->buttons&(GPM_W_DOWN|GPM_W_UP|GPM_W_LEFT|GPM_W_RIGHT)) + && event->buttons>0)/* button down, not up! (not the wheel motion) */ + { + event->type=GPM_DOWN; + if(event->buttons&GPM_W_UP) + { + buffer=4; + gpm_debug_log(LOG_DEBUG,"repeat wheel: %d",buffer); + write(wheel_fifofd,&buffer,1); + } + if(event->buttons&GPM_W_DOWN) + { + buffer=5; + gpm_debug_log(LOG_DEBUG,"repeat wheel: %d",buffer); + write(wheel_fifofd,&buffer,1); + } + if(event->buttons&GPM_W_LEFT) + { + buffer=6; + gpm_debug_log(LOG_DEBUG,"repeat wheel: %d",buffer); + write(wheel_fifofd,&buffer,1); + } + if(event->buttons&GPM_W_RIGHT) + { + buffer=7; + gpm_debug_log(LOG_DEBUG,"repeat wheel: %d",buffer); + write(wheel_fifofd,&buffer,1); + } + } + else if (stick) + { + buffer=8; /* stick x & y delta values follow */ + gpm_debug_log(LOG_DEBUG,"repeat stick: %d",buffer); + write(wheel_fifofd,&buffer,1); + buffer=event->stick_x; + gpm_debug_log(LOG_DEBUG,"repeat wheel: %d",buffer); + write(wheel_fifofd,&buffer,1); + buffer=event->stick_y; + gpm_debug_log(LOG_DEBUG,"repeat wheel: %d",buffer); + write(wheel_fifofd,&buffer,1); + event->buttons^=GPM_STICK; + } + } + buttons=event->buttons; + event->buttons=event->buttons&7; /*....................................... we're a repeater, aren't we? */ @@ -470,6 +580,7 @@ } return 0; /* no events nor information for clients */ } + event->buttons=buttons; /*....................................... no, we arent a repeater, go on */ @@ -515,11 +626,12 @@ else event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP); + } switch(event->type) /* now provide the cooked bits */ { case GPM_DOWN: GET_TIME(tv2); - if (tv1.tv_sec && (DIF_TIME(tv1,tv2)buttons&7)) && tv1.tv_sec && (DIF_TIME(tv1,tv2)type|=(GPM_SINGLE<type & GPM_DOWN) return processSpecial(event); - return 1; + return (!wheel_fakeup); } /*-------------------------------------------------------------------*/ @@ -706,6 +818,7 @@ event.vc = stat.v_active; event.x=statusX; event.y=statusY; event.dx=maxx; event.dy=maxy; + gpm_debug_log(LOG_DEBUG,"statusB=%d", statusB); event.buttons= statusB; event.clicks=statusC; /* fall through */ @@ -875,6 +988,8 @@ int maxfd=-1; int pending; Gpm_Event event; + int wheel_done; + Gpm_Event eventbuf; prgname=argv[0]; setuid(0); /* just in case... */ @@ -1035,7 +1150,7 @@ if (ioctl(fd, KDGETMODE, &kd_mode)<0) oops("ioctl(KDGETMODE)"); close(fd); - if (kd_mode != KD_TEXT && !opt_repeater) + if (kd_mode != KD_TEXT && !opt_repeater && !opt_wheel_repeater) { wait_text(&mouse_table[1].fd); maxfd=max(maxfd,mouse_table[1].fd); @@ -1056,15 +1171,38 @@ if (FD_ISSET(which_mouse->fd,&selSet)) { FD_CLR(which_mouse->fd,&selSet); pending--; - if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) + wheel_done=0; + do + { + gpm_debug_log(LOG_DEBUG,"calling processMouse", event.type, event.buttons); + if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) + { + memcpy(&eventbuf,&event,sizeof(Gpm_Event)); /* * pass it to the client, if any * or to the default handler, if any * or to the selection handler */ /* FIXME -- check event.vc */ - (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) + (void)((cinfo[event.vc] && do_client(cinfo[event.vc], &event)) || (cinfo[0] && do_client(cinfo[0], &event)) - || do_selection(&event); + || do_selection(&event)); + memcpy(&event,&eventbuf,sizeof(Gpm_Event)); + } + gpm_debug_log(LOG_DEBUG,"event.type=0x%x event.buttons=%d", event.type, event.buttons); + if(!wheel_done && opt_wheel && + (event.type&(GPM_DOWN|GPM_DRAG)) && + (event.buttons&(GPM_W_UP|GPM_W_DOWN|GPM_W_LEFT|GPM_W_RIGHT)) && + event.buttons<=GPM_W_RIGHT) + { + gpm_debug_log(LOG_DEBUG,"Button Up!"); + gpm_debug_log(LOG_DEBUG,"event.buttons=%d",event.buttons); + gpm_debug_log(LOG_DEBUG,"event.type=%s%s", + (event.type&GPM_DRAG?"GPM_DRAG ":""), + (event.type&GPM_DOWN?"GPM_DOWN":"")); + wheel_done=1; + eventFlag=1; + } + } while(eventFlag); } } @@ -1148,3 +1286,5 @@ +/* vim:sw=2:ts=8 +"*/ Only in ../imwheel/gpm-imwheel: gpm.c.orig diff -ru --exclude=Makefile ./gpm.h ../imwheel/gpm-imwheel/gpm.h --- ./gpm.h Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/gpm.h Sun Feb 27 16:30:46 2000 @@ -4,6 +4,9 @@ * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -69,12 +72,18 @@ #define GPM_NODE_CTL GPM_NODE_DEV #define GPM_NODE_FIFO _PATH_DEV "gpmdata" +#define GPM_WHEEL_FIFO _PATH_DEV "gpmwheel" /*....................................... Cfg buttons */ #define GPM_B_LEFT 4 #define GPM_B_MIDDLE 2 #define GPM_B_RIGHT 1 +#define GPM_W_UP 8 +#define GPM_W_DOWN 16 +#define GPM_W_RIGHT 32 +#define GPM_W_LEFT 64 +#define GPM_STICK 128 /*....................................... The event types */ @@ -115,6 +124,7 @@ unsigned char buttons, modifiers; /* try to be a multiple of 4 */ unsigned short vc; short dx, dy, x, y; + short stick_x, stick_y; enum Gpm_Etype type; int clicks; enum Gpm_Margin margin; Only in ../imwheel/gpm-imwheel: gpm.h.orig diff -ru --exclude=Makefile ./gpmCfg.h ../imwheel/gpm-imwheel/gpmCfg.h --- ./gpmCfg.h Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/gpmCfg.h Sun Feb 27 16:32:43 2000 @@ -4,6 +4,9 @@ * Copyright 1994-1996 rubini@linux.it * Copyright (C) 1998 Ian Zimmerman * + * Modified 9/8/1998 by Jonathan Atkins for wheel support + * + * * 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 @@ -24,7 +27,7 @@ /* $Id: imwheel.patch,v 1.2 2002/05/28 19:13:56 nico Exp $ */ -#define GPM_NAME "gpm-Linux" +#define GPM_NAME "gpm-Linux (imwheel)" #define GPM_DATE "$Date: 2002/05/28 19:13:56 $" /* timeout for the select() syscall */ @@ -63,5 +66,7 @@ #define DEF_PTRDRAG 1 /* double or triple click */ #define DEF_TOGGLE 0 #define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */ +#define DEF_WHEEL 0 /* wheel events active? */ +#define DEF_NO_MIDDLE 0 /* deactivate middle button for most mice? */ #endif /* _GPMCFG_INCLUDED */ Only in ../imwheel/gpm-imwheel: gpmCfg.h.orig diff -ru --exclude=Makefile ./gpmInt.h ../imwheel/gpm-imwheel/gpmInt.h --- ./gpmInt.h Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/gpmInt.h Sun Feb 27 16:30:46 2000 @@ -4,6 +4,9 @@ * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -67,6 +70,8 @@ int (*repeat_fun)(Gpm_Event *state, int fd); /* repeat this event into fd */ /* itz Mon Jan 11 23:27:54 PST 1999 */ + + int wheel; /* flag for wheel mice */ } Gpm_Type; #define GPM_EXTRA_MAGIC_1 0xAA @@ -88,6 +93,8 @@ int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_toggle, opt_glidepoint_tap; Gpm_Type *m_type; +/* not always initialized */ + int opt_wheel,opt_nomiddle; int fd; }; @@ -107,6 +114,8 @@ #define opt_time (which_mouse->opt_time) #define opt_cluster (which_mouse->opt_cluster) #define opt_three (which_mouse->opt_three) +#define opt_wheel (which_mouse->opt_wheel) +#define opt_nomiddle (which_mouse->opt_nomiddle) #define opt_toggle (which_mouse->opt_toggle) #define opt_glidepoint_tap \ (which_mouse->opt_glidepoint_tap) @@ -121,6 +130,7 @@ extern int opt_test, opt_ptrdrag; extern int opt_kill; extern int opt_repeater, opt_double; +extern int opt_wheel_repeater; extern char* opt_repeater_type; extern int opt_kernel, opt_explicittype; extern int opt_aged; @@ -128,6 +138,7 @@ extern char *opt_special; extern int opt_rawrep; extern int fifofd; +extern int wheel_fifofd; extern char *consolename; /* the selected one */ extern Gpm_Type *repeated_type; Only in ../imwheel/gpm-imwheel: gpmInt.h.orig diff -ru --exclude=Makefile ./gpn.c ../imwheel/gpm-imwheel/gpn.c --- ./gpn.c Fri Nov 12 08:27:36 1999 +++ ../imwheel/gpm-imwheel/gpn.c Sun Feb 27 16:30:46 2000 @@ -8,6 +8,9 @@ * Tue, 5 Jan 1999 23:26:10 +0000, modified by James Troup * (usage): typo (s/an unexistent/a non-existent/) * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -183,6 +186,8 @@ printf("Usage: %s [options]\n",prgname); printf(" Valid options are (not all of them are implemented)\n" + " -2 force two button mouse\n" + " -3 force three button mouse\n" " -a accel sets the acceleration (default %d)\n" " -A [limit] start with selection disabled (`aged')\n" " -b baud-rate sets the baud rate (default %d)\n" @@ -197,6 +202,7 @@ " -m mouse-device sets mouse device\n" " -M enable multiple mouse. Following options refer to\n" " the second device. Forces \"-R\"\n" + " -n disable middle button events (on most mice)\n" " -o modem-lines toggle modem lines (\"dtr\", \"rts\", \"both\")\n" " -p draw the pointer while striking a selection\n" " -q quit after changing mouse behaviour\n" @@ -210,7 +216,9 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" - " -V verbosity increase number of logged messages\n", + " -V verbosity increase number of logged messages\n" + " -w force activate wheel\n" + " -W activate wheel repeater\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; @@ -294,7 +302,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mno:pqr:R::s:S:t:TvV::wW23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -342,6 +350,7 @@ if (0 == opt_repeater_type) opt_repeater_type = "msc"; which_mouse=mouse_table+2; break; + case 'n': opt_nomiddle=!opt_nomiddle; break; case 'o': if (!strcmp(optarg,"dtr")) opt_toggle=TIOCM_DTR; else if (!strcmp(optarg,"rts")) opt_toggle=TIOCM_RTS; @@ -375,6 +384,8 @@ case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); break; + case 'w': opt_wheel=1; break; + case 'W': opt_wheel_repeater=1; break; case '2': opt_three=-1; break; case '3': opt_three=1; break; default: @@ -397,6 +408,13 @@ { oops(GPM_NODE_FIFO); } } + if (opt_wheel_repeater) + { + if (mkfifo(GPM_WHEEL_FIFO,0666) && errno!=EEXIST) + oops(GPM_WHEEL_FIFO); + if ((wheel_fifofd=open(GPM_WHEEL_FIFO, O_RDWR|O_NONBLOCK))<0) + oops(GPM_WHEEL_FIFO); + } /* duplicate initialization */ @@ -498,6 +516,8 @@ } +/* vim:ts=8:sw=2 +"*/ /* Local Variables: */ /* c-indent-level: 2 */ Only in ../imwheel/gpm-imwheel: gpn.c.orig diff -ru --exclude=Makefile ./liblow.c ../imwheel/gpm-imwheel/liblow.c --- ./liblow.c Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/liblow.c Sun Feb 27 16:30:46 2000 @@ -5,6 +5,9 @@ * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * xterm management is mostly by jtklehto@stekt.oulu.fi (Janne Kukonlehto) * * This program is free software; you can redistribute it and/or modify @@ -618,7 +621,11 @@ case 0: ePtr->buttons=GPM_B_LEFT; break; case 1: ePtr->buttons=GPM_B_MIDDLE; break; case 2: ePtr->buttons=GPM_B_RIGHT; break; - default: /* Nothing */ break; + case 3: ePtr->buttons=GPM_W_UP; break; + case 4: ePtr->buttons=GPM_W_DOWN; break; + case 5: ePtr->buttons=GPM_W_LEFT; break; + case 6: ePtr->buttons=GPM_W_RIGHT; break; + default: /* Nothing */ break; } } /* Coordinates are 33-based */ Only in ../imwheel/gpm-imwheel: liblow.c.orig diff -ru --exclude=Makefile ./mev.c ../imwheel/gpm-imwheel/mev.c --- ./mev.c Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/mev.c Sun Feb 27 16:30:46 2000 @@ -4,6 +4,9 @@ * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -93,11 +96,12 @@ { if (opt_fit) Gpm_FitEvent(event); - printf("mouse: event 0x%02X, at %2i,%2i (delta %2i,%2i), " + printf("mouse: event 0x%02X, at %2i,%2i (delta %2i,%2i), (stick %2i,%2i), " "buttons %i, modifiers 0x%02X\r\n", event->type, event->x, event->y, event->dx, event->dy, + event->stick_x, event->stick_y, event->buttons, event->modifiers); if (event->type & (GPM_DRAG|GPM_DOWN)) { Only in ../imwheel/gpm-imwheel: mev.c.orig diff -ru --exclude=Makefile ./mice.c ../imwheel/gpm-imwheel/mice.c --- ./mice.c Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/mice.c Sun Feb 27 16:43:42 2000 @@ -6,6 +6,9 @@ * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998,1999 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -83,7 +86,9 @@ static unsigned char prev=0; if (data[0] == 0x40 && !(prev|data[1]|data[2])) - state->buttons = GPM_B_MIDDLE; /* third button on MS compatible mouse */ + { /* third button on MS compatible mouse */ + state->buttons = (opt_nomiddle?0:GPM_B_MIDDLE); + } else state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); prev = state->buttons; @@ -103,11 +108,14 @@ /* Allow motion *and* button change (Michael Plass) */ - if ((state->dx==0) && (state->dy==0) - && (state->buttons == (prev&~GPM_B_MIDDLE))) - state->buttons = prev^GPM_B_MIDDLE; /* no move or change: toggle middle */ - else - state->buttons |= prev&GPM_B_MIDDLE; /* change: preserve middle */ + if(!opt_nomiddle) + { + if ((state->dx==0) && (state->dy==0) + && (state->buttons == (prev&~GPM_B_MIDDLE))) + state->buttons = prev^GPM_B_MIDDLE; /* no move or change: toggle middle */ + else + state->buttons |= prev&GPM_B_MIDDLE; /* change: preserve middle */ + } prev=state->buttons; @@ -127,11 +135,14 @@ /* Allow motion *and* button change (Michael Plass) */ - if ((state->dx==0) && (state->dy==0) - && (state->buttons == (prev&~GPM_B_MIDDLE))) - state->buttons = prev^GPM_B_MIDDLE; /* no move or change: toggle middle */ - else - state->buttons |= prev&GPM_B_MIDDLE; /* change: preserve middle */ + if(!opt_nomiddle) + { + if ((state->dx==0) && (state->dy==0) + && (state->buttons == (prev&~GPM_B_MIDDLE))) + state->buttons = prev^GPM_B_MIDDLE; /* no move or change: toggle middle */ + else + state->buttons |= prev&GPM_B_MIDDLE; /* change: preserve middle */ + } /* Allow the user to reset state of middle button by pressing the other two buttons at once (Edmund GRIMLEY EVANS) */ @@ -227,7 +238,11 @@ { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x10) >> 3) /* middle */ - | ((data[0] & 0x10) >> 4); /* right */ + | ((data[0] & 0x10) >> 4) /* right */ + | (((data[3] & 0x0f) == 0x0f)?GPM_W_UP:0) /* wheel up */ + | (((data[3] & 0x0f) == 0x01)?GPM_W_DOWN:0) /* wheel down */ + | (((data[3] & 0x0f) == 0x0e)?GPM_W_LEFT:0) /* wheel left */ + | (((data[3] & 0x0f) == 0x02)?GPM_W_RIGHT:0); /* wheel right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); /* wheel (dz??) is (data[3] & 0x0f) */ @@ -240,7 +255,11 @@ { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x20) >> 4) /* middle */ - | ((data[0] & 0x10) >> 4); /* right */ + | ((data[0] & 0x10) >> 4) /* right */ + | (((data[3] & 0x0f) == 0x0f)?GPM_W_UP:0) /* wheel up */ + | (((data[3] & 0x0f) == 0x01)?GPM_W_DOWN:0) /* wheel down */ + | (((data[3] & 0x0f) == 0x0e)?GPM_W_LEFT:0) /* wheel left */ + | (((data[3] & 0x0f) == 0x02)?GPM_W_RIGHT:0); /* wheel right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); if (((data[0]&0xC0) != 0x40)|| @@ -334,15 +353,39 @@ { static int tap_active=0; /* there exist glidepoint ps2 mice */ + state->stick_x=state->stick_y=0; state->buttons= - !!(data[0]&1) * GPM_B_LEFT + - !!(data[0]&2) * GPM_B_RIGHT + - !!(data[0]&4) * GPM_B_MIDDLE; + !!(data[0]&1) * GPM_B_LEFT | + !!(data[0]&2) * GPM_B_RIGHT | + (opt_nomiddle?0:!!(data[0]&4) * GPM_B_MIDDLE); + if(data[0]&0xc0) + { + state->buttons|=GPM_STICK; + state->stick_x=(data[2]&0x0F)<<28>>28; + state->stick_y=(data[2]>>4)<<28>>28; + gpm_debug_log(LOG_DEBUG,"Stick: %d %d\n",state->stick_x,state->stick_y); + } + else + state->buttons|=((data[3]==0xff) ? GPM_W_UP : 0) | /* wheel up */ + ((data[3]==0x01) ? GPM_W_DOWN : 0) | /* wheel down */ + ((data[3]==0x0e) ? GPM_W_LEFT : 0) | /* wheel left */ + ((data[3]==0xfe) ? GPM_W_LEFT : 0) | /* wheel left:a4tech*/ + ((data[3]==0x02) ? GPM_W_RIGHT : 0); /* wheel right */ + gpm_debug_log(LOG_DEBUG,"Buttons: %d %d %d (%d %d %d %d) (%d)\n", + (state->buttons&GPM_B_LEFT), + (state->buttons&GPM_B_MIDDLE), + (state->buttons&GPM_B_RIGHT), + (state->buttons&GPM_W_UP), + (state->buttons&GPM_W_DOWN), + (state->buttons&GPM_W_LEFT), + (state->buttons&GPM_W_RIGHT), + (state->buttons&GPM_STICK)); + gpm_debug_log(LOG_DEBUG,"wheel? %d\n",opt_wheel); if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ state->buttons = tap_active = opt_glidepoint_tap; else if (tap_active) - if (data[0]==8) + if (data[0]==8 && !opt_wheel) state->buttons = tap_active = 0; else state->buttons = tap_active; @@ -353,11 +396,11 @@ * rate is set to a reasonable value; the default of 100 Hz is plenty. * (Stephen Tell) */ - if(data[1] != 0) + if(data[1] != 0 && !(data[0]&0xc0)) state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; else state->dx = 0; - if(data[2] != 0) + if(data[2] != 0 && !(data[0]&0xc0)) state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; @@ -389,7 +432,7 @@ state->buttons= !!(data[0]&1) * GPM_B_LEFT + !!(data[0]&2) * GPM_B_RIGHT + - !!(data[3]) * GPM_B_MIDDLE; + (opt_nomiddle?0:!!(data[3]) * GPM_B_MIDDLE); if(data[1] != 0) state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; @@ -513,7 +556,7 @@ ((data[0] & 32)? ((z) ? GPM_B_LEFT :0) /* graphire stylus */ : ((data[3] & 8)? GPM_B_LEFT :0)) /* graphire mouse */ + ((data[3] & 16)? GPM_B_RIGHT :0) - + ((data[3] & 32)? GPM_B_MIDDLE :0); + + ((data[3] & 32) && !opt_nomiddle? GPM_B_MIDDLE :0); state->dx = (x-ox); state->dy = (y-oy); /* divide by 5, 'cause it's too much sensitive */ @@ -666,12 +709,13 @@ switch (message & TW_ANY1) { case TW_L1: state->buttons = GPM_B_RIGHT; break; - case TW_M1: state->buttons = GPM_B_MIDDLE; break; - case TW_R1: state->buttons = GPM_B_LEFT; break; - case 0: state->buttons = 0; break; + case TW_M1: state->buttons = (opt_nomiddle?0:GPM_B_MIDDLE); + break; + case TW_R1: state->buttons = GPM_B_LEFT; break; + case 0: state->buttons = 0; break; } /* also, allow R1 R2 R3 (or L1 L2 L3) to be used as mouse buttons */ - if (message & TW_ANY2) + if ((message & TW_ANY2) && !opt_nomiddle) state->buttons |= GPM_B_MIDDLE; if (message & TW_L3) state->buttons |= GPM_B_LEFT; @@ -1011,11 +1055,12 @@ static Gpm_Type* I_serial(int fd, unsigned short flags, struct Gpm_Type *type) { - int i; unsigned char c; + int i; +#ifndef DEBUG + unsigned char c; fd_set set; struct timeval timeout={0,0}; /* used when not debugging */ -#ifndef DEBUG /* flush any pending input (thanks, Miguel) */ FD_ZERO(&set); for(i=0; /* always */ ; i++) @@ -1186,6 +1231,7 @@ * the vendor name: it is only propaganda, with no information. */ + opt_wheel=type->wheel; return type; } @@ -1199,9 +1245,221 @@ write (fd, s2, sizeof (s2)); usleep (30000); tcflush (fd, TCIFLUSH); + opt_wheel=1; + return type; +} + +/* MouseManPlus, ps2 version: Jon Atkins (XFree86 & hacking!) */ +static Gpm_Type *I_mmplusps2(int fd, unsigned short flags, struct Gpm_Type *type) +{ + static unsigned char s1[] = { 0xe6,0xe8,0,0xe8,3,0xe8,2,0xe8,1,0xe6,0xe8,3,0xe8,1,0xe8,2,0xe8,3, }; + //static unsigned char s2[] = { 246, 230, 244, 243, 100, 232, 3, }; + write (fd, s1, sizeof (s1)); + sleep(1); + //usleep (30000); + //write (fd, s2, sizeof (s2)); + //usleep (30000); + tcflush (fd, TCIFLUSH); + opt_wheel=1; return type; } +/* Logitech Trackman Marblefx routine by Ric Klaren */ +static int M_marblefx(Gpm_Event *state, unsigned char *data) +{ + static unsigned int wheel = 0; /* for state machine */ + + state->buttons = !!(data[0]&1) * GPM_B_LEFT | + !!(data[0]&2) * GPM_B_RIGHT | + !!(data[0]&4) * GPM_B_MIDDLE; + + /* the red button pressed or depressed. + * the depress event is fired 3 times followed by a 8 0 0 packet + */ + if( (data[0] & 0xc0) && (data[1] == 0xD2) ) + { + if (( data[2] & 0x10 ) != 0) /* pressed? */ + wheel = 3; + else + wheel--; + + return -1; + } + + if( (wheel == 1) && data[0] == 0x08 && data[1] == 0 && data[2] == 0 ) + { + wheel--; + return -1; + } + + if( wheel == 3 ) /* wheel 'level' 3 is the real stuff.. else it i + s 'depressing' ;) */ + { + /* eat another dummy packet? */ + if( data[0] == 0x08 && data[1] == 0 && data[2] == 0 ) + return -1; + + /* or is it smarter to emulate a wheel? */ + state->buttons |= GPM_STICK; // pressed + + /* if red button is pressed take mouse movement as wheel */ + state->stick_x = (data[0] & 0x10) ? (data[1]-256) : data[1]; + state->stick_y = -((data[0] & 0x20) ? data[2]-256 : data[2]); + + /* shut the rest of the mouse up.. */ + state->dy = state->dx = 0; + } + else /* it's normal movement */ + { + state->dx = (data[0] & 0x10) ? data[1]-256 : data[1]; + state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); + state->stick_x = state->stick_y = 0; + } + return 0; +} + +#define GPM_B_BOTH (GPM_B_LEFT|GPM_B_RIGHT) +static int M_tmmfx(Gpm_Event *state, unsigned char *data) +{ + + /* The Logitech TrackMan Marble FX, mostly cut-n-paste from M_mman */ + /* Tido Klaassen (tidklaas@hermes.fho-emden.de), 5.1.2000 */ + + static unsigned char buttons=0; + static Gpm_Type *mytype=0; + unsigned char extended; + signed char my_x, my_y; + + /* find mice-entry for toggeling between 3/4-byte-protocoll */ + if(mytype == 0){ + mytype=mice; + while(mytype->name && strcmp("tmmfx", mytype->name)){ + mytype++; + } + + /* this can't happen, unless someone deletes the entry... */ + if(!mytype->name){ + gpm_debug_log(LOG_NOTICE, "internal mice-table broken, exiting"); + exit(1); + } + } + + if (data[1]==GPM_EXTRA_MAGIC_1 && data[2]==GPM_EXTRA_MAGIC_2){ + /* got unexpected fourth byte */ + gpm_debug_log(LOG_NOTICE,"Extra byte = %02x",*data); + if ((extended=(data[0]>>4)) > 0x3){ + return -1; /* just a sanity check */ + } + my_x = my_y = 0; + + mytype->packetlen=4; + mytype->getextra=0; + } + else{ + /* got 3/4, as expected */ + + /* motion is independent of packetlen... */ + my_x = (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); + my_y = (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + + buttons = ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); + if (mytype->packetlen==4){ + extended=data[3]>>4; + } + } + + if(mytype->packetlen==4){ + if(extended == 0){ + mytype->packetlen=3; + mytype->getextra=1; + } + else { + if (extended & 0x2){ + buttons |= GPM_B_MIDDLE; + } + + if (extended & 0x1){ + /* scroll-button pressed, report ball-movements as stick-data */ + + buttons |= GPM_STICK; + state->stick_x = (char) my_x; + state->stick_y = (char) -my_y; + my_x = 0; + my_y = 0; + } + } + } + state->buttons = buttons; + state->dx = my_x; + state->dy = my_y; + + return 0; +} + +/* The Primax Cyber-Navigator is basically a PS/2 mouse with a non-standard + wheel and three extra side buttons. We'll map the side buttons to the + extra bits in the patched gpm. */ +static int M_pcnps2(Gpm_Event *state, unsigned char *data) +{ + state->stick_x=state->stick_y=0; + state->dx=state->dy=0; + + state->buttons= + !!(data[0]&1) * GPM_B_LEFT | + !!(data[0]&2) * GPM_B_RIGHT | + !!(data[0]&4) * GPM_B_MIDDLE; + + /* The Primax extensions use the 0x10 bit to flag extended + button/wheel reports. Bits 0, 1 and 2 echo the three standard buttons, + if chording. */ + + if(((data[0]&0x18)==0x18) && (data[1]==0) && ((data[2]&0x80))!=0){ + state->buttons&=~(GPM_W_DOWN|GPM_W_UP|GPM_W_LEFT|GPM_W_RIGHT|GPM_STICK); + state->buttons|= + ((data[2]&0xf)==0xf) * GPM_W_UP | + ((data[2]&0xf)==0x1) * GPM_W_DOWN | + (((data[2]&0x10)!=0) * GPM_W_LEFT) | + (((data[2]&0x20)!=0) * GPM_W_RIGHT); + + /* There's no room to handle the sixth button. We'll make it an + upwards stick movement. */ + +#if 0 + state->buttons|=GPM_STICK; + state->stick_x=0; + state->stick_y=7*(!!data[2]&0x40); +#endif + } else { + /* The Primax mice don't seem to send negative bits in data[0], but they do + * flag extended button events and wheel movement using bit 0x10. */ + if(data[1] != 0) + state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; + else + state->dx = 0; + if(data[2] != 0) + state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); + else + state->dy = 0; + } + gpm_debug_log(LOG_DEBUG,"Buttons: %d %d %d (%d %d) (%d %d)\n", + (state->buttons&GPM_B_LEFT), + (state->buttons&GPM_B_MIDDLE), + (state->buttons&GPM_B_RIGHT), + (state->buttons&GPM_W_UP), + (state->buttons&GPM_W_DOWN), + (state->buttons&GPM_W_LEFT), + (state->buttons&GPM_W_RIGHT)); + gpm_debug_log(LOG_DEBUG,"wheel? %d\n",opt_wheel); + + return 0; +} + +static Gpm_Type *I_pcnps2(int fd, unsigned short flags, struct Gpm_Type *type) +{ + opt_wheel=type->wheel; + return type; +} + static Gpm_Type *I_twid(int fd, unsigned short flags, struct Gpm_Type *type) { if (twiddler_key_init() != 0) return NULL; @@ -1438,104 +1696,116 @@ Gpm_Type mice[]={ {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ - {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0, 0}, {"ms", "The original ms protocol, with a middle-button extension.", "", M_ms, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0}, {"ms+", "Like 'ms', but allows dragging with the middle button.", "", M_ms_plus, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0}, {"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).", "", M_ms_plus_lr, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0}, {"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.", "Microsoft", M_bare, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0}, {"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.", "MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc}, + {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc, 0}, {"sun", "'msc' protocol, but only 3 bytes per packet.", "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, 0}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, - {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, + {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0, 0}, {"logi", "Used in some Logitech devices (only serial).", "Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG, - {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0}, + {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0, 0}, {"bm", "Micro$oft busmice and compatible devices.", "BusMouse", M_bm, NULL, STD_FLG, /* bm is sun */ - {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0, 0}, {"ps2", "Busmice of the ps/2 series. Most busmice, actually.", "PS/2", M_ps2, NULL, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0, 0}, {"ncr", "Ncr3125pen, found on some laptops", "", M_ncr, NULL, STD_FLG, - {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0}, + {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0, 0}, {"wacom", "Wacom graphire tablet: pen, mouse", "", M_wacom, I_wacom, STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 8, 8, 0, 0, 0}, + {0x80, 0x80, 0x80, 0x00}, 8, 8, 0, 0, 0, 0}, {"genitizer", "\"Genitizer\" tablet, in relative mode.", "", M_geni, I_serial, CS8|PARENB|PARODD, - {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, 0}, {"logim", "Turn logitech into Mouse-Systems-Compatible.", "", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0, 0}, {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0}, {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", "", M_ps2, I_imps2, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, 1}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0, 1}, {"netmouse", "Genius NetMouse - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, 0}, {"cal", "Calcomp UltraSlate", "", M_calus, I_calus, CS8 | CSTOPB | STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0}, + {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0, 0}, {"calr", "Calcomp UltraSlate - relative mode", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0}, + {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0, 0}, {"twid", "Twidddler keyboard", "", M_twid, I_twid, CS8 | STD_FLG, - {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0}, + {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0, 0}, {"syn", "The \"Synaptics\" serial TouchPad.", "synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0, 0}, {"synps2", "The \"Synaptics\" PS/2 TouchPad", "synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG, - {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0}, + {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0, 0}, {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", "", M_brw, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0, 0}, + {"mm+ps2", "The \"MouseManPlus\" and similar devices (3 button with stick)", + "MouseManPlusPS/2", M_ps2, I_mmplusps2, CS8 | STD_FLG, + {0x08, 0x08, 0x00, 0x00}, 3, 1, 0, 0, 0, 1}, + {"marblefx", "The Logitech Marble FX Trackball (4th button toggles stick)", + "MarbleFX", M_marblefx, I_mmplusps2, CS8 | STD_FLG, + {0x08, 0x08, 0x00, 0x00}, 3, 1, 0, 0, 0, 1}, + {"tmmfx", "Logitech TrackMan Marble FX (serial, 4th button toggles stick)", + "TrackManFX", M_tmmfx, I_serial, CS7 | STD_FLG, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0, 1}, + {"pcnps2", "Primax Cyber Navigator (and more?) on a PS/2 port.", + "", M_pcnps2, I_pcnps2, STD_FLG, + {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0, 1}, #ifdef HAVE_LINUX_JOYSTICK_H {"js", "Joystick mouse emulation", "Joystick", M_js, NULL, 0, - {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0}, + {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0, 0}, #endif {"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)", "", M_summa, I_summa, STD_FLG, - {0x98, 0x98, 0x00, 0x00}, 5, 1, 0, 1, R_summa}, + {0x98, 0x98, 0x00, 0x00}, 5, 1, 0, 1, R_summa, 0}, {"mtouch", "MicroTouch touch-screens (only button-1 events, by now)", "", M_mtouch, I_mtouch, STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL}, + {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL, 0}, {"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)", "", M_summa, I_summa, STD_FLG, - {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0}, + {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0, 0}, {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, - {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0, 0}, {"", "", "", NULL, NULL, 0, - {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} + {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0, 0} }; /*------------------------------------------------------------------------*/ Only in ../imwheel/gpm-imwheel: mice.c.orig diff -ru --exclude=Makefile ./mouse-test.c ../imwheel/gpm-imwheel/mouse-test.c --- ./mouse-test.c Fri Nov 12 08:27:37 1999 +++ ../imwheel/gpm-imwheel/mouse-test.c Sun Feb 27 16:30:46 2000 @@ -10,6 +10,9 @@ * where watchdog is used. Reported by Jim Studt * [Debian bug report #22602] * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 @@ -55,6 +58,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_WHEEL, DEF_NO_MIDDLE, (Gpm_Type *)NULL }; Only in ../imwheel/gpm-imwheel: mouse-test.c.orig gpm-1.20.4/patches/todo/imwheel/imwheel.reason010060000017500001750000000006370760216311400201130ustar00niconico00 All of these patches add field to Gpm_Event, which is the quantum of communication with gpm clients. Change Gpm_Event changes the communication protocol, and thus is an incompatible change. If the protocol has to be changed, we need to create a new channel and still keep the old protocol. Also, the new protocol must be as good and extensible as possible, to avoid any similar incompatible change in the future. gpm-1.20.4/patches/todo/imwheel/imwheel2.patch010060000017500001750000000212760760216311400200070ustar00niconico00diff -r -u gpm-1.18.0/doc/gpm.8 gpm-1.18.0-wheel/doc/gpm.8 --- gpm-1.18.0/doc/gpm.8 Mon Sep 13 08:33:54 1999 +++ gpm-1.18.0-wheel/doc/gpm.8 Sun Oct 10 15:23:48 1999 @@ -263,6 +263,10 @@ optional and its default value is 1. Default verbosity level is 5 (`LOG_NOTICE'). .TP +-w +Simulate wheel operation by pressing middle mouse button and +y-axis movement. +.TP -2 Force two buttons. This means that the middle button, if any, will be taken as it was the right one. diff -r -u gpm-1.18.0/gpm.c gpm-1.18.0-wheel/gpm.c --- gpm-1.18.0/gpm.c Mon Sep 13 08:33:54 1999 +++ gpm-1.18.0-wheel/gpm.c Sun Oct 10 15:18:15 1999 @@ -61,6 +61,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_SIMWHEEL, (Gpm_Type *)NULL }, }; @@ -387,20 +388,23 @@ { event->x=nEvent.x; event->y=nEvent.y; + event->z=nEvent.z; } event->dx=nEvent.dx; event->dy=nEvent.dy; + event->dz=nEvent.dz; event->buttons=nEvent.buttons; } else { - event->dx=event->dy=0; + event->dx=event->dy=event->dz=0; nEvent.modifiers = 0; /* some mice set them */ FD_ZERO(&fdSet); FD_SET(fd,&fdSet); i=0; do /* cluster loop */ { + nEvent.dx=nEvent.dy=nEvent.dz=0; if ( ((data=getMouseData(fd,m_type,kd_mode))==NULL) || ((*(m_type->fun))(&nEvent,data)==-1) ) { @@ -408,6 +412,12 @@ else break; } + if (which_mouse->opt_simwheel && (nEvent.buttons & GPM_B_MIDDLE) && nEvent.dy) { + nEvent.buttons &= !GPM_B_MIDDLE; + nEvent.dz = nEvent.dy; + nEvent.dy = 0; + } + event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ @@ -430,6 +440,7 @@ /* increment the reported dx,dy */ event->dx+=nEvent.dx; event->dy+=nEvent.dy; + event->dz+=nEvent.dz; } else /* a pen */ { @@ -459,12 +470,13 @@ static struct timeval rept1,rept2; gettimeofday(&rept2, (struct timezone *)NULL); if (((rept2.tv_sec -rept1.tv_sec) *1000+(rept2.tv_usec-rept1.tv_usec)/1000)>250) - { event->dx=0; event->dy=0; } + { event->dx=0; event->dy=0; event->dz=0; } rept1=rept2; event->dy=event->dy*((win.ws_col/win.ws_row)+1); event->x=nEvent.x; event->y=nEvent.y; + event->z=nEvent.z; } repeated_type->repeat_fun(event, fifofd); /* itz Mon Jan 11 23:39:44 PST 1999 */ } @@ -497,7 +509,7 @@ /*....................................... fill missing fields */ - event->x+=event->dx, event->y+=event->dy; + event->x+=event->dx, event->y+=event->dy; event->z+=event->dz; statusB=event->buttons; i=open_console(O_RDONLY); diff -r -u gpm-1.18.0/gpm.h gpm-1.18.0-wheel/gpm.h --- gpm-1.18.0/gpm.h Mon Sep 13 08:33:55 1999 +++ gpm-1.18.0-wheel/gpm.h Sat Oct 9 20:45:44 1999 @@ -114,7 +114,7 @@ typedef struct Gpm_Event { unsigned char buttons, modifiers; /* try to be a multiple of 4 */ unsigned short vc; - short dx, dy, x, y; + short dx, dy, dz, x, y, z; enum Gpm_Etype type; int clicks; enum Gpm_Margin margin; diff -r -u gpm-1.18.0/gpmCfg.h gpm-1.18.0-wheel/gpmCfg.h --- gpm-1.18.0/gpmCfg.h Mon Sep 13 08:33:55 1999 +++ gpm-1.18.0-wheel/gpmCfg.h Sun Oct 10 14:16:21 1999 @@ -63,5 +63,7 @@ #define DEF_PTRDRAG 1 /* double or triple click */ #define DEF_TOGGLE 0 #define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */ +#define DEF_SIMWHEEL 0 /* simulate wheel with middle button and */ + /* y-axis movement */ #endif /* _GPMCFG_INCLUDED */ diff -r -u gpm-1.18.0/gpmInt.h gpm-1.18.0-wheel/gpmInt.h --- gpm-1.18.0/gpmInt.h Mon Sep 13 08:33:55 1999 +++ gpm-1.18.0-wheel/gpmInt.h Sun Oct 10 14:12:19 1999 @@ -87,6 +87,7 @@ char *opt_type, *opt_dev, *opt_sequence; int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_toggle, opt_glidepoint_tap; + int opt_simwheel; Gpm_Type *m_type; int fd; }; diff -r -u gpm-1.18.0/gpn.c gpm-1.18.0-wheel/gpn.c --- gpm-1.18.0/gpn.c Mon Sep 13 08:33:54 1999 +++ gpm-1.18.0-wheel/gpn.c Sun Oct 10 15:37:31 1999 @@ -212,7 +212,9 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" - " -V verbosity increase number of logged messages\n", + " -V verbosity increase number of logged messages\n" + " -w simulate wheel operation by pressing middle\n" + " mouse button and y-axis movement\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; @@ -296,7 +298,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::w23"; int i, opt; FILE *f; static struct {char *in; char *out;} seq[] = { @@ -377,6 +379,9 @@ case 'v': printf(GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); exit(0); case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); + break; + case 'w': + which_mouse->opt_simwheel=1; break; case '2': opt_three=-1; break; case '3': opt_three=1; break; diff -r -u gpm-1.18.0/mice.c gpm-1.18.0-wheel/mice.c --- gpm-1.18.0/mice.c Mon Sep 13 08:33:54 1999 +++ gpm-1.18.0-wheel/mice.c Sun Oct 10 15:29:24 1999 @@ -366,6 +366,61 @@ return 0; } +static int M_imps2(Gpm_Event *state, unsigned char *data) +{ + static int tap_active=0; /* there exist glidepoint ps2 mice */ + + state->buttons= + !!(data[0]&1) * GPM_B_LEFT + + !!(data[0]&2) * GPM_B_RIGHT + + !!(data[0]&4) * GPM_B_MIDDLE; + + if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ + state->buttons = tap_active = opt_glidepoint_tap; + else if (tap_active) + if (data[0]==8) + state->buttons = tap_active = 0; + else state->buttons = tap_active; + + /* Some PS/2 mice send reports with negative bit set in data[0] + * and zero for movement. I think this is a bug in the mouse, but + * working around it only causes artifacts when the actual report is -256; + * they'll be treated as zero. This should be rare if the mouse sampling + * rate is set to a reasonable value; the default of 100 Hz is plenty. + * (Stephen Tell) + */ + if(data[1] != 0) + state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; + else + state->dx = 0; + if(data[2] != 0) + state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); + else + state->dy = 0; + state->dz = (data[3] > 128) ? data[3]-256 : data[3]; + + return 0; +} + +static int R_imps2(Gpm_Event *state, int fd) +{ + unsigned char buffer[4]; + + buffer[0] = ((state->buttons & GPM_B_LEFT) ? 0x01 : 0) | + ((state->buttons & GPM_B_RIGHT) ? 0x02 : 0) | + ((state->buttons & GPM_B_MIDDLE) ? 0x04 : 0); + + if (state->dx < 0) buffer[0] |= 0x10; + if (state->dy > 0) buffer[0] |= 0x20; + + buffer[1] = ( state->dx >= 0) ? state->dx : 256+state->dx; + buffer[2] = (-state->dy >= 0) ? -state->dy : 256-state->dy; + buffer[3] = ( state->dz >= 0) ? state->dz : 256+state->dz; + + return write(fd,buffer,4); +} + + static int M_netmouse(Gpm_Event *state, unsigned char *data) { /* Avoid this beasts if you can. They connect to normal PS/2 port, @@ -1447,9 +1502,9 @@ {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", - "", M_ps2, I_imps2, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel", + "", M_imps2, I_imps2, STD_FLG, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, R_imps2}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, diff -r -u gpm-1.18.0/mouse-test.c gpm-1.18.0-wheel/mouse-test.c --- gpm-1.18.0/mouse-test.c Mon Sep 13 08:33:54 1999 +++ gpm-1.18.0-wheel/mouse-test.c Sun Oct 10 14:24:28 1999 @@ -55,6 +55,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_SIMWHEEL, (Gpm_Type *)NULL }; gpm-1.20.4/patches/todo/imwheel/imwheel3.patch010060000017500001750000001327220760216311400200070ustar00niconico00Common subdirectories: gpm-cvstree.orig/CVS and gpm-cvstree/CVS diff -c gpm-cvstree.orig/Makefile.in gpm-cvstree/Makefile.in *** gpm-cvstree.orig/Makefile.in Fri Jan 21 00:10:00 2000 --- gpm-cvstree/Makefile.in Mon Feb 14 18:28:31 2000 *************** *** 142,148 **** for i in mev gpm-root; do \ $(INSTALL_PROGRAM) $$i $(bindir)/$$i ;\ done ! $(INSTALL_PROGRAM) -o root -m 4755 disable-paste $(bindir)/disable-paste # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional # headache in cases like this --- 142,148 ---- for i in mev gpm-root; do \ $(INSTALL_PROGRAM) $$i $(bindir)/$$i ;\ done ! $(INSTALL_PROGRAM) disable-paste $(bindir)/disable-paste # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional # headache in cases like this diff -c gpm-cvstree.orig/config.h.in gpm-cvstree/config.h.in *** gpm-cvstree.orig/config.h.in Thu Jan 27 23:19:29 2000 --- gpm-cvstree/config.h.in Mon Feb 14 18:40:49 2000 *************** *** 1,6 **** /* config.h.in. Generated automatically from configure.in by autoheader. */ /* Copyright (C) 1998 Ian Zimmerman */ ! /* $Id: imwheel3.patch,v 1.2 2002/05/28 19:13:56 nico Exp $ */ /* Define if using alloca.c. */ --- 1,6 ---- /* config.h.in. Generated automatically from configure.in by autoheader. */ /* Copyright (C) 1998 Ian Zimmerman */ ! /* $Id: imwheel3.patch,v 1.2 2002/05/28 19:13:56 nico Exp $ */ /* Define if using alloca.c. */ *************** *** 53,66 **** /* Define if you have the header file. */ #undef HAVE_LINUX_TTY_H - /* Define if you have the header file. */ - #undef HAVE_NCURSES_H - /* Define if you have the header file. */ #undef HAVE_NCURSES_CURSES_H ! /* Define if you have the header file. */ ! #undef HAVE_SYS_SYSMACROS_H /* Define if you have the header file. */ #undef HAVE_SYSLOG_H --- 53,66 ---- /* Define if you have the header file. */ #undef HAVE_LINUX_TTY_H /* Define if you have the header file. */ #undef HAVE_NCURSES_CURSES_H ! /* Define if you have the header file. */ ! #undef HAVE_NCURSES_H /* Define if you have the header file. */ #undef HAVE_SYSLOG_H + + /* Define if you have the header file. */ + #undef HAVE_SYS_SYSMACROS_H Common subdirectories: gpm-cvstree.orig/doc and gpm-cvstree/doc Only in gpm-cvstree: gpm-root.c diff -c gpm-cvstree.orig/gpm.c gpm-cvstree/gpm.c *** gpm-cvstree.orig/gpm.c Mon Feb 7 12:40:11 2000 --- gpm-cvstree/gpm.c Mon Feb 14 18:43:01 2000 *************** *** 5,10 **** --- 5,13 ---- * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 *************** *** 62,68 **** DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, (char *)NULL /* extra */, ! (Gpm_Type *)NULL }, }; struct mouse_features *which_mouse; --- 65,71 ---- DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, (char *)NULL /* extra */, ! (int)(Gpm_Type *)NULL }, }; struct mouse_features *which_mouse; *************** *** 74,80 **** int opt_test=DEF_TEST; int opt_ptrdrag=DEF_PTRDRAG; int opt_kill=0; ! int opt_repeater=0, opt_double=0; char* opt_repeater_type = 0; int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ --- 77,84 ---- int opt_test=DEF_TEST; int opt_ptrdrag=DEF_PTRDRAG; int opt_kill=0; ! int opt_repeater=0, opt_wheel_repeater=0, opt_double=0; ! int opt_wheel_swap=0; char* opt_repeater_type = 0; int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ *************** *** 86,92 **** char *prgname; struct winsize win; int maxx, maxy; ! int fifofd=-1; int eventFlag=0; Gpm_Cinfo *cinfo[MAX_VC+1]; --- 90,96 ---- char *prgname; struct winsize win; int maxx, maxy; ! int fifofd=-1, wheel_fifofd=-1; int eventFlag=0; Gpm_Cinfo *cinfo[MAX_VC+1]; *************** *** 403,408 **** --- 407,413 ---- fd_set fdSet; static int newB=0, oldB=0, oldT=0; /* old buttons and Type to chain events */ /* static int buttonlock, buttonlockflag; */ + static int wheel_fakeup; #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ *************** *** 410,415 **** --- 415,421 ---- oldT=event->type; + wheel_fakeup=0; if (eventFlag) { *************** *** 422,428 **** } event->dx=nEvent.dx; event->dy=nEvent.dy; ! event->buttons=nEvent.buttons; } else { --- 428,442 ---- } event->dx=nEvent.dx; event->dy=nEvent.dy; ! if(opt_wheel && nEvent.buttons&(GPM_B_UP|GPM_B_DOWN)) ! { ! event->buttons=nEvent.buttons&7; ! oldB=newB; newB=event->buttons; ! event->type=GPM_UP; ! wheel_fakeup=1; ! } ! else ! event->buttons=nEvent.buttons; } else { *************** *** 443,449 **** event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ ! nEvent.buttons = opt_sequence[nEvent.buttons]&7; /* change the order */ oldB=newB; newB=nEvent.buttons; if (!i) event->buttons=nEvent.buttons; --- 457,465 ---- event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ ! gpm_debug_log(LOG_DEBUG,"nEvent.buttons=%d opt_sequence=%d opt_wheel=%d\n",nEvent.buttons,opt_sequence[nEvent.buttons&7]&7,opt_wheel); ! nEvent.buttons = (opt_sequence[nEvent.buttons&7]&7)| ! (opt_wheel?((nEvent.buttons&GPM_B_UP)|(nEvent.buttons&GPM_B_DOWN)):0); oldB=newB; newB=nEvent.buttons; if (!i) event->buttons=nEvent.buttons; *************** *** 476,484 **** --- 492,527 ---- } /* eventFlag */ + if(!wheel_fakeup) + { /*....................................... update the button number */ if ((event->buttons&GPM_B_MIDDLE) && !opt_three) opt_three++; + if ((event->buttons&GPM_B_UP || event->buttons&GPM_B_DOWN) && !opt_wheel) + opt_wheel++; + if (opt_wheel && event->buttons&(GPM_B_UP|GPM_B_DOWN)) + gpm_debug_log(LOG_DEBUG,"Wheel - %s%s\n",(event->buttons&GPM_B_UP?"Up ":""), + (event->buttons&GPM_B_DOWN?"Down":"")); + + + /* .................................... repeat wheel to special fifo */ + + if(wheel_fifofd + && (event->buttons&(GPM_B_DOWN|GPM_B_UP)) + && event->buttons>oldB) /* button down, not up! (not the wheel motion) */ + { + unsigned char buffer[1]; + + event->type=GPM_DOWN; + if(event->buttons&GPM_B_DOWN) + /* button 5 is down */ + if (!opt_wheel_swap) { buffer[0]=5; } else { buffer[0]=4; } + else + /* button 4 is down */ + if (!opt_wheel_swap) { buffer[0]=4; } else { buffer[0]=5; } + /* LOG(("repeat wheel: %s\n",buffer)); */ + write(wheel_fifofd,buffer,1); + } /*....................................... we're a repeater, aren't we? */ *************** *** 499,504 **** --- 542,550 ---- event->y=nEvent.y; } repeated_type->repeat_fun(event, fifofd); /* itz Mon Jan 11 23:39:44 PST 1999 */ + /* From original patch + buffer[0]=((event->buttons&7) ^ 0x07) | 0x80; + */ } return 0; /* no events nor information for clients */ } *************** *** 559,571 **** event->type = (event->buttons ? GPM_DRAG : GPM_MOVE); else event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP); switch(event->type) /* now provide the cooked bits */ { case GPM_DOWN: GET_TIME(tv2); ! if (tv1.tv_sec && (DIF_TIME(tv1,tv2)type|=(GPM_SINGLE<type = (event->buttons ? GPM_DRAG : GPM_MOVE); else event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP); + } switch(event->type) /* now provide the cooked bits */ { case GPM_DOWN: GET_TIME(tv2); ! if ((!opt_wheel || (event->buttons&7)) && tv1.tv_sec && (DIF_TIME(tv1,tv2)type|=(GPM_SINGLE<buttons^=oldB; /* for button-up, tell which one */ ! event->type|= (oldT&GPM_MFLAG); event->type|=(GPM_SINGLE<buttons^=oldB; /* for button-up, tell which one */ ! event->type|=(oldT&GPM_MFLAG); event->type|=(GPM_SINGLE<type & GPM_DOWN) return processSpecial(event); ! return 1; } /*-------------------------------------------------------------------*/ --- 672,678 ---- if (opt_special && event->type & GPM_DOWN) return processSpecial(event); ! return (!wheel_fakeup); } /*-------------------------------------------------------------------*/ *************** *** 925,931 **** { int ctlfd, newfd; struct sockaddr_un ctladdr; ! int i, len, kd_mode, fd; struct timeval timeout; int maxfd=-1; int pending; --- 972,978 ---- { int ctlfd, newfd; struct sockaddr_un ctladdr; ! int i, len, kd_mode, fd, j; struct timeval timeout; int maxfd=-1; int pending; *************** *** 1087,1093 **** if (ioctl(fd, KDGETMODE, &kd_mode)<0) oops("ioctl(KDGETMODE)"); close(fd); ! if (kd_mode != KD_TEXT && !opt_repeater) { wait_text(&mouse_table[1].fd); maxfd=max(maxfd,mouse_table[1].fd); --- 1134,1140 ---- if (ioctl(fd, KDGETMODE, &kd_mode)<0) oops("ioctl(KDGETMODE)"); close(fd); ! if (kd_mode != KD_TEXT && !opt_repeater && !opt_wheel_repeater) { wait_text(&mouse_table[1].fd); maxfd=max(maxfd,mouse_table[1].fd); *************** *** 1107,1123 **** which_mouse=mouse_table+i; /* used to access options */ if (FD_ISSET(which_mouse->fd,&selSet)) { FD_CLR(which_mouse->fd,&selSet); pending--; ! if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) ! /* ! * pass it to the client, if any ! * or to the default handler, if any ! * or to the selection handler ! */ /* FIXME -- check event.vc */ ! (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) ! || (cinfo[0] && do_client(cinfo[0], &event)) ! || do_selection(&event); ! } } /*....................................... got connection, process it */ --- 1154,1191 ---- which_mouse=mouse_table+i; /* used to access options */ if (FD_ISSET(which_mouse->fd,&selSet)) { + Gpm_Event eventbuf; + int wheel_done; + FD_CLR(which_mouse->fd,&selSet); pending--; ! wheel_done=0; ! do ! { ! if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) ! { ! memcpy(&eventbuf,&event,sizeof(Gpm_Event)); ! /* ! * pass it to the client, if any ! * or to the default handler, if any ! * or to the selection handler ! */ /* FIXME -- check event.vc */ ! (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) ! || (cinfo[0] && do_client(cinfo[0], &event)) ! || do_selection(&event); ! memcpy(&event,&eventbuf,sizeof(Gpm_Event)); ! } ! gpm_debug_log(LOG_DEBUG,"event.type=0x%x event.buttons=%d\n", event.type, event.buttons); ! if(!wheel_done && opt_wheel && ! (event.type&(GPM_DOWN|GPM_DRAG)) && ! (event.buttons&(GPM_B_UP|GPM_B_DOWN))) ! { ! ! gpm_debug_log(LOG_DEBUG,"Button Up!\n"); ! wheel_done=1; ! eventFlag=1; ! } ! } while(eventFlag); ! } } /*....................................... got connection, process it */ *************** *** 1197,1202 **** prgname, getpid(), prgname); exit(0); } ! ! ! --- 1265,1269 ---- prgname, getpid(), prgname); exit(0); } ! /* vim:sw=2:ts=8 ! "*/ diff -c gpm-cvstree.orig/gpm.h gpm-cvstree/gpm.h *** gpm-cvstree.orig/gpm.h Thu Jan 27 23:19:29 2000 --- gpm-cvstree/gpm.h Mon Feb 14 18:28:31 2000 *************** *** 4,9 **** --- 4,12 ---- * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 *************** *** 69,80 **** --- 72,87 ---- #define GPM_NODE_CTL GPM_NODE_DEV #define GPM_NODE_FIFO _PATH_DEV "gpmdata" + #define GPM_WHEEL_FIFO _PATH_DEV "gpmwheel" /*....................................... Cfg buttons */ #define GPM_B_LEFT 4 #define GPM_B_MIDDLE 2 #define GPM_B_RIGHT 1 + #define GPM_B_UP 8 + #define GPM_B_DOWN 16 + /*....................................... The event types */ diff -c gpm-cvstree.orig/gpmCfg.h gpm-cvstree/gpmCfg.h *** gpm-cvstree.orig/gpmCfg.h Tue Jan 18 06:10:30 2000 --- gpm-cvstree/gpmCfg.h Mon Feb 14 18:28:31 2000 *************** *** 4,9 **** --- 4,12 ---- * Copyright 1994-1996 rubini@linux.it * Copyright (C) 1998 Ian Zimmerman * + * Modified 9/8/1998 by Jonathan Atkins for wheel support + * + * * 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 diff -c gpm-cvstree.orig/gpmInt.h gpm-cvstree/gpmInt.h *** gpm-cvstree.orig/gpmInt.h Tue Jan 4 18:11:25 2000 --- gpm-cvstree/gpmInt.h Mon Feb 14 18:32:35 2000 *************** *** 4,9 **** --- 4,12 ---- * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 *************** *** 64,69 **** --- 67,73 ---- int howmany; /* howmany bytes to read at a time */ int getextra; /* does it get an extra byte? (only mouseman) */ int absolute; /* flag indicating absolute pointing device */ + int wheel; /* flag for wheel mice */ int (*repeat_fun)(Gpm_Event *state, int fd); /* repeat this event into fd */ /* itz Mon Jan 11 23:27:54 PST 1999 */ *************** *** 87,92 **** --- 91,97 ---- char *opt_type, *opt_dev, *opt_sequence; int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_glidepoint_tap; + int opt_wheel; char *opt_options; /* extra textual configuration */ Gpm_Type *m_type; int fd; *************** *** 109,114 **** --- 114,120 ---- #define opt_time (which_mouse->opt_time) #define opt_cluster (which_mouse->opt_cluster) #define opt_three (which_mouse->opt_three) + #define opt_wheel (which_mouse->opt_wheel) #define opt_glidepoint_tap (which_mouse->opt_glidepoint_tap) #define opt_options (which_mouse->opt_options) *************** *** 121,134 **** extern char *opt_lut; extern int opt_test, opt_ptrdrag; extern int opt_kill; ! extern int opt_repeater, opt_double; extern char* opt_repeater_type; extern int opt_kernel, opt_explicittype; extern int opt_aged; extern time_t opt_age_limit; extern char *opt_special; extern int opt_rawrep; ! extern int fifofd; extern char *consolename; /* the selected one */ extern Gpm_Type *repeated_type; --- 127,141 ---- extern char *opt_lut; extern int opt_test, opt_ptrdrag; extern int opt_kill; ! extern int opt_repeater, opt_wheel_repeater, opt_double; ! extern int opt_wheel_swap; extern char* opt_repeater_type; extern int opt_kernel, opt_explicittype; extern int opt_aged; extern time_t opt_age_limit; extern char *opt_special; extern int opt_rawrep; ! extern int fifofd, wheel_fifofd; extern char *consolename; /* the selected one */ extern Gpm_Type *repeated_type; diff -c gpm-cvstree.orig/gpn.c gpm-cvstree/gpn.c *** gpm-cvstree.orig/gpn.c Fri Jan 14 01:11:05 2000 --- gpm-cvstree/gpn.c Mon Feb 14 18:28:31 2000 *************** *** 8,13 **** --- 8,16 ---- * Tue, 5 Jan 1999 23:26:10 +0000, modified by James Troup * (usage): typo (s/an unexistent/a non-existent/) * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 *************** *** 187,192 **** --- 190,196 ---- " -A [limit] start with selection disabled (`aged')\n" " -b baud-rate sets the baud rate (default %d)\n" " -B sequence allows changing the buttons (default '%s')\n" + " wheel Swap direction of wheel rotation\n" " -d delta sets the delta value (default %d) (must be 2 or more)\n" " -D debug mode: don't auto-background\n" " -g tap-button sets the button (1-3) that is emulated by tapping on\n" *************** *** 210,216 **** " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" ! " -V verbosity increase number of logged messages\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; --- 214,222 ---- " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" ! " -V verbosity increase number of logged messages\n" ! " -w activate wheel\n" ! " -W activate wheel repeater\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; *************** *** 319,325 **** int cmdline(int argc, char **argv) { ! char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, --- 325,331 ---- int cmdline(int argc, char **argv) { ! char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvVwW::23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, *************** *** 349,355 **** if (optarg) opt_age_limit = atoi(optarg); break; case 'b': opt_baud = atoi(optarg); break; ! case 'B': opt_sequence = optarg; break; case 'd': opt_delta = atoi(optarg); break; case 'D': gpm_log_daemon = 0; break; case 'g': --- 355,367 ---- if (optarg) opt_age_limit = atoi(optarg); break; case 'b': opt_baud = atoi(optarg); break; ! case 'B': { ! if (0==strncmp(optarg,"wheel",1)) ! { opt_wheel_swap=1; } ! else ! { opt_sequence = optarg; } ! break; ! } case 'd': opt_delta = atoi(optarg); break; case 'D': gpm_log_daemon = 0; break; case 'g': *************** *** 395,400 **** --- 407,414 ---- case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); break; + case 'w': opt_wheel=1; break; + case 'W': opt_wheel_repeater=1; break; case '2': opt_three=-1; break; case '3': opt_three=1; break; default: *************** *** 416,422 **** if ((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK))<0) { oops(GPM_NODE_FIFO); } } ! /* duplicate initialization */ --- 430,442 ---- if ((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK))<0) { oops(GPM_NODE_FIFO); } } ! if (opt_wheel_repeater) ! { ! if (mkfifo(GPM_WHEEL_FIFO,0666) && errno!=EEXIST) ! oops(GPM_WHEEL_FIFO); ! if ((wheel_fifofd=open(GPM_WHEEL_FIFO, O_RDWR|O_NONBLOCK))<0) ! oops(GPM_WHEEL_FIFO); ! } /* duplicate initialization */ diff -c gpm-cvstree.orig/liblow.c gpm-cvstree/liblow.c *** gpm-cvstree.orig/liblow.c Thu Jan 27 23:19:29 2000 --- gpm-cvstree/liblow.c Mon Feb 14 18:28:31 2000 *************** *** 5,10 **** --- 5,13 ---- * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * xterm management is mostly by jtklehto@stekt.oulu.fi (Janne Kukonlehto) * * This program is free software; you can redistribute it and/or modify *************** *** 632,637 **** --- 635,642 ---- case 0: ePtr->buttons=GPM_B_LEFT; break; case 1: ePtr->buttons=GPM_B_MIDDLE; break; case 2: ePtr->buttons=GPM_B_RIGHT; break; + case 3: ePtr->buttons=GPM_B_UP; break; + case 4: ePtr->buttons=GPM_B_DOWN; break; default: /* Nothing */ break; } } diff -c gpm-cvstree.orig/mev.c gpm-cvstree/mev.c *** gpm-cvstree.orig/mev.c Tue Jan 18 06:10:30 2000 --- gpm-cvstree/mev.c Mon Feb 14 18:28:31 2000 *************** *** 4,9 **** --- 4,12 ---- * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 diff -c gpm-cvstree.orig/mice.c gpm-cvstree/mice.c *** gpm-cvstree.orig/mice.c Tue Feb 8 00:13:02 2000 --- gpm-cvstree/mice.c Mon Feb 14 18:40:23 2000 *************** *** 6,11 **** --- 6,14 ---- * Copyright (C) 1994-2000 Alessandro Rubini * Copyright (C) 1998,1999 Ian Zimmerman * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 *************** *** 48,53 **** --- 51,57 ---- #include #include #include + #include #include #include #include *************** *** 364,369 **** --- 368,377 ---- | ((data[0] & 0x10) >> 4); /* right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + if ((data[3] & 0x0f) == 0xf) + state->buttons |= GPM_B_UP; + else if ((data[3] & 0x0f) == 0x1) + state->buttons |= GPM_B_DOWN; /* wheel (dz??) is (data[3] & 0x0f) */ return 0; *************** *** 469,482 **** static int tap_active=0; /* there exist glidepoint ps2 mice */ state->buttons= ! !!(data[0]&1) * GPM_B_LEFT + ! !!(data[0]&2) * GPM_B_RIGHT + ! !!(data[0]&4) * GPM_B_MIDDLE; ! if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ state->buttons = tap_active = opt_glidepoint_tap; else if (tap_active) ! if (data[0]==8) state->buttons = tap_active = 0; else state->buttons = tap_active; --- 477,500 ---- static int tap_active=0; /* there exist glidepoint ps2 mice */ state->buttons= ! !!(data[0]&1) * GPM_B_LEFT | ! !!(data[0]&2) * GPM_B_RIGHT | ! !!(data[0]&4) * GPM_B_MIDDLE| ! ((data[3]==0xff)?GPM_B_UP:0) | ! ((data[3]==0x01)?GPM_B_DOWN:0); ! #if 0 ! LOG(("Buttons: %d %d %d %d %d\n", ! (state->buttons&GPM_B_LEFT), ! (state->buttons&GPM_B_MIDDLE), ! (state->buttons&GPM_B_RIGHT), ! (state->buttons&GPM_B_UP), ! (state->buttons&GPM_B_DOWN))); ! LOG(("wheel? %d\n",opt_wheel)); ! #endif if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ state->buttons = tap_active = opt_glidepoint_tap; else if (tap_active) ! if (data[0]==8 && !opt_wheel) state->buttons = tap_active = 0; else state->buttons = tap_active; *************** *** 540,568 **** struct Gpm_Type *type, int argc, char **argv) { unsigned char magic[6] = { 0xe8, 0x03, 0xe6, 0xe6, 0xe6, 0xe9 }; ! int i; ! ! if (check_no_argv(argc, argv)) return NULL; ! for (i=0; i<6; i++) { ! unsigned char c = 0; ! write( fd, magic+i, 1 ); ! read( fd, &c, 1 ); ! if (c != 0xfa) { ! fprintf( stderr, "netmouse: No acknowledge (got %d)\n", c ); ! return NULL; } } ! { ! unsigned char rep[3] = { 0, 0, 0 }; ! read( fd, rep, 1 ); ! read( fd, rep+1, 1 ); ! read( fd, rep+2, 1 ); ! if (rep[0] || (rep[1] != 0x33) || (rep[2] != 0x55)) { ! fprintf( stderr, "netmouse: Invalid reply magic (got %d,%d,%d)\n", rep[0], rep[1], rep[2] ); ! return NULL; } } ! return type; } #define GPM_B_BOTH (GPM_B_LEFT|GPM_B_RIGHT) --- 558,688 ---- struct Gpm_Type *type, int argc, char **argv) { unsigned char magic[6] = { 0xe8, 0x03, 0xe6, 0xe6, 0xe6, 0xe9 }; ! int i,j,k; ! /* Sometimes is mouse in bad state and first initialization may fail. ! Do it 3*6 times. ! */ ! k=3; ! while (k>0) ! { i=0; j=6; ! while (i<6) { ! unsigned char c = 0; ! write( fd, magic+i, 1 ); ! read( fd, &c, 1 ); ! if (c != 0xfa) { ! if ((j--)==0) ! { fprintf( stderr, "netmouse: No acknowledge (got %d/%d)\n", c, i); ! return NULL; ! } ! else ! { i=0; } ! } ! else ! { i++; } ! } ! { ! unsigned char rep[3] = { 0, 0, 0 }; ! read( fd, rep, 1 ); ! read( fd, rep+1, 1 ); ! read( fd, rep+2, 1 ); ! if (rep[0] || (rep[1] != 0x33) || (rep[2] != 0x55)) { ! if (k==1) ! { fprintf( stderr, "netmouse: Invalid reply magic (got %d,%d,%d)\n", rep[0], rep[1], rep[2] ); ! return NULL; ! } ! else ! { k--; } ! } ! else ! { return type; } } } ! return NULL; ! } ! ! static int M_netmousepro(Gpm_Event *state, unsigned char *data) ! { ! /* Avoid this beasts if you can. They connect to normal PS/2 port, ! but their protocol is one byte longer... So if you have notebook ! (like me) with internal PS/2 mouse, it will not work ! together. They have four buttons, but two middle buttons can not ! be pressed simultaneously, and two middle buttons do not send ! 'up' events (however, they autorepeat...) ! ! Still, you might want to run this mouse in plain PS/2 mode - ! where it behaves correctly except that middle 2 buttons do ! nothing. ! ! Protocol is ! 3 bytes like normal PS/2 ! 4th byte: 0xff button 'down', 0x01 button 'up' ! [this is so braindamaged that it *must* be some kind of ! compatibility glue...] ! ! Pavel Machek ! */ ! ! state->buttons= ! !!(data[0]&1) * GPM_B_LEFT + ! !!(data[0]&2) * GPM_B_RIGHT + ! !!(data[0]&4) * GPM_B_MIDDLE; ! if (data[3]==0x01) { state->buttons |= GPM_B_DOWN; } ! if (data[3]==0xff) { state->buttons |= GPM_B_UP; } ! ! if(data[1] != 0) ! state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; ! else ! state->dx = 0; ! if(data[2] != 0) ! state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); ! else ! state->dy = 0; ! return 0; ! } ! ! static Gpm_Type *I_netmousepro(int fd, unsigned short flags, struct Gpm_Type *type) ! { ! unsigned char magic[6] = { 0xe8, 0x03, 0xe6, 0xe6, 0xe6, 0xe9 }; ! int i,j,k; ! /* Sometimes is mouse in bad state and first initialization may fail. ! Do it 3*6 times. ! */ ! k=3; ! while (k>0) ! { i=0; j=6; ! while (i<6) { ! unsigned char c = 0; ! write( fd, magic+i, 1 ); ! read( fd, &c, 1 ); ! if (c != 0xfa) { ! if ((j--)==0) ! { fprintf( stderr, "netmouse: No acknowledge (got %d/%d)\n", c, i); ! return NULL; ! } ! else ! { i=0; } ! } ! else ! { i++; } ! } ! { ! unsigned char rep[3] = { 0, 0, 0 }; ! read( fd, rep, 1 ); ! read( fd, rep+1, 1 ); ! read( fd, rep+2, 1 ); ! if (rep[0] || (rep[1] != 0x33) || (rep[2] != 0x55)) { ! if (k==1) ! { fprintf( stderr, "netmouse: Invalid reply magic (got %d,%d,%d)\n", rep[0], rep[1], rep[2] ); ! return NULL; ! } ! else ! { k--; } ! } ! else ! { return type; } } } ! return NULL; } #define GPM_B_BOTH (GPM_B_LEFT|GPM_B_RIGHT) *************** *** 810,816 **** } - /* ncr pen support (Marc Meis) */ #define NCR_LEFT_X 40 --- 930,935 ---- *************** *** 1634,1639 **** --- 1753,1759 ---- write (fd, s2, sizeof (s2)); usleep (30000); tcflush (fd, TCIFLUSH); + opt_wheel=type->wheel; return type; } *************** *** 1772,1777 **** --- 1892,1898 ---- struct Gpm_Type *type, int argc, char **argv) { struct termios tty; + char *c; /* Set speed to 9600bps (copied from I_summa, above :) */ tcgetattr(fd, &tty); *************** *** 1945,2051 **** Gpm_Type mice[]={ {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0}, {"ms", "The original ms protocol, with a middle-button extension.", "", M_ms, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"ms+", "Like 'ms', but allows dragging with the middle button.", "", M_ms_plus, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).", "", M_ms_plus_lr, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.", "Microsoft", M_bare, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.", "MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG, ! {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc}, {"sun", "'msc' protocol, but only 3 bytes per packet.", "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, ! {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, ! {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, {"logi", "Used in some Logitech devices (only serial).", "Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG, ! {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0}, {"bm", "Micro$oft busmice and compatible devices.", "BusMouse", M_bm, I_empty, STD_FLG, /* bm is sun */ ! {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, {"ps2", "Busmice of the ps/2 series. Most busmice, actually.", "PS/2", M_ps2, I_empty, STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"ncr", "Ncr3125pen, found on some laptops", "", M_ncr, NULL, STD_FLG, ! {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0}, {"wacom","Wacom Protocol IV Tablets: Pen+Mouse, relative+absolute mode", "", M_wacom, I_wacom, STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 7, 1, 0, 0, 0}, {"genitizer", "\"Genitizer\" tablet, in relative mode.", "", M_geni, I_serial, CS8|PARENB|PARODD, ! {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"logim", "Turn logitech into Mouse-Systems-Compatible.", "", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG, ! {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0}, {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", "", M_ps2, I_imps2, STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, ! {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, {"netmouse", "Genius NetMouse - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"cal", "Calcomp UltraSlate", "", M_calus, I_calus, CS8 | CSTOPB | STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0}, {"calr", "Calcomp UltraSlate - relative mode", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0}, {"twid", "Twidddler keyboard", "", M_twid, I_twid, CS8 | STD_FLG, ! {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0}, {"syn", "The \"Synaptics\" serial TouchPad.", "synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0}, {"synps2", "The \"Synaptics\" PS/2 TouchPad", "synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG, ! {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0}, {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", "", M_brw, I_pnp, CS7 | STD_FLG, ! {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, #ifdef HAVE_LINUX_JOYSTICK_H {"js", "Joystick mouse emulation", "Joystick", M_js, NULL, 0, ! {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0}, #endif {"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)", "", M_summa, I_summa, STD_FLG, ! {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_summa}, {"mtouch", "MicroTouch touch-screens (only button-1 events, by now)", "", M_mtouch, I_mtouch, STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL}, {"gunze", "Gunze touch-screens (only button-1 events, by now)", "", M_gunze, I_gunze, STD_FLG, ! {0xF9, 0x50, 0xF0, 0x30}, 11, 1, 0, 1, NULL}, ! {"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)", "", M_summa, I_summa, STD_FLG, ! {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0}, ! {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, ! {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, ! {"", "", "", NULL, NULL, 0, ! {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} }; /*------------------------------------------------------------------------*/ --- 2066,2172 ---- Gpm_Type mice[]={ {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0, NULL}, {"ms", "The original ms protocol, with a middle-button extension.", "", M_ms, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, NULL}, {"ms+", "Like 'ms', but allows dragging with the middle button.", "", M_ms_plus, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, NULL}, {"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).", "", M_ms_plus_lr, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, NULL}, {"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.", "Microsoft", M_bare, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, NULL}, {"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.", "MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG, ! {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0, R_msc}, {"sun", "'msc' protocol, but only 3 bytes per packet.", "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, ! {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, NULL}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, ! {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0, NULL}, {"logi", "Used in some Logitech devices (only serial).", "Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG, ! {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0, NULL}, {"bm", "Micro$oft busmice and compatible devices.", "BusMouse", M_bm, I_empty, STD_FLG, /* bm is sun */ ! {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0, NULL}, {"ps2", "Busmice of the ps/2 series. Most busmice, actually.", "PS/2", M_ps2, I_empty, STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0, NULL}, {"ncr", "Ncr3125pen, found on some laptops", "", M_ncr, NULL, STD_FLG, ! {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0, NULL}, {"wacom","Wacom Protocol IV Tablets: Pen+Mouse, relative+absolute mode", "", M_wacom, I_wacom, STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 7, 1, 0, 0, 0, NULL}, {"genitizer", "\"Genitizer\" tablet, in relative mode.", "", M_geni, I_serial, CS8|PARENB|PARODD, ! {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, NULL}, {"logim", "Turn logitech into Mouse-Systems-Compatible.", "", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG, ! {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0, NULL}, {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, NULL}, {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", "", M_ps2, I_imps2, STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 1, NULL}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, ! {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 1, NULL}, {"netmouse", "Genius NetMouse - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, NULL}, ! {"netmousepro", "Genius NetMouse Pro - 3 buttons and 2 buttons up/down like wheel.", ! "", M_netmousepro, I_netmousepro, CS7 | STD_FLG, ! {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 1, NULL}, {"cal", "Calcomp UltraSlate", "", M_calus, I_calus, CS8 | CSTOPB | STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0, NULL}, {"calr", "Calcomp UltraSlate - relative mode", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0, NULL}, {"twid", "Twidddler keyboard", "", M_twid, I_twid, CS8 | STD_FLG, ! {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0, NULL}, {"syn", "The \"Synaptics\" serial TouchPad.", "synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG, ! {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0, NULL}, {"synps2", "The \"Synaptics\" PS/2 TouchPad", "synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG, ! {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0, NULL}, {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", "", M_brw, I_pnp, CS7 | STD_FLG, ! {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0, NULL}, #ifdef HAVE_LINUX_JOYSTICK_H {"js", "Joystick mouse emulation", "Joystick", M_js, NULL, 0, ! {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0, NULL}, #endif {"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)", "", M_summa, I_summa, STD_FLG, ! {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, 0, R_summa}, {"mtouch", "MicroTouch touch-screens (only button-1 events, by now)", "", M_mtouch, I_mtouch, STD_FLG, ! {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, 0, NULL}, {"gunze", "Gunze touch-screens (only button-1 events, by now)", "", M_gunze, I_gunze, STD_FLG, ! {0xF9, 0x50, 0xF0, 0x30}, 11, 1, 0, 1, 0, NULL}, {"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)", "", M_summa, I_summa, STD_FLG, ! {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0, NULL}, {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, ! {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0, NULL}, {"", "", "", NULL, NULL, 0, ! {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0, NULL} }; /*------------------------------------------------------------------------*/ diff -c gpm-cvstree.orig/mouse-test.c gpm-cvstree/mouse-test.c *** gpm-cvstree.orig/mouse-test.c Tue Jan 18 06:10:30 2000 --- gpm-cvstree/mouse-test.c Mon Feb 14 18:40:36 2000 *************** *** 10,15 **** --- 10,18 ---- * where watchdog is used. Reported by Jim Studt * [Debian bug report #22602] * + * Modified on 9/8/1998 by Jonathan Atkins for use with wheel mice + * + * * 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 *************** *** 42,47 **** --- 45,51 ---- #include #include + #define NO_DEBUG #include "gpmInt.h" /* to get mouse types */ #ifndef min *************** *** 56,62 **** DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, (char *)NULL /* extra */, ! (Gpm_Type *)NULL }; /* and this is a workaroud */ --- 60,66 ---- DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, (char *)NULL /* extra */, ! (int)(Gpm_Type *)NULL }; /* and this is a workaroud */ Common subdirectories: gpm-cvstree.orig/sample and gpm-cvstree/sample Common subdirectories: gpm-cvstree.orig/tools and gpm-cvstree/tools gpm-1.20.4/patches/todo/imwheel/imwheel_new.patch010060000017500001750000000646650760216311400206070ustar00niconico00diff -r -u gpm-1.19.3.original/doc/doc.gpm gpm-1.19.3/doc/doc.gpm --- gpm-1.19.3.original/doc/doc.gpm Tue Jul 18 22:43:18 2000 +++ gpm-1.19.3/doc/doc.gpm Mon Sep 25 07:51:52 2000 @@ -911,8 +911,26 @@ of them is active at a time, to allow using @code{switch} on the value. Vertical outrun takes precedence on horizontal outrun. @xref{Margins}. + +@item short w; /* Extended element */ + Wheel position. It is not checked on an overflow, and therefore + using dw is prefered. Another way of wheel processing is provided + by FWHEEL and BWHEEL event types. These events types must be disabled, + if wheel position is processed in an application. + +@item short dw; /* Extended element */ + Wheel displacement after last event reading. + +@item char pad[40]; /* Extended element */ + Reserved for future use. + @end table +Extended elements are available for an event handler, Gpm_GetEventExt +and Gpm_GetSnapshotExt, while after Gpm_GetEvent or Gpm_GetSnapshot +their values are unpredictable. Check if @code{GPM_EVENT_EXT} is +defined before using extended elements in an application. + %========================================================================== @node Margins, Event Types, Events, Gpm Internals @section How margins are managed @@ -969,6 +987,13 @@ @item GPM_LEAVE This is only delivered by the high level library, too. Events of type @code{GPM_LEAVE} have all other fields undefined. +@item GPM_FWHEEL + Wheel turned 1 notch forward (toward the user). Turning a wheel more + than one notch will produce additional GPM_FWHEEL events. This is an + extended type - you need to put '#ifdef GPM_FWHEEL' before + using the type in your code. +@item GPM_BWHEEL + Same as GPM_FWHEEL but for turning the wheel back. @end table Cooked events are the following: @@ -1022,10 +1047,15 @@ @table @code @item eventMask - A bitmask of the events the client wants - to receive. Both bare and cooked events are - allowed to appear in the mask. - + A bitmask of the events the client wants to receive. + Both bare and cooked events are allowed to appear in the mask. + In particular, GPM_FWHEEL and GPM_BWHEEL can be disabled by + omitting the masks: + + Gpm_Connect conn; + /* Enable all events, except GPM_FWHEEL and GPM_BWHEEL + conn.eventMask = ~(GPM_FWHEEL | GPM_BWHEEL); + @item defaultMask A mask to tell which events allow a default treatment (the selection one). These are mouse events, @@ -1366,8 +1396,28 @@ failure, and 0 after closing the connection. Failure can happen if a signal interrupted the read system call. This function doesn't work with xterm mouse reporting and is meant for internal use by the library. + +This function does not return the extended part. @end deftypefun +@deftypefun int Gpm_GetEventExt (Gpm_Event *@var{event}); +As Gpm_GetEvent, but returns extended part. For backward compatibility +the application should check @code{GPM_EVENT_EXT}, as given by the following +example: +@table @code + int dw, w, result; + Gpm_Event mevnt; + +#ifdef GPM_EVENT_EXT + result = Gpm_GetEventExt(&mevnt); + w = mevnt.w; dw = nevnt.dw; +#else + result = Gpm_GetEvent(&mevnt); + w = dw = 0; +#endif +@end table +@end deftypefun + %......................................................................... @deftypefun int Gpm_CharsQueued (void); @@ -1512,8 +1562,14 @@ events, and applications usually don't want to lose events, the function returns 0 if the input queue is not empty. +The functions does not return the extended part. @end deftypefun +@deftypefun int Gpm_GetSnapshotExt (Gpm_Event *@var{event}); +As Gpm_GetSnapshot, but returns extended part. For backward compatibility +the application should check whether @code{GPM_EVENT_EXT} has been defined. + +@end deftypefun %-------------------------------------------------------------------------- @node High Level Lib, Xterm, Low Level Library, The ClientLib diff -r -u gpm-1.19.3.original/gpm.c gpm-1.19.3/gpm.c --- gpm-1.19.3.original/gpm.c Tue Jul 18 22:06:06 2000 +++ gpm-1.19.3/gpm.c Mon Sep 25 07:02:20 2000 @@ -4,6 +4,8 @@ * Copyright (C) 1993 Andreq Haylett * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998 Ian Zimmerman + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -61,6 +63,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, + DEF_SIMWHEEL, (char *)NULL /* extra */, (Gpm_Type *)NULL }, @@ -384,7 +387,7 @@ } -static int statusX,statusY,statusB; /* to return info */ +static int statusX,statusY,statusW,statusB; /* to return info */ static int statusC=0; /* clicks */ void get_console_size(Gpm_Event *ePtr); @@ -401,6 +404,7 @@ static struct timeval timeout={0,0}; fd_set fdSet; static int newB=0, oldB=0, oldT=0; /* old buttons and Type to chain events */ + static Gpm_Cinfo *ci; /* static int buttonlock, buttonlockflag; */ #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) @@ -409,6 +413,7 @@ oldT=event->type; + memset (event->pad, '\0', GPM_EVENT_PAD_SIZE * sizeof(int)); if (eventFlag) { @@ -425,13 +430,14 @@ } else { - event->dx=event->dy=0; + event->dx=event->dy=event->dw=0; nEvent.modifiers = 0; /* some mice set them */ FD_ZERO(&fdSet); FD_SET(fd,&fdSet); i=0; do /* cluster loop */ { + nEvent.dx=nEvent.dy=nEvent.dw=0; if ( ((data=getMouseData(fd,m_type,kd_mode))==NULL) || ((*(m_type->fun))(&nEvent,data)==-1) ) { @@ -439,6 +445,12 @@ else break; } + if (which_mouse->opt_simwheel && (nEvent.buttons & GPM_B_MIDDLE) && nEvent.dy) { + nEvent.buttons &= !GPM_B_MIDDLE; + nEvent.dw = nEvent.dy; + nEvent.dy = 0; + } + event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ @@ -461,6 +473,7 @@ /* increment the reported dx,dy */ event->dx+=nEvent.dx; event->dy+=nEvent.dy; + event->dw+=nEvent.dw; } else /* a pen */ { @@ -490,7 +503,7 @@ static struct timeval rept1,rept2; gettimeofday(&rept2, (struct timezone *)NULL); if (((rept2.tv_sec -rept1.tv_sec) *1000+(rept2.tv_usec-rept1.tv_usec)/1000)>250) - { event->dx=0; event->dy=0; } + { event->dx=0; event->dy=0; event->dw=0; } rept1=rept2; event->dy=event->dy*((win.ws_col/win.ws_row)+1); @@ -512,7 +525,7 @@ fine_dx %= opt_scale; fine_dy %= opt_scaley; } - if (!event->dx && !event->dy && (event->buttons==oldB)) + if (!event->dx && !event->dy && !event->dw && (event->buttons==oldB)) do { /* so to break */ static long awaketime; @@ -528,7 +541,7 @@ /*....................................... fill missing fields */ - event->x+=event->dx, event->y+=event->dy; + event->x+=event->dx; event->y+=event->dy; event->w+=event->dw; statusB=event->buttons; i=open_console(O_RDONLY); @@ -559,6 +572,21 @@ else event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP); + ci = cinfo[stat.v_active]; + if (ci != NULL) + { + i = (ci->data).eventMask; + if (event->w > 0 && (i & GPM_FWHEEL)) + { + event->type |= GPM_FWHEEL; (event->w)--; + } + else + if (event->w < 0 && (i & GPM_BWHEEL)) + { + event->type |= GPM_BWHEEL; (event->w)++; + } + } + switch(event->type) /* now provide the cooked bits */ { case GPM_DOWN: @@ -583,6 +611,7 @@ case GPM_MOVE: statusC=0; + default: break; } @@ -619,7 +648,7 @@ event->clicks); /* update the global state */ - statusX=event->x; statusY=event->y; + statusX=event->x; statusY=event->y; statusW=event->w; if (opt_special && event->type & GPM_DOWN) return processSpecial(event); @@ -733,8 +762,8 @@ oops("get_shift_state"); close(i); event.vc = stat.v_active; - event.x=statusX; event.y=statusY; - event.dx=maxx; event.dy=maxy; + event.x=statusX; event.y=statusY; event.w=statusW; + event.dx=maxx; event.dy=maxy; event.buttons= statusB; event.clicks=statusC; /* fall through */ @@ -869,7 +898,7 @@ /* if the client gets motions, give it the current position */ if(request->eventMask & GPM_MOVE) { - Gpm_Event event={0,0,vc,0,0,statusX,statusY,GPM_MOVE,0,0}; + Gpm_Event event={0,0,vc,0,0,statusX,statusY,GPM_MOVE,0,0,0,statusW}; do_client(info, &event); } @@ -899,6 +928,7 @@ if (!prevmaxx) { /* first invocation, place the pointer in the middle */ statusX = ePtr->x = maxx/2; statusY = ePtr->y = maxy/2; + statusW = ePtr->w = 0; } else { /* keep the pointer in the same position where it was */ statusX = ePtr->x = ePtr->x * maxx / prevmaxx; statusY = ePtr->y = ePtr->y * maxy / prevmaxy; diff -r -u gpm-1.19.3.original/gpm.h gpm-1.19.3/gpm.h --- gpm-1.19.3.original/gpm.h Fri Jan 28 09:09:00 2000 +++ gpm-1.19.3/gpm.h Mon Sep 25 07:02:29 2000 @@ -3,6 +3,8 @@ * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -84,8 +86,6 @@ GPM_DOWN=4, GPM_UP= 8, -#define GPM_BARE_EVENTS(type) ((type)&(0x0f|GPM_ENTER|GPM_LEAVE)) - GPM_SINGLE=16, /* at most one in three is set */ GPM_DOUBLE=32, GPM_TRIPLE=64, /* WARNING: I depend on the values */ @@ -98,6 +98,11 @@ GPM_LEAVE=1024 /* leave event, used in Roi's */ }; +#define GPM_FWHEEL 4096 /* wheel move forward - M.G. 2000/09/24 */ +#define GPM_BWHEEL 8192 /* wheel move backward - M.G. 2000/09/24 */ + +#define GPM_BARE_EVENTS(type) ((type)&(0x0f|GPM_ENTER|GPM_LEAVE|GPM_FWHEEL|GPM_BWHEEL)) + #define Gpm_StrictSingle(type) (((type)&GPM_SINGLE) && !((type)&GPM_MFLAG)) #define Gpm_AnySingle(type) ((type)&GPM_SINGLE) #define Gpm_StrictDouble(type) (((type)&GPM_DOUBLE) && !((type)&GPM_MFLAG)) @@ -111,6 +116,19 @@ /*....................................... The reported event */ +#define GPM_EVENT_EXT + +typedef struct Gpm_EventOld { + unsigned char buttons, modifiers; /* try to be a multiple of 4 */ + unsigned short vc; + short dx, dy, x, y; + enum Gpm_Etype type; + int clicks; + enum Gpm_Margin margin; +} Gpm_EventOld; + +#define GPM_EVENT_PAD_SIZE 20 /* Should be enough for now */ + typedef struct Gpm_Event { unsigned char buttons, modifiers; /* try to be a multiple of 4 */ unsigned short vc; @@ -118,6 +136,8 @@ enum Gpm_Etype type; int clicks; enum Gpm_Margin margin; + short dw, w; /* M.G. 2000/09/24 */ + int pad[GPM_EVENT_PAD_SIZE]; /* M.G. 2000/09/24 */ } Gpm_Event; /*....................................... The handling function */ @@ -181,6 +201,7 @@ extern int Gpm_Open(Gpm_Connect *, int); extern int Gpm_Close(void); extern int Gpm_GetEvent(Gpm_Event *); +extern int Gpm_GetEventExt(Gpm_Event *); extern int Gpm_CharsQueued(void); extern int Gpm_Getc(FILE *); #define Gpm_Getchar() Gpm_Getc(stdin) @@ -246,6 +267,7 @@ char *Gpm_GetLibVersion(int *where); char *Gpm_GetServerVersion(int *where); int Gpm_GetSnapshot(Gpm_Event *ePtr); +int Gpm_GetSnapshotExt(Gpm_Event *ePtr); #ifdef __cplusplus }; diff -r -u gpm-1.19.3.original/gpmCfg.h gpm-1.19.3/gpmCfg.h --- gpm-1.19.3.original/gpmCfg.h Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3/gpmCfg.h Thu Sep 21 20:42:12 2000 @@ -62,5 +62,7 @@ #define DEF_TEST 0 #define DEF_PTRDRAG 1 /* double or triple click */ #define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */ +#define DEF_SIMWHEEL 0 /* simulate wheel with middle button and */ + /* y-axis movement */ #endif /* _GPMCFG_INCLUDED */ diff -r -u gpm-1.19.3.original/gpmInt.h gpm-1.19.3/gpmInt.h --- gpm-1.19.3.original/gpmInt.h Tue Jul 18 22:18:54 2000 +++ gpm-1.19.3/gpmInt.h Fri Sep 22 08:00:56 2000 @@ -88,6 +88,7 @@ char *opt_type, *opt_dev, *opt_sequence; int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_glidepoint_tap; + int opt_simwheel; char *opt_options; /* extra textual configuration */ Gpm_Type *m_type; int fd; diff -r -u gpm-1.19.3.original/gpn.c gpm-1.19.3/gpn.c --- gpm-1.19.3.original/gpn.c Tue Jul 18 22:06:06 2000 +++ gpm-1.19.3/gpn.c Thu Sep 21 20:53:38 2000 @@ -177,7 +177,9 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" - " -V verbosity increase number of logged messages\n", + " -V verbosity increase number of logged messages\n" + " -w simulate wheel operation by pressing middle\n" + " mouse button and y-axis movement\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; @@ -286,7 +288,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::w23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -359,6 +361,9 @@ case 'v': printf(GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); exit(0); case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); + break; + case 'w': + which_mouse->opt_simwheel=1; break; case '2': opt_three=-1; break; case '3': opt_three=1; break; Only in gpm-1.19.3: install diff -r -u gpm-1.19.3.original/liblow.c gpm-1.19.3/liblow.c --- gpm-1.19.3.original/liblow.c Tue Jul 18 22:06:06 2000 +++ gpm-1.19.3/liblow.c Mon Sep 25 07:03:30 2000 @@ -6,6 +6,8 @@ * Copyright (C) 1998 Ian Zimmerman * * xterm management is mostly by jtklehto@stekt.oulu.fi (Janne Kukonlehto) + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -72,6 +74,7 @@ void *gpm_data=NULL; int gpm_zerobased=0; int gpm_visiblepointer=0; +int gpm_supply_dw = 0; int gpm_mx, gpm_my; /* max x and y (1-based) to fit margins */ unsigned char _gpm_buf[6*sizeof(short)]; @@ -400,7 +403,7 @@ } /*-------------------------------------------------------------------*/ -int Gpm_GetEvent(Gpm_Event *event) +int Gpm_GetEventExt(Gpm_Event *event) { int count; MAGIC_P((int magic)); @@ -408,6 +411,7 @@ if (!gpm_flag) return 0; #ifdef GPM_USE_MAGIC + if ((count=read(gpm_fd,&magic,sizeof(int)))!=sizeof(int)) { if (count==0) @@ -421,7 +425,7 @@ } #endif - if ((count=read(gpm_fd,event,sizeof(Gpm_Event)))!=sizeof(Gpm_Event)) + if ((count=read(gpm_fd,event,sizeof(Gpm_Event))) != sizeof(Gpm_Event)) { #ifndef GPM_USE_MAGIC if (count==0) @@ -442,10 +446,20 @@ return -1; } + event->x -= gpm_zerobased; event->y -= gpm_zerobased; return 1; +} + +int Gpm_GetEvent(Gpm_Event *event) +{ Gpm_Event tmp_event; + int rc; + rc = Gpm_GetEventExt(&tmp_event); + if (event != NULL) + memcpy(event, &tmp_event, sizeof(Gpm_EventOld)); + return rc; } diff -r -u gpm-1.19.3.original/libxtra.c gpm-1.19.3/libxtra.c --- gpm-1.19.3.original/libxtra.c Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3/libxtra.c Mon Sep 25 07:03:53 2000 @@ -5,6 +5,8 @@ * Copyright (C) 1998 Ian Zimmerman * * xterm management is mostly by Miguel de Icaza + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -87,14 +89,14 @@ * The return value is the number of buttons, as known to the server, * the ePtr, if any, is filled with information on the current state. */ -int Gpm_GetSnapshot(Gpm_Event *ePtr) +int Gpm_GetSnapshotExt(Gpm_Event *ePtr) { Gpm_Connect conn; Gpm_Event event; fd_set sillySet; struct timeval to={0,0}; int i; - + if (!gpm_ver_i) { if (0 == Gpm_GetServerVersion(NULL)) { @@ -129,14 +131,25 @@ return 0; write(gpm_fd,&conn,sizeof(Gpm_Connect)); - if ((i=Gpm_GetEvent(ePtr))!=1) - return -1; + if (Gpm_GetEventExt(ePtr)!=1) return -1; i=ePtr->type; ePtr->type=0; return i; /* number of buttons */ } + +int Gpm_GetSnapshot(Gpm_Event *ePtr) +{ + int rc; + Gpm_Event eTmp; + rc = Gpm_GetSnapshotExt(&eTmp); + if (ePtr) + memcpy(ePtr, &eTmp, sizeof(Gpm_EventOld)); + return rc; + +} /* Local Variables: */ /* c-indent-level: 2 */ /* End: */ + diff -r -u gpm-1.19.3.original/mev.c gpm-1.19.3/mev.c --- gpm-1.19.3.original/mev.c Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3/mev.c Fri Sep 22 00:40:36 2000 @@ -94,11 +94,11 @@ { if (opt_fit) Gpm_FitEvent(event); - printf("mouse: event 0x%02X, at %2i,%2i (delta %2i,%2i), " + printf("mouse: event 0x%02X, at %2i,%2i (delta %2i,%2i,%2i), " "buttons %i, modifiers 0x%02X\r\n", event->type, event->x, event->y, - event->dx, event->dy, + event->dx, event->dy, event->dw, event->buttons, event->modifiers); if (event->type & (GPM_DRAG|GPM_DOWN)) { @@ -335,7 +335,8 @@ do_snapshot() { Gpm_Event event; - int i=Gpm_GetSnapshot(&event); + int rsize=sizeof(Gpm_Event); + int i=Gpm_GetSnapshotExt(&event); char *s; if (-1 == i) { @@ -480,7 +481,8 @@ } /*if*/ if (FD_ISSET(gpm_fd, &readset)) { Gpm_Event evt; - if (Gpm_GetEvent(&evt) > 0) { + if (Gpm_GetEventExt(&evt) > 0) { +/* if (Gpm_GetEvent(&evt) > 0) { */ my_handler(&evt, 0); } else { fprintf(stderr, "Oops, Gpm_GetEvent()\n"); diff -r -u gpm-1.19.3.original/mice.c gpm-1.19.3/mice.c --- gpm-1.19.3.original/mice.c Wed Mar 8 01:10:00 2000 +++ gpm-1.19.3/mice.c Mon Sep 25 07:03:01 2000 @@ -5,6 +5,8 @@ * Copyright (C) 1993 Andrew Haylett * Copyright (C) 1994-2000 Alessandro Rubini * Copyright (C) 1998,1999 Ian Zimmerman + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -223,6 +225,7 @@ prev = state->buttons; state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; return 0; } @@ -234,6 +237,7 @@ state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; /* Allow motion *and* button change (Michael Plass) */ @@ -258,6 +262,7 @@ state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; /* Allow motion *and* button change (Michael Plass) */ @@ -352,6 +357,7 @@ state->dx = ((data[1] & 0x3f) ) * ((data[0] & 0x10)?1:-1); state->dy = ((data[2] & 0x3f) ) * ((data[0] & 0x8)?-1:1); + state->dw= 0; return 0; } @@ -364,6 +370,7 @@ | ((data[0] & 0x10) >> 4); /* right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; /* wheel (dz??) is (data[3] & 0x0f) */ return 0; @@ -385,6 +392,7 @@ data[0], data[1], data[2], data[3]); return -1; } + state->dw= 0; /* wheel (dz) is (data[3] & 0x0f) */ /* where is the side button? I can sort of detect it at 9600 baud */ /* Note this mouse is very noisy */ @@ -398,6 +406,7 @@ state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; return 0; } @@ -406,6 +415,7 @@ state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]); state->dy= -(signed char)(data[2]); + state->dw= 0; return 0; } @@ -414,6 +424,7 @@ state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]) + (signed char)(data[3]); state->dy= -((signed char)(data[2]) + (signed char)(data[4])); + state->dw= 0; return 0; } @@ -495,9 +506,65 @@ state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; + state->dw= 0; return 0; } +static int M_imps2(Gpm_Event *state, unsigned char *data) +{ + static int tap_active=0; /* there exist glidepoint ps2 mice */ + + state->buttons= + !!(data[0]&1) * GPM_B_LEFT + + !!(data[0]&2) * GPM_B_RIGHT + + !!(data[0]&4) * GPM_B_MIDDLE; + + if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ + state->buttons = tap_active = opt_glidepoint_tap; + else if (tap_active) + if (data[0]==8) + state->buttons = tap_active = 0; + else state->buttons = tap_active; + + /* Some PS/2 mice send reports with negative bit set in data[0] + * and zero for movement. I think this is a bug in the mouse, but + * working around it only causes artifacts when the actual report is -256; + * they'll be treated as zero. This should be rare if the mouse sampling + * rate is set to a reasonable value; the default of 100 Hz is plenty. + * (Stephen Tell) + */ + if(data[1] != 0) + state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; + else + state->dx = 0; + if(data[2] != 0) + state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); + else + state->dy = 0; + state->dw = (data[3] >= 128) ? data[3]-256 : data[3]; + + return 0; +} + +static int R_imps2(Gpm_Event *state, int fd) +{ + unsigned char buffer[4]; + + buffer[0] = ((state->buttons & GPM_B_LEFT) ? 0x01 : 0) | + ((state->buttons & GPM_B_RIGHT) ? 0x02 : 0) | + ((state->buttons & GPM_B_MIDDLE) ? 0x04 : 0); + + if (state->dx < 0) buffer[0] |= 0x10; + if (state->dy > 0) buffer[0] |= 0x20; + + buffer[1] = ( state->dx >= 0) ? state->dx : 256+state->dx; + buffer[2] = (-state->dy >= 0) ? -state->dy : 256-state->dy; + buffer[3] = ( state->dw >= 0) ? state->dw : 256+state->dw; + + return write(fd,buffer,4); +} + + static int M_netmouse(Gpm_Event *state, unsigned char *data) { /* Avoid this beasts if you can. They connect to normal PS/2 port, @@ -533,6 +600,7 @@ state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; + state->dw= 0; return 0; } @@ -598,6 +666,8 @@ prev= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); if (mytype->packetlen==4) b=data[3]>>4; } + + state->dw= 0; if(mytype->packetlen==4) { @@ -694,7 +764,7 @@ if (!IsA(UltraPad)){ /* Tool out of active area */ ox=-1; state->buttons=0; - state->dx=state->dy=0; + state->dx=state->dy=state->dw=0; } return 0; /* nothing more to do so leave */ @@ -729,6 +799,7 @@ state->dx= (x-ox) / (wmaxx / win.ws_col / wcmodell[WacomModell].treshold); state->dy= (y-oy) / (wmaxy / win.ws_row / wcmodell[WacomModell].treshold); + state->dw= 0; } ox=x; oy=y; @@ -767,7 +838,7 @@ + GPM_B_MIDDLE * ((data[0]>>3) & 1) + GPM_B_RIGHT * ((data[0]>>4) & 1); - state->dx = 0; state->dy = 0; + state->dx = 0; state->dy = 0; state->dw= 0; state->x = x < CAL_X_MIN ? 0 : x > CAL_X_MAX ? win.ws_col+1 @@ -805,6 +876,7 @@ + GPM_B_RIGHT * ((data[0]>>4) & 1); state->dx = (x-ox)/5; state->dy = (oy-y)/5; + state->dw = 0; ox=x; oy=y; return 0; } @@ -831,6 +903,7 @@ state->dx = (signed char)data[1]; /* currently unused */ state->dy = (signed char)data[2]; + state->dw = 0; x = ((int)data[3] << 8) + (int)data[4]; y = ((int)data[5] << 8) + (int)data[6]; @@ -922,6 +995,7 @@ { lasth = h; lastv = v; lock = 1; } state->dx = -(h-lasth); lasth = h; state->dy = -(v-lastv); lastv = v; + state->dw = 0; #elif defined(TWIDDLER_BALLISTIC) { @@ -1049,6 +1123,8 @@ if ((state->dy >= -1) && (state->dy <= 1)) state->dy = 0; + state->dw = 0; + return 0; } #endif /* have joystick.h */ @@ -1991,9 +2067,9 @@ {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", - "", M_ps2, I_imps2, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel", + "", M_imps2, I_imps2, STD_FLG, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, R_imps2}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, diff -r -u gpm-1.19.3.original/mouse-test.c gpm-1.19.3/mouse-test.c --- gpm-1.19.3.original/mouse-test.c Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3/mouse-test.c Thu Sep 21 20:54:20 2000 @@ -55,6 +55,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, + DEF_SIMWHEEL, (char *)NULL /* extra */, (Gpm_Type *)NULL }; gpm-1.20.4/patches/todo/imwheel/imwheel_new.reason010060000017500001750000000030320760216311400207540ustar00niconico00This patch is inspired by Jonathan Atkin's imwheel2.patch. It introduces a slightly different approach to mouse wheel processing by GPM that allows to write a backward-compatible code, and does not need recompiling all existing GPM-based applications. Here is the short description of changes. For a detailed description refer to gpm.info after applying the patch: - New members appended to Gpm_Event structure: w, dw - wheel displacement after previous reading, and current wheel position (initially set to 0) pad - reserve for future extensions - New functions: Gpm_GetEventExt and Gpm_GetSnapshotExt allow to get the extended Gpm_Event structure, while Gpm_GetEvent and Gpm_GetSnapshot truncate it to the standard size for backward compatibility - New event types: GPM_FWHEEL (wheel forward) and GPM_BWHEEL (wheel backward) provide and alternative way of wheel processing similar to ZAxis mapping in XFree86. - New definition: #define GPM_EVENT_EXT allows to write a backward-compatible code. The gpm.info has been modified to reflect the changes. After the patch is applied and installed, type 'info gpm' for more information regarding wheel processing. The patch has been tested with PS/2 Intellimouse only. N.B. This patch does not associate wheel motion with a keystroke, and does not automatically provide text scrolling - 'imwheel' package by Jonathan Atkins implements those feature, however it may be inconsistent with the current modifications. Michael Glickman gpm-1.20.4/patches/todo/imwheel/mouse_wheel.patch010060000017500001750000001457400760216311400206120ustar00niconico00diff -u -r gpm-1.19.3/doc/doc.gpm gpm-1.19.3.wheel/doc/doc.gpm --- gpm-1.19.3/doc/doc.gpm Tue Jul 18 22:43:18 2000 +++ gpm-1.19.3.wheel/doc/doc.gpm Wed Nov 22 21:47:30 2000 @@ -852,10 +852,10 @@ consoles. @xref{Default Handlers}. -When a client is involved, it is handled a @code{Gpm_Event} -structure, built by the server. The fields for @code{Gpm_Event} are the +When a client is involved, it is handled a @code{Gpm_EventExt} structure +built by the server. The fields for @code{Gpm_EventExt} are the following: -@tindex Gpm_Event +@tindex Gpm_EventExt @table @code @@ -911,8 +911,35 @@ of them is active at a time, to allow using @code{switch} on the value. Vertical outrun takes precedence on horizontal outrun. @xref{Margins}. + +@item short dw; /* Extended element */ + Wheel1 displacement after last event reading. + +@item short w; /* Extended element */ + Wheel1 position. It is not checked on an overflow, and therefore + using dw is prefered. Another way of wheel processing is provided + by FWHEEL and BWHEEL event types. These event types must be disabled, + if wheel position is processed in an application. + +@item short dw2; /* Extended element */ + Wheel2 displacement after last event reading. + +@item short w2; /* Extended element */ + Wheel2 position. FWHEEL2 and BWHEEL2 are event types for the second + wheel, similar to FWHEEL and BWHEEL. + +@item int pad[18]; /* Extended element */ + Reserved for future use. + @end table +Extended elements are those added to original Gpm_Event structure +in order to enable whell support. Extended elements are accessible +by an event handler, as well as Gpm_GetEventExt and Gpm_GetSnapshotExt +functions, while Gpm_GetEvent or Gpm_GetSnapshot operate on the +original structure. Check if @code{GPM_EVENT_EXT} is +defined before using extended elements and functions in an application. + %========================================================================== @node Margins, Event Types, Events, Gpm Internals @section How margins are managed @@ -941,7 +968,7 @@ @node Event Types, Connection Details, Margins, Gpm Internals @section Event Types -The @code{type} field in @code{Gpm_Event} is made up of bit-wide +The @code{type} field in @code{Gpm_EventExt} is made up of bit-wide flags. The existing bit masks belong to two groups: bare events and cooked events. The bit-mask @code{GPM_BARE_EVENTS} is provided to extract bare events, by and-ing (@samp{&}) it with the @code{type} field. @@ -969,6 +996,17 @@ @item GPM_LEAVE This is only delivered by the high level library, too. Events of type @code{GPM_LEAVE} have all other fields undefined. +@item GPM_FWHEEL + Wheel turned forward (toward the user). Turning a wheel more than one + notch (Intellimouse) or for a longer time (A4-tech mouse) will produce + additional GPM_FWHEEL events. This is an extended type - you need to + put '#ifdef GPM_FWHEEL' before using the type in your code. +@item GPM_BWHEEL + Same as GPM_FWHEEL but for turning the wheel back. +@item GPM_FWHEEL2 + Wheel 2 turned forward (right). See comments for GPM_FWHEEL +@item GPM_BWHEEL2 + Wheel 2 turned back (left). @end table Cooked events are the following: @@ -1022,10 +1060,15 @@ @table @code @item eventMask - A bitmask of the events the client wants - to receive. Both bare and cooked events are - allowed to appear in the mask. - + A bitmask of the events the client wants to receive. + Both bare and cooked events are allowed to appear in the mask. + In particular, GPM_FWHEEL and GPM_BWHEEL can be disabled by + omitting the masks: + + Gpm_Connect conn; + /* Enable all events, except GPM_FWHEEL and GPM_BWHEEL + conn.eventMask = ~(GPM_FWHEEL | GPM_BWHEEL); + @item defaultMask A mask to tell which events allow a default treatment (the selection one). These are mouse events, @@ -1171,7 +1214,7 @@ application. It is passed two arguments and returns an integer value, according to the following typedef: -@code{typedef int Gpm_Handler(Gpm_Event *@var{event}, void *@var{clientdata});} +@code{typedef int Gpm_Handler(Gpm_EventExt *@var{event}, void *@var{clientdata});} @tindex Gpm_Handler The @var{event} is used to instantiate the mouse event just received, @@ -1366,8 +1409,35 @@ failure, and 0 after closing the connection. Failure can happen if a signal interrupted the read system call. This function doesn't work with xterm mouse reporting and is meant for internal use by the library. + +This function does not return the extended part. @end deftypefun +@deftypefun int Gpm_GetEventExt (Gpm_EventExt *@var{event}); +As Gpm_GetEvent, but returns extended part. For backward compatibility +the application should check @code{GPM_EVENT_EXT}, as given by the following +example: + +@example @noindent + int dw, w, dw2, w, result; + +#ifdef GPM_EVENT_EXT + @{ + Gpm_Event mevnt; + result = Gpm_GetEventExt(&mevnt); + w = mevnt.w; dw = nevnt.dw; + @} +#else + @{ + Gpm_Event mevnt; + result = Gpm_GetEvent(&mevnt); + w = dw = w2 = dw2 = 0; + @} +#endif +@end example + +@end deftypefun + %......................................................................... @deftypefun int Gpm_CharsQueued (void); @@ -1431,7 +1501,7 @@ %......................................................................... @deftypefun int Gpm_DrawPointer (int @var{x}, int @var{y}, int @var{fd}); -@deftypefunx int GPM_DRAWPOINTER (Gpm_Event *@var{ePtr};) +@deftypefunx int GPM_DRAWPOINTER (Gpm_EventExt *@var{ePtr};) These are actually macros. They should be used to draw the mouse pointer after @@ -1512,8 +1582,14 @@ events, and applications usually don't want to lose events, the function returns 0 if the input queue is not empty. +The functions does not return the extended part. @end deftypefun +@deftypefun int Gpm_GetSnapshotExt (Gpm_EventExt *@var{event}); +As Gpm_GetSnapshot, but returns extended part. For backward compatibility +the application should check whether @code{GPM_EVENT_EXT} has been defined. + +@end deftypefun %-------------------------------------------------------------------------- @node High Level Lib, Xterm, Low Level Library, The ClientLib @@ -1668,7 +1744,7 @@ @end deftypefun %......................................................................... -@deftypefun Gpm_Roi* Gpm_HandleRoi (Gpm_Event *@var{ePtr}, void * @var{clientdata}); +@deftypefun Gpm_Roi* Gpm_HandleRoi (Gpm_EventExt *@var{ePtr}, void * @var{clientdata}); This function, which should not be invoked by the user, is the dispatching @@ -1680,12 +1756,11 @@ If no Roi is interested in he event the @code{*gpm_roi_handler} function is invoked (if not null), with null clientdata. -Reported events are all those in @code{Gpm_Event}, and also @code{GPM_ENTER} +Reported events are all those in @code{Gpm_EventExt}, and also @code{GPM_ENTER} and @code{GPM_LEAVE}. These can be used to toggle highlighting on a button or to drop a menu if the menubutton is entered during a drag. Remember that when Enter or Leave is notified, no other information in the event item should be used. - @end deftypefun diff -u -r gpm-1.19.3/gpm.c gpm-1.19.3.wheel/gpm.c --- gpm-1.19.3/gpm.c Tue Jul 18 22:06:06 2000 +++ gpm-1.19.3.wheel/gpm.c Wed Nov 22 21:22:45 2000 @@ -61,6 +61,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, + DEF_SIMWHEEL, (char *)NULL /* extra */, (Gpm_Type *)NULL }, @@ -230,7 +231,7 @@ } /*-------------------------------------------------------------------*/ -static inline int do_selection(Gpm_Event *event) /* returns 0, always */ +static inline int do_selection(Gpm_EventExt *event) /* returns 0, always */ { static int x1=1, y1=1, x2, y2; #define UNPOINTER() 0 @@ -286,7 +287,7 @@ /*-------------------------------------------------------------------*/ /* returns 0 if the event has not been processed, and 1 if it has */ -static inline int do_client(Gpm_Cinfo *cinfo, Gpm_Event *event) +static inline int do_client(Gpm_Cinfo *cinfo, Gpm_EventExt *event) { Gpm_Connect info=cinfo->data; int fd=cinfo->fd; @@ -308,7 +309,7 @@ /* WARNING */ /* This can generate a SIGPIPE... I'd better catch it */ MAGIC_P((write(fd,&magic, sizeof(int)))); - write(fd,event, sizeof(Gpm_Event)); + write(fd,event, sizeof(Gpm_EventExt)); return info.defaultMask & GPM_HARD ? res : 1; /* HARD forces pass-on */ @@ -384,23 +385,24 @@ } -static int statusX,statusY,statusB; /* to return info */ +static int statusX,statusY,statusW,statusW2,statusB; /* to return info */ static int statusC=0; /* clicks */ -void get_console_size(Gpm_Event *ePtr); +void get_console_size(Gpm_EventExt *ePtr); /*-------------------------------------------------------------------*/ -static inline int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, +static inline int processMouse(int fd, Gpm_EventExt *event, Gpm_Type *type, int kd_mode) { char *data; static int fine_dx, fine_dy; static int i, j, m; - static Gpm_Event nEvent; + static Gpm_EventExt nEvent; static struct vt_stat stat; static struct timeval tv1={0,0}, tv2; /* tv1==0: first click is single */ static struct timeval timeout={0,0}; fd_set fdSet; static int newB=0, oldB=0, oldT=0; /* old buttons and Type to chain events */ + static Gpm_Cinfo *ci; /* static int buttonlock, buttonlockflag; */ #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) @@ -409,6 +411,7 @@ oldT=event->type; + memset (event->pad, '\0', GPM_EVENT_PAD_SIZE * sizeof(int)); if (eventFlag) { @@ -425,13 +428,14 @@ } else { - event->dx=event->dy=0; + event->dx=event->dy=event->dw=event->dw2=0; nEvent.modifiers = 0; /* some mice set them */ FD_ZERO(&fdSet); FD_SET(fd,&fdSet); i=0; do /* cluster loop */ { + nEvent.dx=nEvent.dy=nEvent.dw=nEvent.dw2=0; if ( ((data=getMouseData(fd,m_type,kd_mode))==NULL) || ((*(m_type->fun))(&nEvent,data)==-1) ) { @@ -439,6 +443,12 @@ else break; } + if (which_mouse->opt_simwheel && (nEvent.buttons & GPM_B_MIDDLE) && nEvent.dy) { + nEvent.buttons &= !GPM_B_MIDDLE; + nEvent.dw = nEvent.dy; + nEvent.dy = 0; + } + event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ @@ -461,6 +471,8 @@ /* increment the reported dx,dy */ event->dx+=nEvent.dx; event->dy+=nEvent.dy; + event->dw+=nEvent.dw; + event->dw2+=nEvent.dw2; } else /* a pen */ { @@ -490,7 +502,7 @@ static struct timeval rept1,rept2; gettimeofday(&rept2, (struct timezone *)NULL); if (((rept2.tv_sec -rept1.tv_sec) *1000+(rept2.tv_usec-rept1.tv_usec)/1000)>250) - { event->dx=0; event->dy=0; } + { event->dx=0; event->dy=0; event->dw=0; event->dw2=0; } rept1=rept2; event->dy=event->dy*((win.ws_col/win.ws_row)+1); @@ -512,7 +524,7 @@ fine_dx %= opt_scale; fine_dy %= opt_scaley; } - if (!event->dx && !event->dy && (event->buttons==oldB)) + if (!event->dx && !event->dy && !event->dw && !event->dw2 && (event->buttons==oldB)) do { /* so to break */ static long awaketime; @@ -528,7 +540,8 @@ /*....................................... fill missing fields */ - event->x+=event->dx, event->y+=event->dy; + event->x+=event->dx; event->y+=event->dy; + event->w+=event->dw; event->w2+=event->dw2; statusB=event->buttons; i=open_console(O_RDONLY); @@ -559,7 +572,31 @@ else event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP); - switch(event->type) /* now provide the cooked bits */ + ci = cinfo[stat.v_active]; + if (ci != NULL) + { + i = (ci->data).eventMask; + if (event->w > 0 && (i & GPM_FWHEEL)) + { + event->type |= GPM_FWHEEL; (event->w)--; + } + else + if (event->w < 0 && (i & GPM_BWHEEL)) + { + event->type |= GPM_BWHEEL; (event->w)++; + } + if (event->w2 > 0 && (i & GPM_FWHEEL2)) + { + event->type |= GPM_FWHEEL2; (event->w2)--; + } + else + if (event->w2 < 0 && (i & GPM_BWHEEL2)) + { + event->type |= GPM_BWHEEL2; (event->w2)++; + } + } + + switch(event->type & 0x0f) /* now provide the cooked bits */ { case GPM_DOWN: GET_TIME(tv2); @@ -567,7 +604,7 @@ statusC++, statusC%=3; /* 0, 1 or 2 */ else statusC=0; event->type|=(GPM_SINGLE<type|=(GPM_SINGLE<type |= GPM_MFLAG; event->type|=(GPM_SINGLE<x; statusY=event->y; + statusW=event->w; statusW2=event->w2; if (opt_special && event->type & GPM_DOWN) return processSpecial(event); @@ -671,7 +711,7 @@ int i; Gpm_Cinfo *cinfoPtr, *next; Gpm_Connect conn; - static Gpm_Event event; + static Gpm_EventExt event; static struct vt_stat stat; gpm_debug_log(LOG_INFO,"Request on %i (console %i)", ci->fd, vc); @@ -733,15 +773,16 @@ oops("get_shift_state"); close(i); event.vc = stat.v_active; - event.x=statusX; event.y=statusY; - event.dx=maxx; event.dy=maxy; + event.x=statusX; event.y=statusY; + event.w=statusW; event.w2=statusW2; + event.dx=maxx; event.dy=maxy; event.buttons= statusB; event.clicks=statusC; /* fall through */ case GPM_REQ_BUTTONS: event.type= (opt_three==1 ? 3 : 2); /* buttons */ - write(ci->fd,&event,sizeof(Gpm_Event)); + write(ci->fd,&event,sizeof(Gpm_EventExt)); break; case GPM_REQ_NOPASTE: @@ -868,16 +909,16 @@ /* if the client gets motions, give it the current position */ if(request->eventMask & GPM_MOVE) - { - Gpm_Event event={0,0,vc,0,0,statusX,statusY,GPM_MOVE,0,0}; - do_client(info, &event); + { Gpm_EventExt event={0,0,vc,0,0,statusX,statusY,GPM_MOVE,0,0, + 0,statusW,0,statusW2}; + do_client(info, &event); } return newfd; } /*-------------------------------------------------------------------*/ -void get_console_size(Gpm_Event *ePtr) +void get_console_size(Gpm_EventExt *ePtr) { int i, prevmaxx, prevmaxy; struct mouse_features *which_mouse; /* local */ @@ -899,6 +940,8 @@ if (!prevmaxx) { /* first invocation, place the pointer in the middle */ statusX = ePtr->x = maxx/2; statusY = ePtr->y = maxy/2; + statusW = ePtr->w = 0; + statusW2 = ePtr->w2 = 0; } else { /* keep the pointer in the same position where it was */ statusX = ePtr->x = ePtr->x * maxx / prevmaxx; statusY = ePtr->y = ePtr->y * maxy / prevmaxy; @@ -935,7 +978,7 @@ struct timeval timeout; int maxfd=-1; int pending; - Gpm_Event event; + Gpm_EventExt event; prgname=argv[0]; diff -u -r gpm-1.19.3/gpm.h gpm-1.19.3.wheel/gpm.h --- gpm-1.19.3/gpm.h Fri Jan 28 09:09:00 2000 +++ gpm-1.19.3.wheel/gpm.h Wed Nov 22 21:23:55 2000 @@ -98,6 +98,12 @@ GPM_LEAVE=1024 /* leave event, used in Roi's */ }; +#define GPM_WHEEL +#define GPM_FWHEEL 4096 /* wheel1 move forward */ +#define GPM_BWHEEL 8192 /* wheel1 move backward */ +#define GPM_FWHEEL2 16384 /* wheel2 move forward(right) */ +#define GPM_BWHEEL2 32768 /* wheel2 move backward(left) */ + #define Gpm_StrictSingle(type) (((type)&GPM_SINGLE) && !((type)&GPM_MFLAG)) #define Gpm_AnySingle(type) ((type)&GPM_SINGLE) #define Gpm_StrictDouble(type) (((type)&GPM_DOUBLE) && !((type)&GPM_MFLAG)) @@ -120,9 +126,24 @@ enum Gpm_Margin margin; } Gpm_Event; +#define GPM_EVENT_PAD_SIZE 19 /* Should be enough for now */ +#define GPM_EVENT_EXT + +typedef struct Gpm_EventExt { + unsigned char buttons, modifiers; /* try to be a multiple of 4 */ + unsigned short vc; + short dx, dy, x, y; + enum Gpm_Etype type; + int clicks; + enum Gpm_Margin margin; + short dw, w; + short dw2, w2; + int pad[GPM_EVENT_PAD_SIZE]; +} Gpm_EventExt; + /*....................................... The handling function */ -typedef int Gpm_Handler(Gpm_Event *event, void *clientdata); +typedef int Gpm_Handler(Gpm_EventExt *event, void *clientdata); /*....................................... The connection data structure */ @@ -181,6 +202,7 @@ extern int Gpm_Open(Gpm_Connect *, int); extern int Gpm_Close(void); extern int Gpm_GetEvent(Gpm_Event *); +extern int Gpm_GetEventExt(Gpm_EventExt *); extern int Gpm_CharsQueued(void); extern int Gpm_Getc(FILE *); #define Gpm_Getchar() Gpm_Getc(stdin) @@ -246,6 +268,7 @@ char *Gpm_GetLibVersion(int *where); char *Gpm_GetServerVersion(int *where); int Gpm_GetSnapshot(Gpm_Event *ePtr); +int Gpm_GetSnapshotExt(Gpm_EventExt *ePtr); #ifdef __cplusplus }; diff -u -r gpm-1.19.3/gpmCfg.h gpm-1.19.3.wheel/gpmCfg.h --- gpm-1.19.3/gpmCfg.h Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3.wheel/gpmCfg.h Thu Sep 21 20:42:12 2000 @@ -62,5 +62,7 @@ #define DEF_TEST 0 #define DEF_PTRDRAG 1 /* double or triple click */ #define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */ +#define DEF_SIMWHEEL 0 /* simulate wheel with middle button and */ + /* y-axis movement */ #endif /* _GPMCFG_INCLUDED */ diff -u -r gpm-1.19.3/gpmInt.h gpm-1.19.3.wheel/gpmInt.h --- gpm-1.19.3/gpmInt.h Tue Jul 18 22:18:54 2000 +++ gpm-1.19.3.wheel/gpmInt.h Sat Nov 11 18:55:32 2000 @@ -56,7 +56,7 @@ char *name; char *desc; /* a descriptive line */ char *synonyms; /* extra names (the XFree name etc) as a list */ - int (*fun)(Gpm_Event *state, unsigned char *data); + int (*fun)(Gpm_EventExt *state, unsigned char *data); struct Gpm_Type *(*init)(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv); unsigned short flags; @@ -66,7 +66,7 @@ int getextra; /* does it get an extra byte? (only mouseman) */ int absolute; /* flag indicating absolute pointing device */ - int (*repeat_fun)(Gpm_Event *state, int fd); /* repeat this event into fd */ + int (*repeat_fun)(Gpm_EventExt *state, int fd); /* repeat this event into fd */ /* itz Mon Jan 11 23:27:54 PST 1999 */ } Gpm_Type; @@ -88,6 +88,7 @@ char *opt_type, *opt_dev, *opt_sequence; int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_glidepoint_tap; + int opt_simwheel; char *opt_options; /* extra textual configuration */ Gpm_Type *m_type; int fd; @@ -148,7 +149,7 @@ /* mice.c */ extern int M_listTypes(void); /* special.c */ -int processSpecial(Gpm_Event *event); +int processSpecial(Gpm_EventExt *event); int twiddler_key(unsigned long message); int twiddler_key_init(void); diff -u -r gpm-1.19.3/gpn.c gpm-1.19.3.wheel/gpn.c --- gpm-1.19.3/gpn.c Tue Jul 18 22:06:06 2000 +++ gpm-1.19.3.wheel/gpn.c Thu Sep 21 20:53:38 2000 @@ -177,7 +177,9 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" - " -V verbosity increase number of logged messages\n", + " -V verbosity increase number of logged messages\n" + " -w simulate wheel operation by pressing middle\n" + " mouse button and y-axis movement\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; @@ -286,7 +288,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TvV::w23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -359,6 +361,9 @@ case 'v': printf(GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); exit(0); case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); + break; + case 'w': + which_mouse->opt_simwheel=1; break; case '2': opt_three=-1; break; case '3': opt_three=1; break; diff -u -r gpm-1.19.3/hltest.c gpm-1.19.3.wheel/hltest.c --- gpm-1.19.3/hltest.c Tue Jan 18 08:34:00 2000 +++ gpm-1.19.3.wheel/hltest.c Sat Nov 11 19:28:24 2000 @@ -281,7 +281,7 @@ * Gpm_PushRoi on creation, and is used to differentiate them */ -int handler(Gpm_Event *ePtr, void *clientdata) +int handler(Gpm_EventExt *ePtr, void *clientdata) { WinInfo *info=clientdata; int number=info->number; @@ -391,7 +391,7 @@ * This extra handler is only used for the background and left bar */ -int xhandler(Gpm_Event *ePtr, void *clientdata) +int xhandler(Gpm_EventExt *ePtr, void *clientdata) { static int x=0,y=0; int back=0; diff -u -r gpm-1.19.3/libcurses.c gpm-1.19.3.wheel/libcurses.c --- gpm-1.19.3/libcurses.c Tue Jan 18 08:34:00 2000 +++ gpm-1.19.3.wheel/libcurses.c Sat Nov 11 19:20:12 2000 @@ -47,7 +47,7 @@ fd_set selSet; int max, flag, result; int fd=STDIN_FILENO; -static Gpm_Event ev; +static Gpm_EventExt ev; if (!gpm_flag || gpm_fd==-1) return GET(win); if (gpm_morekeys) return (*gpm_handler)(&ev,gpm_data); @@ -76,7 +76,7 @@ if (flag==-1) continue; - if (Gpm_GetEvent(&ev) && gpm_handler + if (Gpm_GetEventExt(&ev) && gpm_handler && (result=(*gpm_handler)(&ev,gpm_data))) { gpm_hflag=1; @@ -93,7 +93,7 @@ /* JD patch 11/08/1998 */ #define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; - extern gpm_convert_event(char *data, Gpm_Event *event); + extern gpm_convert_event(char *data, Gpm_EventExt *event); int c; unsigned char mdata[4]; /* JD patch 11/08/1998 */ diff -u -r gpm-1.19.3/libhigh.c gpm-1.19.3.wheel/libhigh.c --- gpm-1.19.3/libhigh.c Tue Jan 18 08:34:00 2000 +++ gpm-1.19.3.wheel/libhigh.c Sat Nov 11 19:18:59 2000 @@ -132,9 +132,9 @@ * It generates also GPM_ENTER and GPM_LEAVE events. */ -int Gpm_HandleRoi(Gpm_Event *ePtr, void *clientdata) +int Gpm_HandleRoi(Gpm_EventExt *ePtr, void *clientdata) { -static Gpm_Event backEvent; +static Gpm_EventExt backEvent; Gpm_Roi *roi=gpm_current_roi; /* diff -u -r gpm-1.19.3/liblow.c gpm-1.19.3.wheel/liblow.c --- gpm-1.19.3/liblow.c Tue Jul 18 22:06:06 2000 +++ gpm-1.19.3.wheel/liblow.c Sat Nov 11 19:23:43 2000 @@ -6,6 +6,8 @@ * Copyright (C) 1998 Ian Zimmerman * * xterm management is mostly by jtklehto@stekt.oulu.fi (Janne Kukonlehto) + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -400,7 +402,7 @@ } /*-------------------------------------------------------------------*/ -int Gpm_GetEvent(Gpm_Event *event) +int Gpm_GetEventExt(Gpm_EventExt *event) { int count; MAGIC_P((int magic)); @@ -408,6 +410,7 @@ if (!gpm_flag) return 0; #ifdef GPM_USE_MAGIC + if ((count=read(gpm_fd,&magic,sizeof(int)))!=sizeof(int)) { if (count==0) @@ -421,7 +424,7 @@ } #endif - if ((count=read(gpm_fd,event,sizeof(Gpm_Event)))!=sizeof(Gpm_Event)) + if ((count=read(gpm_fd,event,sizeof(Gpm_EventExt))) != sizeof(Gpm_EventExt)) { #ifndef GPM_USE_MAGIC if (count==0) @@ -442,12 +445,22 @@ return -1; } + event->x -= gpm_zerobased; event->y -= gpm_zerobased; return 1; } +int Gpm_GetEvent(Gpm_Event *event) +{ Gpm_EventExt tmp_event; + int rc; + rc = Gpm_GetEventExt(&tmp_event); + if (event != NULL) + memcpy(event, &tmp_event, sizeof(Gpm_Event)); + return rc; +} + #define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; @@ -464,7 +477,7 @@ { fd_set selSet; int max, flag, result; - static Gpm_Event ev; + static Gpm_EventExt ev; int fd=fileno(f); static int count; @@ -502,7 +515,7 @@ if (FD_ISSET(fd,&selSet)) return fgetc(f); - if (Gpm_GetEvent(&ev) && gpm_handler + if (Gpm_GetEventExt(&ev) && gpm_handler && (result=(*gpm_handler)(&ev,gpm_data))) { gpm_hflag=1; @@ -516,7 +529,7 @@ #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; - extern gpm_convert_event(unsigned char *data, Gpm_Event *event); + extern gpm_convert_event(unsigned char *data, Gpm_EventExt *event); int c; unsigned char mdata[4]; if (nbprevchar) /* if there are some consumed char ... */ @@ -600,7 +613,7 @@ } /*-------------------------------------------------------------------*/ -int gpm_convert_event(unsigned char *mdata, Gpm_Event *ePtr) +int gpm_convert_event(unsigned char *mdata, Gpm_EventExt *ePtr) { static struct timeval tv1={0,0}, tv2; static int clicks=0; diff -u -r gpm-1.19.3/libxtra.c gpm-1.19.3.wheel/libxtra.c --- gpm-1.19.3/libxtra.c Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3.wheel/libxtra.c Sat Nov 11 19:16:22 2000 @@ -5,6 +5,8 @@ * Copyright (C) 1998 Ian Zimmerman * * xterm management is mostly by Miguel de Icaza + * imps2 wheel support: Michael Glickman 2000/09/24 + * Influenced by Jonathan Atkin's patch * * 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 @@ -87,14 +89,14 @@ * The return value is the number of buttons, as known to the server, * the ePtr, if any, is filled with information on the current state. */ -int Gpm_GetSnapshot(Gpm_Event *ePtr) +int Gpm_GetSnapshotExt(Gpm_EventExt *ePtr) { Gpm_Connect conn; - Gpm_Event event; + Gpm_EventExt event; fd_set sillySet; struct timeval to={0,0}; int i; - + if (!gpm_ver_i) { if (0 == Gpm_GetServerVersion(NULL)) { @@ -129,14 +131,25 @@ return 0; write(gpm_fd,&conn,sizeof(Gpm_Connect)); - if ((i=Gpm_GetEvent(ePtr))!=1) - return -1; + if (Gpm_GetEventExt(ePtr)!=1) return -1; i=ePtr->type; ePtr->type=0; return i; /* number of buttons */ } + +int Gpm_GetSnapshot(Gpm_Event *ePtr) +{ + int rc; + Gpm_EventExt eTmp; + rc = Gpm_GetSnapshotExt(&eTmp); + if (ePtr) + memcpy(ePtr, &eTmp, sizeof(Gpm_Event)); + return rc; + +} /* Local Variables: */ /* c-indent-level: 2 */ /* End: */ + diff -u -r gpm-1.19.3/mev.c gpm-1.19.3.wheel/mev.c --- gpm-1.19.3/mev.c Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3.wheel/mev.c Sat Nov 11 19:17:46 2000 @@ -90,15 +90,15 @@ int opt_pointer = 0; /*===================================================================*/ -int user_handler(Gpm_Event *event, void *data) +int user_handler(Gpm_EventExt *event, void *data) { if (opt_fit) Gpm_FitEvent(event); - printf("mouse: event 0x%02X, at %2i,%2i (delta %2i,%2i), " + printf("mouse: event 0x%05X at %2i,%2i (delta %2i,%2i,%2i,%2i), " "buttons %i, modifiers 0x%02X\r\n", event->type, event->x, event->y, - event->dx, event->dy, + event->dx, event->dy, event->dw, event->dw2, event->buttons, event->modifiers); if (event->type & (GPM_DRAG|GPM_DOWN)) { @@ -110,7 +110,7 @@ } /*-------------------------------------------------------------------*/ -int emacs_handler(Gpm_Event *event, void *data) +int emacs_handler(Gpm_EventExt *event, void *data) { int i,j; static int dragX, dragY; @@ -230,8 +230,8 @@ /*===================================================================*/ int usage(void) { - printf( "(" GPM_NAME ") " GPM_RELEASE ", " GPM_DATE "\n" - "Usage: %s [options]\n",prgname); +// printf( "(" GPM_NAME ") " GPM_RELEASE ", " GPM_DATE "\n" +// "Usage: %s [options]\n",prgname); printf(" Valid options are\n" " -C choose virtual console (beware of it)\n" " -d choose the default mask\n" @@ -334,8 +334,9 @@ void do_snapshot() { - Gpm_Event event; - int i=Gpm_GetSnapshot(&event); + Gpm_EventExt event; + int rsize=sizeof(Gpm_EventExt); + int i=Gpm_GetSnapshotExt(&event); char *s; if (-1 == i) { @@ -479,8 +480,9 @@ } /*if*/ } /*if*/ if (FD_ISSET(gpm_fd, &readset)) { - Gpm_Event evt; - if (Gpm_GetEvent(&evt) > 0) { + Gpm_EventExt evt; + if (Gpm_GetEventExt(&evt) > 0) { +/* if (Gpm_GetEvent(&evt) > 0) { */ my_handler(&evt, 0); } else { fprintf(stderr, "Oops, Gpm_GetEvent()\n"); diff -u -r gpm-1.19.3/mice.c gpm-1.19.3.wheel/mice.c --- gpm-1.19.3/mice.c Wed Mar 8 01:10:00 2000 +++ gpm-1.19.3.wheel/mice.c Wed Nov 22 21:51:35 2000 @@ -25,7 +25,7 @@ * This file is part of the mouse server. The information herein * is kept aside from the rest of the server to ease fixing mouse-type * issues. Each mouse type is expected to fill the `buttons', `dx' and `dy' - * fields of the Gpm_Event structure and nothing more. + * fields of the Gpm_EventExt structure and nothing more. * * Absolute-pointing devices (support by Marc Meis), are expecting to * fit `x' and `y' as well. Unfortunately, to do it the window size must @@ -208,7 +208,7 @@ * The return value is the number of unprocessed bytes */ -static int M_ms(Gpm_Event *state, unsigned char *data) +static int M_ms(Gpm_EventExt *state, unsigned char *data) { /* * some devices report a change of middle-button state by @@ -223,17 +223,21 @@ prev = state->buttons; state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; + state->dw2= 0; return 0; } -static int M_ms_plus(Gpm_Event *state, unsigned char *data) +static int M_ms_plus(Gpm_EventExt *state, unsigned char *data) { static unsigned char prev=0; state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; + state->dw2= 0; /* Allow motion *and* button change (Michael Plass) */ @@ -248,7 +252,7 @@ return 0; } -static int M_ms_plus_lr(Gpm_Event *state, unsigned char *data) +static int M_ms_plus_lr(Gpm_EventExt *state, unsigned char *data) { /* * Same as M_ms_plus but with an addition by Edmund GRIMLEY EVANS @@ -258,6 +262,8 @@ state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; + state->dw2= 0; /* Allow motion *and* button change (Michael Plass) */ @@ -285,7 +291,7 @@ int SUMMA_BORDER=100; int summamaxx,summamaxy; char summaid=-1; -static int M_summa(Gpm_Event *state, unsigned char *data) +static int M_summa(Gpm_EventExt *state, unsigned char *data) { int x, y; @@ -307,7 +313,7 @@ /* Thu Jan 28 20:54:47 MET 1999 hof@hof-berlin.de SummaSketch reportformat */ -static int R_summa(Gpm_Event *state, int fd) +static int R_summa(Gpm_EventExt *state, int fd) { signed char buffer[5]; static int x,y; @@ -335,7 +341,7 @@ /* 'Genitizer' (kw@dtek.chalmers.se 11/12/97) */ -static int M_geni(Gpm_Event *state, unsigned char *data) +static int M_geni(Gpm_EventExt *state, unsigned char *data) { /* this is a little confusing. If we use the stylus, we * have three buttons (tip, lower, upper), and if @@ -352,25 +358,48 @@ state->dx = ((data[1] & 0x3f) ) * ((data[0] & 0x10)?1:-1); state->dy = ((data[2] & 0x3f) ) * ((data[0] & 0x8)?-1:1); + state->dw= 0; + state->dw2= 0; return 0; } /* m$ 'Intellimouse' (steveb 20/7/97) */ -static int M_ms3(Gpm_Event *state, unsigned char *data) +static int M_ms3(Gpm_EventExt *state, unsigned char *data) { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x10) >> 3) /* middle */ | ((data[0] & 0x10) >> 4); /* right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); - /* wheel (dz??) is (data[3] & 0x0f) */ + state->dw= data[3] & 0x0f; + if (data[3] & 0x08) state->dw -= 16; + state->dw2= 0; + + return 0; +} + +/* A4 tech 4D mouse serial (michg@alphalink.com.au 11/11/00) */ +static int M_a4d(Gpm_EventExt *state, unsigned char *data) +{ + state->buttons= ((data[0] & 0x20) >> 3) /* left */ + | ((data[3] & 0x10) >> 3) /* middle */ + | ((data[0] & 0x10) >> 4); /* right */ + state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); + state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + switch(data[3] & 0x0f) + { case 0x01: state->dw= 1; state->dw2 = 0; break; + case 0x02: state->dw= 0; state->dw2 = 1; break; + case 0x0f: state->dw=-1; state->dw2 = 0; break; + case 0x0e: state->dw= 0; state->dw2 = -1; break; + default: state->dw= 0; state->dw2 = 0; + } return 0; } /* M_brw is a variant of m$ 'Intellimouse' the middle button is different */ -static int M_brw(Gpm_Event *state, unsigned char *data) +static int M_brw(Gpm_EventExt *state, unsigned char *data) { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x20) >> 4) /* middle */ @@ -385,6 +414,9 @@ data[0], data[1], data[2], data[3]); return -1; } + state->dw= data[3] & 0x0f; + if (data[3] & 0x08) state->dw -= 16; + state->dw2= 0; /* wheel (dz) is (data[3] & 0x0f) */ /* where is the side button? I can sort of detect it at 9600 baud */ /* Note this mouse is very noisy */ @@ -392,35 +424,41 @@ return 0; } -static int M_bare(Gpm_Event *state, unsigned char *data) +static int M_bare(Gpm_EventExt *state, unsigned char *data) { /* a bare ms protocol */ state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + state->dw= 0; + state->dw2= 0; return 0; } -static int M_sun(Gpm_Event *state, unsigned char *data) +static int M_sun(Gpm_EventExt *state, unsigned char *data) { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]); state->dy= -(signed char)(data[2]); + state->dw= 0; + state->dw2= 0; return 0; } -static int M_msc(Gpm_Event *state, unsigned char *data) +static int M_msc(Gpm_EventExt *state, unsigned char *data) { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]) + (signed char)(data[3]); state->dy= -((signed char)(data[2]) + (signed char)(data[4])); + state->dw= 0; + state->dw2= 0; return 0; } /* itz Mon Jan 11 23:51:38 PST 1999 this code moved here from gpm.c */ /* (processMouse) */ -static int R_msc(Gpm_Event *state, int fd) +static int R_msc(Gpm_EventExt *state, int fd) { signed char buffer[5]; @@ -432,39 +470,121 @@ } -static int M_logimsc(Gpm_Event *state, unsigned char *data) /* same as msc */ +static int M_logimsc(Gpm_EventExt *state, unsigned char *data) /* same as msc */ { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]) + (signed char)(data[3]); state->dy= -((signed char)(data[2]) + (signed char)(data[4])); + state->dw= 0; + state->dw2= 0; return 0; } -static int M_mm(Gpm_Event *state, unsigned char *data) +static int M_mm(Gpm_EventExt *state, unsigned char *data) { state->buttons= data[0] & 0x07; state->dx= (data[0] & 0x10) ? data[1] : - data[1]; state->dy= (data[0] & 0x08) ? - data[2] : data[2]; + state->dw= 0; + state->dw2= 0; return 0; } -static int M_logi(Gpm_Event *state, unsigned char *data) /* equal to mm */ +static int M_logi(Gpm_EventExt *state, unsigned char *data) /* equal to mm */ { state->buttons= data[0] & 0x07; state->dx= (data[0] & 0x10) ? data[1] : - data[1]; state->dy= (data[0] & 0x08) ? - data[2] : data[2]; + state->dw= 0; + state->dw2= 0; return 0; } -static int M_bm(Gpm_Event *state, unsigned char *data) /* equal to sun */ +static int M_bm(Gpm_EventExt *state, unsigned char *data) /* equal to sun */ { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)data[1]; state->dy= -(signed char)data[2]; + state->dw= 0; + state->dw2= 0; + return 0; +} + +static int M_ps2(Gpm_EventExt *state, unsigned char *data) +{ + static int tap_active=0; /* there exist glidepoint ps2 mice */ + + state->buttons= + !!(data[0]&1) * GPM_B_LEFT + + !!(data[0]&2) * GPM_B_RIGHT + + !!(data[0]&4) * GPM_B_MIDDLE; + + if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ + state->buttons = tap_active = opt_glidepoint_tap; + else if (tap_active) + if (data[0]==8) + state->buttons = tap_active = 0; + else state->buttons = tap_active; + + /* Some PS/2 mice send reports with negative bit set in data[0] + * and zero for movement. I think this is a bug in the mouse, but + * working around it only causes artifacts when the actual report is -256; + * they'll be treated as zero. This should be rare if the mouse sampling + * rate is set to a reasonable value; the default of 100 Hz is plenty. + * (Stephen Tell) + */ + if(data[1] != 0) + state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; + else + state->dx = 0; + if(data[2] != 0) + state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); + else + state->dy = 0; + state->dw= 0; + state->dw2= 0; + return 0; +} + +static int M_imps2(Gpm_EventExt *state, unsigned char *data) +{ + static int tap_active=0; /* there exist glidepoint ps2 mice */ + + state->buttons= + !!(data[0]&1) * GPM_B_LEFT + + !!(data[0]&2) * GPM_B_RIGHT + + !!(data[0]&4) * GPM_B_MIDDLE; + + if (data[0]==0 && opt_glidepoint_tap) /* by default this is false */ + state->buttons = tap_active = opt_glidepoint_tap; + else if (tap_active) + if (data[0]==8) + state->buttons = tap_active = 0; + else state->buttons = tap_active; + + /* Some PS/2 mice send reports with negative bit set in data[0] + * and zero for movement. I think this is a bug in the mouse, but + * working around it only causes artifacts when the actual report is -256; + * they'll be treated as zero. This should be rare if the mouse sampling + * rate is set to a reasonable value; the default of 100 Hz is plenty. + * (Stephen Tell) + */ + if(data[1] != 0) + state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; + else + state->dx = 0; + if(data[2] != 0) + state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); + else + state->dy = 0; + state->dw = (data[3] >= 128) ? data[3]-256 : data[3]; + state->dw2= 0; + return 0; } -static int M_ps2(Gpm_Event *state, unsigned char *data) +/* A4 tech 4D mouse PS/2 michg@alphalink.com.au 2000/11/11 */ +static int M_a4dps2(Gpm_EventExt *state, unsigned char *data) { static int tap_active=0; /* there exist glidepoint ps2 mice */ @@ -495,10 +615,40 @@ state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; + + /* Wheels */ + switch(data[3] & 0x0f) + { case 0x01: state->dw= 1; state->dw2 = 0; break; + case 0x02: state->dw= 0; state->dw2 = 1; break; + case 0x0f: state->dw=-1; state->dw2 = 0; break; + case 0x0e: state->dw= 0; state->dw2 = -1; break; + default: state->dw= 0; state->dw2 = 0; + } + return 0; } -static int M_netmouse(Gpm_Event *state, unsigned char *data) +/* +static int R_imps2(Gpm_EventExt *state, int fd) +{ + unsigned char buffer[4]; + + buffer[0] = ((state->buttons & GPM_B_LEFT) ? 0x01 : 0) | + ((state->buttons & GPM_B_RIGHT) ? 0x02 : 0) | + ((state->buttons & GPM_B_MIDDLE) ? 0x04 : 0); + + if (state->dx < 0) buffer[0] |= 0x10; + if (state->dy > 0) buffer[0] |= 0x20; + + buffer[1] = ( state->dx >= 0) ? state->dx : 256+state->dx; + buffer[2] = (-state->dy >= 0) ? -state->dy : 256-state->dy; + buffer[3] = ( state->dw >= 0) ? state->dw : 256+state->dw; + + return write(fd,buffer,4); +} +*/ + +static int M_netmouse(Gpm_EventExt *state, unsigned char *data) { /* Avoid this beasts if you can. They connect to normal PS/2 port, but their protocol is one byte longer... So if you have notebook @@ -533,6 +683,8 @@ state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; + state->dw= 0; + state->dw2= 0; return 0; } @@ -566,7 +718,7 @@ } #define GPM_B_BOTH (GPM_B_LEFT|GPM_B_RIGHT) -static int M_mman(Gpm_Event *state, unsigned char *data) +static int M_mman(Gpm_EventExt *state, unsigned char *data) { /* * the damned MouseMan has 3/4 bytes packets. The extra byte @@ -598,7 +750,10 @@ prev= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); if (mytype->packetlen==4) b=data[3]>>4; } - + + state->dw= 0; + state->dw2= 0; + if(mytype->packetlen==4) { if(b == 0) @@ -653,7 +808,7 @@ #define IsA(m) ((WacomModell==(-1))? 0:!strcmp(#m,wcmodell[WacomModell].name)) -static int M_wacom(Gpm_Event *state, unsigned char *data) +static int M_wacom(Gpm_EventExt *state, unsigned char *data) { static int ox=-1, oy; int x, y; @@ -694,7 +849,7 @@ if (!IsA(UltraPad)){ /* Tool out of active area */ ox=-1; state->buttons=0; - state->dx=state->dy=0; + state->dx=state->dy=state->dw=0; } return 0; /* nothing more to do so leave */ @@ -729,6 +884,8 @@ state->dx= (x-ox) / (wmaxx / win.ws_col / wcmodell[WacomModell].treshold); state->dy= (y-oy) / (wmaxy / win.ws_row / wcmodell[WacomModell].treshold); + state->dw= 0; + state->dw2= 0; } ox=x; oy=y; @@ -756,7 +913,7 @@ #define CAL_Y_MAX 0xF40 #define CAL_Y_SIZE (CAL_Y_MAX - CAL_Y_MIN) -static int M_calus(Gpm_Event *state, unsigned char *data) +static int M_calus(Gpm_EventExt *state, unsigned char *data) { int x, y; @@ -767,7 +924,7 @@ + GPM_B_MIDDLE * ((data[0]>>3) & 1) + GPM_B_RIGHT * ((data[0]>>4) & 1); - state->dx = 0; state->dy = 0; + state->dx = 0; state->dy = 0; state->dw= 0; state->dw2= 0; state->x = x < CAL_X_MIN ? 0 : x > CAL_X_MAX ? win.ws_col+1 @@ -788,7 +945,7 @@ return 0; } -static int M_calus_rel(Gpm_Event *state, unsigned char *data) +static int M_calus_rel(Gpm_EventExt *state, unsigned char *data) { static int ox=-1, oy; int x, y; @@ -805,6 +962,8 @@ + GPM_B_RIGHT * ((data[0]>>4) & 1); state->dx = (x-ox)/5; state->dy = (oy-y)/5; + state->dw = 0; + state->dw2 = 0; ox=x; oy=y; return 0; } @@ -822,7 +981,7 @@ #define NCR_DELTA_X (NCR_RIGHT_X - NCR_LEFT_X) #define NCR_DELTA_Y (NCR_TOP_Y - NCR_BOTTOM_Y) -static int M_ncr(Gpm_Event *state, unsigned char *data) +static int M_ncr(Gpm_EventExt *state, unsigned char *data) { int x,y; @@ -831,6 +990,7 @@ state->dx = (signed char)data[1]; /* currently unused */ state->dy = (signed char)data[2]; + state->dw = 0; x = ((int)data[3] << 8) + (int)data[4]; y = ((int)data[5] << 8) + (int)data[6]; @@ -864,7 +1024,7 @@ return 0; } -static int M_twid(Gpm_Event *state, unsigned char *data) +static int M_twid(Gpm_EventExt *state, unsigned char *data) { unsigned long message=0UL; int i,h,v; static int lasth, lastv, lastkey, key, lock=0, autorepeat=0; @@ -922,6 +1082,8 @@ { lasth = h; lastv = v; lock = 1; } state->dx = -(h-lasth); lasth = h; state->dy = -(v-lastv); lastv = v; + state->dw = 0; + state->dw2 = 0; #elif defined(TWIDDLER_BALLISTIC) { @@ -996,7 +1158,7 @@ #ifdef HAVE_LINUX_JOYSTICK_H /* Joystick mouse emulation (David Given) */ -static int M_js(Gpm_Event *state, unsigned char *data) +static int M_js(Gpm_EventExt *state, unsigned char *data) { struct JS_DATA_TYPE *jdata = (void*)data; static int centerx = 0; @@ -1049,12 +1211,15 @@ if ((state->dy >= -1) && (state->dy <= 1)) state->dy = 0; + state->dw = 0; + state->dw2 = 0; + return 0; } #endif /* have joystick.h */ /* Synaptics TouchPad mouse emulation (Henry Davies) */ -static int M_synaptics_serial(Gpm_Event *state, unsigned char *data) +static int M_synaptics_serial(Gpm_EventExt *state, unsigned char *data) { syn_process_serial_data (state, data); @@ -1063,14 +1228,14 @@ /* Synaptics TouchPad mouse emulation (Henry Davies) */ -static int M_synaptics_ps2(Gpm_Event *state, unsigned char *data) +static int M_synaptics_ps2(Gpm_EventExt *state, unsigned char *data) { syn_process_ps2_data (state, data); return 0; } -static int M_mtouch(Gpm_Event *state, unsigned char *data) +static int M_mtouch(Gpm_EventExt *state, unsigned char *data) { /* * This is a simple decoder for the MicroTouch touch screen @@ -1150,7 +1315,7 @@ static int gunze_calib[4]; /* x0,y0 x1,y1 (measured at 1/8 and 7/8) */ static int gunze_debounce = 100; /* milliseconds: ignore shorter taps */ -static int M_gunze(Gpm_Event *state, unsigned char *data) +static int M_gunze(Gpm_EventExt *state, unsigned char *data) { /* * This generates button-1 events, by now. @@ -1257,7 +1422,7 @@ /* Genius Wizardpad tablet -- Matt Kimball (mkimball@xmission.com) */ static int wizardpad_width = -1; static int wizardpad_height = -1; -static int M_wp(Gpm_Event *state, unsigned char *data) +static int M_wp(Gpm_EventExt *state, unsigned char *data) { int x, y, pressure; @@ -1593,9 +1758,10 @@ struct Gpm_Type *type, int argc, char **argv) { struct termios tty; + char rep1, rep2, rep3, rep4; /* accept "-o dtr", "-o rts" and "-o both" */ - if (option_modem_lines(fd, argc, argv)) return NULL; +// if (option_modem_lines(fd, argc, argv)) return NULL; /* * Just put the device to 1200 baud. Thanks to Francois Chastrette @@ -1616,8 +1782,7 @@ * Don't read the silly initialization string. I don't want to see * the vendor name: it is only propaganda, with no information. */ - - return type; + return type; } /* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ @@ -1991,12 +2156,18 @@ {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", - "", M_ps2, I_imps2, STD_FLG, + {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel", + "", M_imps2, I_imps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, - {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", + {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel", "", M_ms3, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {"a4dps2", "A4tech 4D (ps2) - 3 buttons and 2 wheels", + "", M_a4dps2, I_imps2, CS7 | STD_FLG, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {"a4d", "A4tech 4D (serial) - 3 buttons and 2 wheels", + "", M_a4d, I_pnp, CS7 | STD_FLG, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, {"netmouse", "Genius NetMouse - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, @@ -2018,7 +2189,6 @@ {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", "", M_brw, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, - #ifdef HAVE_LINUX_JOYSTICK_H {"js", "Joystick mouse emulation", "Joystick", M_js, NULL, 0, diff -u -r gpm-1.19.3/mouse-test.c gpm-1.19.3.wheel/mouse-test.c --- gpm-1.19.3/mouse-test.c Tue Jan 18 09:23:00 2000 +++ gpm-1.19.3.wheel/mouse-test.c Sat Nov 11 19:28:59 2000 @@ -55,6 +55,7 @@ DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, + DEF_SIMWHEEL, (char *)NULL /* extra */, (Gpm_Type *)NULL }; @@ -502,7 +503,7 @@ struct item *cur=*nextitem; int packetheads=0; int match=0; - Gpm_Event event; + Gpm_EventExt event; if (packetsize!=cur->this->packetlen) { @@ -583,7 +584,7 @@ for (nextitem=&list; *nextitem; /* nothing */) { struct item *cur=*nextitem; - Gpm_Event event; + Gpm_EventExt event; /* try to decode button press and release */ for (i=0;i gpm-1.20.4/patches/todo/microtouch-usb004070000017500001750000000000001075432545600165105ustar00niconico00gpm-1.20.4/patches/todo/microtouch-usb/README010060000017500001750000000013460760216311400174370ustar00niconico00From: Radoslaw Garbacz To: rubini@linux.it Date: Mon, 19 Jun 2000 12:28:02 +0000 Subject: gpm and usb touchscreen My name is Radoslaw Garbacz. I have added support to MicroTouch usb devices in gpm application. I send You the patch and the source of mice.c (which I changed). Please send me any suggestions about it. If You think that is is good idea to join my changes to official release of gpm I'll be very glad. I also send You source of microtouch device driver to check my changes. It is also nessesary to copy touchscreen.h file to ./include/linux directory. I changed the gpm, version 1.19.1. Best reagrds. -- >>> POS Experts Consulting <<< Radoslaw Garbacz tel : (048 71) 354 80 85 gpm-1.20.4/patches/todo/microtouch-usb/kernel-driver004070000017500001750000000000001101736502000212415ustar00niconico00gpm-1.20.4/patches/todo/microtouch-usb/kernel-driver/Makefile010060000017500001750000000010050760216311400227600ustar00niconico00# Makefile for a basic kernel module CC=gcc #MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX MODCFLAGS := -D__KERNEL__ -I/usr/src/linux-2.3.99-pre6/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -march=i586 -DMODULE -DMODVERSIONS -include /usr/src/linux-2.3.99-pre6/include/linux/modversions.h touchscreen.o: touchscreen.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c touchscreen.c audio.o: audio.c /usr/include/linux/version.h $(CC) $(MODCFLAGS) -c audio.c gpm-1.20.4/patches/todo/microtouch-usb/kernel-driver/mt_calibra.c010060000017500001750000000034701101736502000235640ustar00niconico00// copyrights (c) WWO // // Written by Radosław Garbacz // 14/06/2000 // A simple calibration program for micro touch screen. #include #include #include #include #include #include #include #include #include "touchscreen.h" //#include <> int getStatus(int _hFile) { unsigned char buff[20]; int nRet; //printf("Get status\n"); if((nRet=ioctl(_hFile,TSCRN_CONTROLLER_STATUS ,buff)) < 0) { printf("Error ioctl %d\n",nRet); close(_hFile); exit(1); } //printf("cmd status = %d\n",buff[3]); return buff[3]; }; int main() { int nRet,hFile; char buff[50]; memset(buff, 0, sizeof(buff)); if((hFile=open("/dev/usb/usbtest",O_RDONLY )) < 0) { printf("Error open %d\n",hFile); return 0; }; (void)getStatus(hFile); printf("Soft reset of device\n"); if((nRet=ioctl(hFile,73)) < 0) { printf("Error ioctl %d\n",nRet); return 0; } (void)getStatus(hFile); printf("Calibrate controler extended \n"); *buff = TSCRN_CORNER_CALIBRATION_TYPE; if((nRet=ioctl(hFile,TSCRN_CALIBRATION,buff)) < 0) { printf("Error ioctl %d\n",nRet); return 0; } printf("\n"); //while((nRet = getStatus(hFile)) != 1) // printf("wait for staus 1 status=%d\r",nRet); //printf("\n"); while((nRet=getStatus(hFile)) < 2) { printf("wait for lower left corner %d\n",nRet); sleep(1); } printf("\n"); while((nRet=getStatus(hFile)) < 3) { printf("lower left corner complited;wait for upper right corner %d\n",nRet); sleep(1); } printf("\n"); if((nRet=getStatus(hFile)) == 3) printf("upper right corner complited %d\n",nRet); else printf("upper right corner error %d\n",nRet); printf(" koniec kalibracji OK ioctl: %d \n",nRet); close(hFile); return 0; } gpm-1.20.4/patches/todo/microtouch-usb/kernel-driver/touchscreen.c010060000017500001750000000762011101736502000240130ustar00niconico00/* -*- linux-c -*- */ /* * Driver for USB Touchscreen (Microtech - IBM SurePos 4820) * * Copyright (C) 2000 Wojciech Woziwodzki * Written by Radoslaw Garbacz * * 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. * * Originally based upon scanner.c (David E. Nelson). * * History * * 0.1 06/05/2000 (RGA) * Development work was begun. * * 0.2 09/05/2000 (RGA) * Documentation about MicroTouch controller was arrived. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* used in new tty drivers */ #include /* used in new tty drivers */ #include #include #include #include #ifdef CONFIG_KERNELD #include #endif //#define DEBUG #define TSCRN_IOCTL //#define __TEST_NO_DEVICE__ #define TSCRN_MAX_MNR 16 /* We're allocated 16 minors */ #define TSCRN_BASE_MNR 48 /* USB Scanners start at minor 48 */ #define IS_EP_BULK(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_BULK ? 1 : 0) #define IS_EP_BULK_IN(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) #define IS_EP_BULK_OUT(ep) (IS_EP_BULK(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) #define IS_EP_INTR(ep) ((ep).bmAttributes == USB_ENDPOINT_XFER_INT ? 1 : 0) #define IS_EP_INTR_IN(ep) (IS_EP_INTR(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) #define IS_EP_INTR_OUT(ep) (IS_EP_INTR(ep) && ((ep).bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) #define USB_TSCRN_MINOR(X) MINOR((X)->i_rdev) - TSCRN_BASE_MNR #ifdef DEBUG #define TSCRN_DEBUG(X) X #else #define TSCRN_DEBUG(X) #endif #include #include #include "touchscreen.h" struct tscrn_usb_data { struct usb_device *dev; wait_queue_head_t wait; struct urb irq; struct urb ctrlin; struct urb ctrlout; devrequest *setup_packet; // for control transfers unsigned int ifnum; // Interface number of the USB device kdev_t minor; // TouchScreen minor - used in disconnect() unsigned char data[TSCRN_USB_RAPORT_SIZE_DATA]; // Data buffer X-Y, and button int nLoopCounter; // number of data packet last received +1 char isopen; // Not zero if the device is open char present; // Not zero if device is present unsigned char *obuf, *ibuf; // transfer buffers unsigned char *pToRead,*pToWrite;// pointers to toRead cell of buffer and to toWrite one char intr_ep; // Endpoint assignments struct input_dev input_dev; // to work as an input device driver }; static struct tscrn_usb_data *p_tscrn_table[TSCRN_MAX_MNR] = { NULL, /* ... */}; MODULE_AUTHOR("Radoslaw Garbacz, garbacz@posexperts.com.pl"); MODULE_DESCRIPTION("USB touchscreen driver"); static __s32 vendor=-1, product=-1; MODULE_PARM(vendor, "i"); MODULE_PARM_DESC(vendor, "User specified USB idVendor"); MODULE_PARM(product, "i"); MODULE_PARM_DESC(product, "User specified USB idProduct"); /* Forward declarations */ static struct usb_driver touchscreen_driver; /* Procedures */ /** * Runs after ctrl requests. */ static void ctrl_touchscreen(struct urb *urb) { struct tscrn_usb_data *tscrn = urb->context; dbg("ctrl_touchscreen(%d): status=%d", tscrn->minor, urb->status); if (waitqueue_active(&tscrn->wait)) wake_up_interruptible(&tscrn->wait); return; }; /** * Runs on new data received from device * The buffer should keep the last state of device, thus the buffer overflow * can occurre * The client can't read data when pToRead == pToWrite */ static void irq_touchscreen(struct urb *urb) { /* * data raports... */ struct tscrn_usb_data *tscrn = urb->context; struct tscrn_usb_data_report *data = (struct tscrn_usb_data_report *)tscrn->data; if (urb->status) return; //return when driver was clesed if(!tscrn->isopen) return; // increase loop counter // !!! Unfortunately the data was lost to seldom !!! //if((int)GET_LOOP(data) != tscrn->nLoopCounter) // warn("warn:Lost data new loop %d previous loop %d",(int)GET_LOOP(data),(int)tscrn->nLoopCounter); input_report_key(&tscrn->input_dev, BTN_LEFT, IS_TOUCHED(data)); input_report_abs(&tscrn->input_dev, ABS_X, GET_XC(data)); input_report_abs(&tscrn->input_dev, ABS_Y, GET_YC(data)); tscrn->nLoopCounter = (GET_LOOP(data))+1; // store data to buffer memcpy(tscrn->pToWrite,data,TSCRN_USB_RAPORT_SIZE_DATA); // next data to next cell if(tscrn->pToRead == NULL) tscrn->pToRead = tscrn->pToWrite; tscrn->pToWrite += TSCRN_USB_RAPORT_SIZE_DATA; if(tscrn->pToWrite >= tscrn->obuf+OBUF_SIZE) tscrn->pToWrite = tscrn->obuf; if (waitqueue_active(&tscrn->wait)) wake_up_interruptible(&tscrn->wait); //dbg("irq_touchscreen(): GET_Data 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d", (int)data[0],(int)data[1],(int)data[2],(int)data[3],(int)data[4],(int)data[5],(int)data[6],(int)data[7],(int)data[8],(int)data[9],(int)data[10], tscrn->ctrlout.status); return; } static int open_touchscreen(struct inode * inode, struct file * file) { struct tscrn_usb_data *tscrn; struct usb_device *dev; kdev_t minor; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif minor = USB_TSCRN_MINOR(inode); dbg("open_touchscreen: tscrn_minor:%d", minor); if (!p_tscrn_table[minor]) { err("open_touchscreen(%d): invalid tscrn_minor", minor); return -ENODEV; } tscrn = p_tscrn_table[minor]; dev = tscrn->dev; if (!dev) { return -ENODEV; } if (!tscrn->present) { return -ENODEV; } if (tscrn->isopen) { return -EBUSY; } //clear up the data buffer memset(tscrn->obuf, 0x0, OBUF_SIZE); tscrn->pToRead = NULL; tscrn->pToWrite = tscrn->obuf; tscrn->isopen = 1; file->private_data = tscrn; /* Used by the read and write metheds */ MOD_INC_USE_COUNT; return 0; } static int close_touchscreen(struct inode * inode, struct file * file) { struct tscrn_usb_data *tscrn; kdev_t minor; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif minor = USB_TSCRN_MINOR (inode); dbg("close_touchscreen: tscrn_minor:%d", minor); if (!p_tscrn_table[minor]) { err("close_touchscreen(%d): invalid tscrn_minor", minor); return -ENODEV; } tscrn = p_tscrn_table[minor]; tscrn->isopen = 0; file->private_data = NULL; MOD_DEC_USE_COUNT; return 0; } static ssize_t read_touchscreen(struct file * file, char * buffer, size_t count, loff_t *ppos) { struct tscrn_usb_data *tscrn; struct usb_device *dev; ssize_t bytes_read; /* Overall count of bytes_read */ ssize_t ret; kdev_t minor; int partial; /* Number of bytes successfully read */ int this_read; /* Max number of bytes to read */ //int result; unsigned char *buf, *pToRead; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif tscrn = file->private_data; minor = tscrn->minor; buf = tscrn->obuf; pToRead = tscrn->pToRead; dev = tscrn->dev; bytes_read = 0; ret = 0; if((tscrn->pToWrite == tscrn->pToRead) || (tscrn->pToRead == NULL)) return 0; // no new data if (signal_pending(current)) { ret = -EINTR; return ret; } this_read = (count >= TSCRN_USB_RAPORT_SIZE_DATA) ? TSCRN_USB_RAPORT_SIZE_DATA: count; partial = this_read; //dbg("read stats(%d): result:%d this_read:%d partial:%d", minor, result, this_read, partial); dbg("read count=%d", count); if (partial) { /* Data returned */ if (copy_to_user(buffer, tscrn->pToRead, this_read)) { ret = -EFAULT; return ret;//break; } count -= partial; bytes_read += partial; buffer += partial; tscrn->pToRead += partial; if(tscrn->pToRead >= tscrn->obuf+OBUF_SIZE) tscrn->pToRead = tscrn->obuf; } dbg("read ended bytes_read(%d)", bytes_read); return ret ? ret : bytes_read; } /** * Zmiana dla jądra 2.2.x z select na poll */ static unsigned int poll_touchscreen(struct file *file, struct poll_table_struct *_wait) { struct usb_device *dev; struct tscrn_usb_data *tscrn; struct inode *inode; struct dentry *dentry; kdev_t minor; dentry = file->f_dentry; inode = dentry->d_inode; minor = USB_TSCRN_MINOR(inode); dbg("poll_touchscreen(%d): entered", minor); if (!p_tscrn_table[minor]) { err("poll_touchscreen(%d): invalid minor", minor); return 0; //return -ENODEV; }; tscrn = p_tscrn_table[minor]; dev = tscrn->dev; //if(_selType != SEL_IN) // return -EPERM; if((tscrn->pToWrite == tscrn->pToRead) || (tscrn->pToRead == NULL)) { poll_wait(file, &tscrn->wait, _wait); return 0; }; return 1; }; static int ioctl_touchscreen(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct usb_device *dev; struct tscrn_usb_data *tscrn; int nRet; kdev_t minor; #ifdef __TEST_NO_DEVICE__ return -ENODEV; #endif minor = USB_TSCRN_MINOR(inode); dbg("ioctl_touchscreen(%d): entered cmd=%d", minor,cmd); if (!p_tscrn_table[minor]) { err("ioctl_touchscreen(%d): invalid minor", minor); return -ENODEV; } tscrn = p_tscrn_table[minor]; dev = tscrn->dev; switch (cmd) { case TSCRN_USER_REQUEST: { /* sends reset command */ struct { __u8 data; __u8 request; __u16 value; __u16 index; } args; if (copy_from_user(&args, (void *)arg, sizeof(args))) return -EFAULT; // for the present a soft reset tscrn->setup_packet->requesttype = args.data; tscrn->setup_packet->request = args.request; tscrn->setup_packet->value = args.value; tscrn->setup_packet->index = args.index; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): cmd status=%d nRet=%d",minor,tscrn->ctrlout.status,nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): cmd status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_CLEAR_HALT: { // when end_point is STALLED always returned -1 at first // and OK on second exec, then end_point returns to normal state return usb_clear_halt(dev,0x00);//0x80 }; case TSCRN_HARD_RESET: { tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_RESET; tscrn->setup_packet->value = TSCRN_USB_PARAM_HARD_RESET; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d",minor,tscrn->ctrlout.status,nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_SOFT_RESET: { tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_RESET; tscrn->setup_packet->value = TSCRN_USB_PARAM_SOFT_RESET; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d",minor,tscrn->ctrlout.status,nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_CONTROLLER_STATUS: { tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_STATUS; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = TSCRN_USB_RAPORT_SIZE_STATUS; memset(tscrn->ibuf,0x0, IBUF_SIZE); FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_STATUS, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlin.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlin.status); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlin.status, nRet); if(tscrn->ctrlin.status == 0) if (copy_to_user((void *)arg, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_STATUS)) return -EFAULT; return tscrn->ctrlin.status; }; case TSCRN_CONTROLLER_ID: { tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_CONTROLLER_ID; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = TSCRN_USB_RAPORT_SIZE_ID; memset(tscrn->ibuf,0x0, IBUF_SIZE); FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_ID, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlin.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlin.status); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlin.status, nRet); if(tscrn->ctrlin.status == 0) if (copy_to_user((void *)arg, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_ID)) return -EFAULT; return tscrn->ctrlin.status; }; case TSCRN_CALIBRATION: { __u16 type; if (copy_from_user(&type, (void *)arg, sizeof(type))) { err("ioctl_touchscreen(%d): copy from user error arg=%d.", minor, *((int *)arg)); return -EFAULT; }; switch(type) { case TSCRN_EXTENDED_CALIBRATION_TYPE: case TSCRN_CORNER_CALIBRATION_TYPE: break; default: err("ioctl_touchscreen(%d): unknown calibration type %d.", minor, type); return -EFAULT; }; tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_CALIBRATION; tscrn->setup_packet->value = type; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0x0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d", minor, tscrn->ctrlout.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; case TSCRN_RESTORE_DEFAULTS: { tscrn->setup_packet->requesttype = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_RESTORE_DEFAULTS; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = 0; FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_sndctrlpipe(dev, 0x0), (unsigned char *)tscrn->setup_packet, NULL, 0, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("ioctl_touchscreen(%d): errror=%d status=%d.", minor, nRet, tscrn->ctrlout.status); return nRet; } dbg("ioctl_touchscreen(%d): status=%d nRet=%d", minor, tscrn->ctrlout.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("ioctl_touchscreen(%d): status=%d", minor, tscrn->ctrlout.status); return tscrn->ctrlout.status; }; default: return -ENOIOCTLCMD; } return 0; } /////////////////////////////////////////////////////////////////////////// static void * probe_touchscreen(struct usb_device *dev, unsigned int ifnum) { struct tscrn_usb_data *tscrn; struct usb_interface_descriptor *interface; struct usb_endpoint_descriptor *endpoint; #ifdef DEBUG int nRet,nCounter; #endif //devrequest *setup_packet; int ep_cnt; kdev_t minor; char valid_device = 0; char have_intr; if (vendor != -1 && product != -1) { info("probe_touchscreen: User specified USB touchscreen -- Vendor:Product - %x:%x", vendor, product); } /* * 1. Check Vendor/Product * 2. Determine/Assign Bulk Endpoints * 3. Determine/Assign Intr Endpoint */ /* * * NOTE: Just because a product is supported here does not mean that * applications exist that support the product. It's in the hopes * that this will allow developers a means to produce applications * that will support USB products. * * Until we detect a device which is pleasing, we silently punt. */ if( dev->descriptor.idVendor == MICROTOUCH_VENDOR_ID && dev->descriptor.idProduct == MICROTOUCH_PRODUCT_ID ) valid_device = 1; // no user specification devices !!! // -- else // -- /* User specified */ // -- if (dev->descriptor.idVendor == vendor // -- && dev->descriptor.idProduct == product) // -- valid_device = 1; if (!valid_device) return NULL; /* We didn't find anything pleasing */ if(ifnum != 0) { info("probe_touchscreen: not correct interface no."); return NULL; } /* * After this point we can be a little noisy about what we are trying to * configure. */ if (dev->descriptor.bNumConfigurations != 1) { info("probe_touchscreen: Only one device configuration is supported."); return NULL; } if (dev->config[0].bNumInterfaces != 1) { info("probe_touchscreen: Only one device interface is supported."); return NULL; } interface = dev->config[0].interface[ifnum].altsetting; //interface = dev->actconfig[0].interface[ifnum].altsetting; endpoint = interface[ifnum].endpoint; /* * Start checking for two bulk endpoints OR two bulk endpoints *and* one * interrupt endpoint. If we have an interrupt endpoint go ahead and * setup the handler. FIXME: This is a future enhancement... */ dbg("probe_touchscreen: Number of Endpoints:%d", (int) interface->bNumEndpoints); if (interface->bNumEndpoints != 1) { info("probe_touchscreen: Only one endpoints supported."); return NULL; } //ep_cnt = have_bulk_in = have_bulk_out = have_intr = 0; ep_cnt = have_intr = 0; if (IS_EP_INTR(endpoint[ep_cnt])) { have_intr = ++ep_cnt; dbg("probe_touchscreen: intr_ep:%d", have_intr); } else { info("probe_touchscreen: Undetected endpoint. Notify the maintainer."); return NULL; /* Shouldn't ever get here unless we have something weird */ } /* * Determine a minor number and initialize the structure associated * with it. The problem with this is that we are counting on the fact * that the user will sequentially add device nodes for the touchscreen * devices. */ /* * Use firs free file devices */ for (minor = 0; minor < TSCRN_MAX_MNR; minor++) { if (!p_tscrn_table[minor]) break; } /* Check to make sure that the last slot isn't already taken */ if (p_tscrn_table[minor]) { err("probe_touchscreen: No more minor devices remaining."); return NULL; } dbg("probe_touchscreen: Allocated minor:%d", minor); if (!(tscrn = kmalloc (sizeof (struct tscrn_usb_data), GFP_KERNEL))) { err("probe_touchscreen: Out of memory."); return NULL; } memset (tscrn, 0, sizeof(struct tscrn_usb_data)); dbg ("probe_touchscreen(%d): Address of tscrn:%p", minor, tscrn); /* Ok, now initialize all the relevant values */ if (!(tscrn->obuf = (char *)kmalloc(OBUF_SIZE, GFP_KERNEL))) { err("probe_touchscreen(%d): Not enough memory for the output buffer.", minor); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): obuf address:%p", minor, tscrn->obuf); if (!(tscrn->ibuf = (char *)kmalloc(IBUF_SIZE, GFP_KERNEL))) { err("probe_touchscreen(%d): Not enough memory for the input buffer.", minor); kfree(tscrn->obuf); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): ibuf address:%p", minor, tscrn->ibuf); if (!(tscrn->setup_packet = (void *)kmalloc(sizeof(*tscrn->setup_packet), GFP_KERNEL))) { err("probe_touchscreen(%d): Not enough memory for the statuc.", minor); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): setup_packet address:%p, size=%d size2=%d", minor, tscrn->setup_packet, sizeof(*tscrn->setup_packet),sizeof(devrequest)); memset((char *)tscrn->setup_packet, 0 , sizeof(*tscrn->setup_packet)); // Initiation input_dev structure tscrn->input_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); tscrn->input_dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT);//| BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); tscrn->input_dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); // Initialization toRead and toWrite variables tscrn->pToWrite = tscrn->obuf; tscrn->pToRead = NULL; // Initiation wait queue dbg("probe_touchscreen(%d): initialization wait_queue", minor); init_waitqueue_head(&tscrn->wait); dbg("probe_touchscreen(%d): wait_queue initialized", minor); #ifdef DEBUG /////////////////////////////////////////////////////////////////////////////////// // Only for testing, not for normal useing of device driver // Register the interface if(!(nRet = usb_interface_claimed(&dev->actconfig[0].interface[ifnum]))) { dbg("probe_touchscreen(%d): interface_claimed=%d", minor, nRet); usb_driver_claim_interface(&touchscreen_driver,&dev->actconfig[0].interface[ifnum],tscrn); } else dbg("probe_touchscreen(%d): error interface_claimed=%d", minor, nRet); dbg("probe_touchscreen(%d): Configuring CTRL handler for intr EP:%d", minor, have_intr); /* sends reset command */ // receive answer data tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE; tscrn->setup_packet->request = USB_REQ_GET_CONFIGURATION; tscrn->setup_packet->value = 0x0; tscrn->setup_packet->index = 0x0;//ifnum; tscrn->setup_packet->length = 1; FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, sizeof(tscrn->ibuf), ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("probe_touchscreen(%d): GET_CONFIGURATION:Get smth error=%d status=%d.", minor, nRet, tscrn->ctrlin.status); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } nCounter = 10; dbg("probe_touchscreen(%d): GET_CONFIGURATION:wait for data: status=%d nRet=%d", minor,tscrn->ctrlin.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("probe_touchscreen(%d): GET_CONFIGURATION:gets 0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1], tscrn->ctrlin.status, nRet); if(tscrn->ctrlin.status == (-32)) { dbg("probe_touchscreen(%d): get error -32 status=%d - reset pipe", minor,tscrn->ctrlin.status); nRet = usb_clear_halt(dev,0x00); dbg("probe_touchscreen(%d): get error -32 status=%d - reset pipe nRet=%d", minor,tscrn->ctrlin.status, nRet); } // // receive answer data tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_ENDPOINT; tscrn->setup_packet->request = USB_REQ_GET_STATUS; tscrn->setup_packet->value = 0x0; tscrn->setup_packet->index = 0x81; tscrn->setup_packet->length = 2; FILL_CONTROL_URB(&tscrn->ctrlin, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, sizeof(tscrn->ibuf), ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlin))) { err("probe_touchscreen(%d): GET_STATUS:Get smth error=%d status=%d .", minor, nRet, tscrn->ctrlin.status); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): GET_STATUS: status=%d nRet=%d", minor,tscrn->ctrlin.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("probe_touchscreen(%d): GET_STATUS:gets 0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2], tscrn->ctrlin.status, nRet); // -- // get controller id report tscrn->setup_packet->requesttype = USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE; tscrn->setup_packet->request = TSCRN_USB_REQUEST_CONTROLLER_ID; tscrn->setup_packet->value = 0; tscrn->setup_packet->index = 0; tscrn->setup_packet->length = TSCRN_USB_RAPORT_SIZE_ID; memset((char *)tscrn->ibuf,0,IBUF_SIZE); FILL_CONTROL_URB(&tscrn->ctrlout, dev, usb_rcvctrlpipe(dev, 0x80), (unsigned char *)tscrn->setup_packet, tscrn->ibuf, TSCRN_USB_RAPORT_SIZE_ID, ctrl_touchscreen, tscrn); if ((nRet=usb_submit_urb(&tscrn->ctrlout))) { err("probe_touchscreen(%d): GET_ID:error=%d status=%d .", minor, nRet, tscrn->ctrlout.status); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } dbg("probe_touchscreen(%d): GET_ID gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlout.status, nRet); interruptible_sleep_on(&tscrn->wait); dbg("probe_touchscreen(%d): GET_ID gets 0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x,0x%x status=%d nRet=%d", minor,(int)tscrn->ibuf[0],(int)tscrn->ibuf[1],(int)tscrn->ibuf[2],(int)tscrn->ibuf[3],(int)tscrn->ibuf[4],(int)tscrn->ibuf[5],(int)tscrn->ibuf[6],(int)tscrn->ibuf[7], tscrn->ctrlout.status, nRet); #endif //////////////////////////////////////////////////////////////////////////////////// /* Ok, if we detected an interrupt EP, setup a handler for it */ if (have_intr) { dbg("probe_touchscreen(%d): Configuring IRQ handler for intr EP:%d", minor, have_intr); FILL_INT_URB(&tscrn->irq, dev, usb_rcvintpipe(dev, 0x81),//endpoint[(int )(have_intr-1)].bEndpointAddress), tscrn->data, TSCRN_USB_RAPORT_SIZE_DATA, irq_touchscreen, tscrn, endpoint[(int)(have_intr-1)].bInterval); //2); if (usb_submit_urb(&tscrn->irq)) { err("probe_touchscreen(%d): Unable to allocate INT URB.", minor); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); kfree(tscrn); return NULL; } //the status will be -115 -> thist means EINPROGRESS, but it should be that. dbg("probe_touchscreen(%d): IRQ done interval=%d status=%d", minor,endpoint[(int)(have_intr-1)].bInterval, tscrn->irq.status); } tscrn->intr_ep = have_intr; tscrn->present = 1; tscrn->dev = dev; tscrn->minor = minor; tscrn->isopen = 0; input_register_device(&tscrn->input_dev); return p_tscrn_table[minor] = tscrn; } static void disconnect_touchscreen(struct usb_device *dev, void *ptr) { struct tscrn_usb_data *tscrn = (struct tscrn_usb_data *) ptr; //if(tscrn->intr_ep) //{ if(tscrn->irq.status != 0) { dbg("disconnect_touchscreen(%d): Unlinking IRQ URB", tscrn->minor); usb_unlink_urb(&tscrn->irq); } //} if(tscrn->ctrlin.status != 0) { dbg("disconnect_touchscreen(%d): Unlinking CTRLIN URB", tscrn->minor); usb_unlink_urb(&tscrn->ctrlin); } if(tscrn->ctrlout.status != 0) { dbg("disconnect_touchscreen(%d): Unlinking CTRLOUT URB", tscrn->minor); usb_unlink_urb(&tscrn->ctrlout); } input_unregister_device(&tscrn->input_dev); usb_driver_release_interface(&touchscreen_driver, &tscrn->dev->actconfig->interface[tscrn->ifnum]); kfree(tscrn->ibuf); kfree(tscrn->obuf); kfree(tscrn->setup_packet); dbg("disconnect_touchscreen: De-allocating minor:%d", tscrn->minor); p_tscrn_table[tscrn->minor] = NULL; kfree (tscrn); } static struct file_operations usb_touchscreen_fops = { read: read_touchscreen, //write: write_touchscreen, poll: poll_touchscreen, ioctl: ioctl_touchscreen, open: open_touchscreen, release: close_touchscreen, }; static struct usb_driver touchscreen_driver = { "touchscreen", probe_touchscreen, disconnect_touchscreen, { NULL, NULL }, &usb_touchscreen_fops, TSCRN_BASE_MNR }; void __exit usb_touchscreen_exit(void) { usb_deregister(&touchscreen_driver); } int __init usb_touchscreen_init (void) { if (usb_register(&touchscreen_driver) < 0) return -1; info("USB Touchscreen support registered."); return 0; } module_init(usb_touchscreen_init); module_exit(usb_touchscreen_exit); gpm-1.20.4/patches/todo/microtouch-usb/kernel-driver/touchscreen.h010060000017500001750000000102570760216311400240240ustar00niconico00/* -*- linux-c -*- */ /* * Driver for USB Touchscreen (Microtech - IBM SurePos 4820) * * Copyright (C) 2000 Wojciech Woziwodzki * Written by Radoslaw Garbacz * * The header file * * 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. * * Originally based upon scanner.c (David E. Nelson). * */ #include #include // CTRL numbers of commands define #define TSCRN_SOFT_RESET 73 #define TSCRN_HARD_RESET 74 #define TSCRN_CALIBRATE 75 #define TSCRN_CONTROLLER_STATUS 76 #define TSCRN_RESTORE_DEFAULTS 77 #define TSCRN_CONTROLLER_ID 78 #define TSCRN_REPORT_ENABLE 79 #define TSCRN_CLEAR_HALT 80 #define TSCRN_USER_REQUEST 81 #define TSCRN_CALIBRATION 82 // device requests define #define TSCRN_USB_REQUEST_RESET 7 #define TSCRN_USB_REQUEST_CALIBRATION 4 #define TSCRN_USB_REQUEST_STATUS 6 #define TSCRN_USB_REQUEST_RESTORE_DEFAULTS 8 #define TSCRN_USB_REQUEST_CONTROLLER_ID 10 // define requests parameters // for reset request #define TSCRN_USB_PARAM_SOFT_RESET 1 #define TSCRN_USB_PARAM_HARD_RESET 2 // for calibrate request #define TSCRN_EXTENDED_CALIBRATION_TYPE 1 #define TSCRN_CORNER_CALIBRATION_TYPE 2 // define raport sizes #define TSCRN_USB_RAPORT_SIZE_DATA 11 #define TSCRN_USB_RAPORT_SIZE_STATUS 8 #define TSCRN_USB_RAPORT_SIZE_ID 16 #define IBUF_SIZE TSCRN_USB_RAPORT_SIZE_ID //input data buffer 12 * data raports #define OBUF_SIZE TSCRN_USB_RAPORT_SIZE_DATA*12 #define MICROTOUCH_VENDOR_ID 0x0596 #define MICROTOUCH_PRODUCT_ID 0x0001 //the report no 1 field definitions #define IS_TOUCHED_BYTE(data) ((data & 0x40) ? 1:0) #define IS_TOUCHED(str) ((str->PenStatus & 0x40) ? 1:0) #define GET_XC(str) (str->XCompensHi<<8 | str->XCompensLo) #define GET_YC(str) (str->YCompensHi<<8 | str->YCompensLo) #define GET_XR(str) (str->XRawHi<<8 | str->XRawLo) #define GET_YR(str) (str->YRawHi<<8 | str->YRawLo) //#define GET_XC(str) (str->XCompensHi*256+str->XCompensLo) //#define GET_YC(str) (str->YCompensHi*256+str->YCompensLo) //#define GET_XR(str) (str->XRawHi*256+str->XRawLo) //#define GET_YR(str) (str->YRawHi*256+str->YRawLo) #define GET_LOOP(str) (str->LoopCounter) struct tscrn_usb_data_report { __u8 Id; // 0x01 for this report __u8 LoopCounter; __u8 PenStatus; // 7b = 1; 6b is 1 for touching, 0 when not touching __u8 XCompensLo; //compensed low 8 bits of the X coordinate __u8 XCompensHi; // high X __u8 YCompensLo; // low Y __u8 YCompensHi; // high Y __u8 XRawLo; //raw low 8 bits of the X coordinate __u8 XRawHi; // high X __u8 YRawLo; // low Y __u8 YRawHi; // high Y }; struct tscrn_usb_status_report { __u8 Id; // 0x06 __u16 POCStatus; // power on check status __u8 CMDStatus; // last commad status __u8 TouchStatus; // finger up/down __u8 Filter[3]; // filter, for future expansion }; struct tscrn_usb_controller_id_raport { __u8 Id; // 0x0C __u16 ControllerType; // Controller type __u8 FWMajorRevision; // firmware major revision level __u8 FMMinorRevision; // firmware minor revision level __u8 Features; // special features __u8 ROMChecksum; // ROM Checksum __u16 Reserved01; __u8 Reserved02; __u8 Reserved03; __u8 Reserved04; __u8 Reserved05; __u8 Reserved06; __u8 Reserved07; }; gpm-1.20.4/patches/todo/microtouch-usb/mice.c.patch010060000017500001750000000131450760216311400207360ustar00niconico00--- mice.c-old Tue Mar 7 15:10:00 2000 +++ mice.c Mon Jun 19 14:03:57 2000 @@ -58,6 +58,7 @@ #include /* MAJOR */ #include +#include #ifdef HAVE_LINUX_JOYSTICK_H #include @@ -200,6 +201,7 @@ /* real absolute coordinates for absolute devices, not very clean */ #define REALPOS_MAX 16383 /* min 0 max=16383, but due to change. */ +//#define REALPOS_MAX 0xFFFF /* min 0 max=16383, but due to change. */ int realposx=-1, realposy=-1; /*========================================================================*/ @@ -1070,6 +1072,130 @@ return 0; } +/** + * Convert data from usb devices to event type structure. + */ +static int M_usbmt(Gpm_Event *state, unsigned char *data) +{ + /* + * This is a simple decoder for the MicroTouch touch screen + * usb devices. It uses the "tablet" format and only generates button-1 + * events. Check README.microtouch for additional information. + */ + int x, y; + static int avgx=-1, avgy; /* average over time, for smooth feeling */ + static int upx, upy; /* keep track of last finger-up place */ + static struct timeval uptv, tv; /* time of last up, and down events */ + struct tscrn_usb_data_report *stData; + + #define REAL_TO_XCELL(x) ((x * win.ws_col / 0x3FFF)+1) + #define REAL_TO_YCELL(y) ((y * win.ws_row / 0x3FFF)+1) + + #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) + #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ + (t2.tv_usec-t1.tv_usec)/1000) + #define MIN_XR 0xaf0 + #define MAX_XR 0x34d0 + #define MIN_YR 0xc4e + #define MAX_YR 0x33f4 + #define XRAW_TO_X(x) (((x - MIN_XR)<=0?1:(x - MIN_XR)) * 0x3FFF / (MAX_XR - MIN_XR)) + #define YRAW_TO_Y(y) (((y - MIN_YR)<=0?1:(y - MIN_YR)) * 0x3FFF / (MAX_YR - MIN_YR)) + #define MIN_XC 0xc8 + #define MAX_XC 0xff78 + #define MIN_YC 0x0 + #define MAX_YC 0xff78 + #define XC_TO_X(x) (((x - MIN_XC)<=0?1:(x - MIN_XC)) * 0x3FFF / (MAX_XC - MIN_XC)) + #define YC_TO_Y(y) (((y - MIN_YC)<=0?1:(y - MIN_YC)) * 0x3FFF / (MAX_YC - MIN_YC)) + + stData = (struct tscrn_usb_data_report *)data; + if (!IS_TOUCHED(stData)) + { + /* + * finger-up event: this is usually offset a few pixels, + * so ignore this x and y values. And invalidate avg. + */ + upx = avgx; + upy = avgy; + GET_TIME(uptv); /* ready for the next finger-down */ + tv.tv_sec = 0; + state->buttons = 0; + avgx=-1; /* invalidate avg */ + return 0; + } + + /* based on compensated coordinates */ + //x = ((unsigned int)GET_XC(stData))>>2; + x = XC_TO_X(GET_XC(stData)); + if(x <= 0) x = 1; + if(x > 0x3fff) x = 0x3fff; + y = 0x3fff - YC_TO_Y(GET_YC(stData)); + //y = (0xffff - (unsigned int)(GET_YC(stData))>>2); + if(y <= 0) y = 1; + if(y > 0x3fff) y = 0x3fff; + /* based on X,Y raw coordinates */ + //x = XRAW_TO_X(GET_XR(stData)); + //if(x <= 0) x = 1; + //if(x > 0x3fff) x = 0x3fff; + //y = 0x3fff - YRAW_TO_Y(GET_YR(stData)); + //if(y <= 0) y = 1; + //if(y > 0x3fff) y = 0x3fff; + + //syslog(LOG_DEBUG,"coordinates Xc=%u Yc=%u",GET_XC(stData),GET_YC(stData)); + //syslog(LOG_DEBUG,"coordinates Xr=%u Yr=%u",GET_XR(stData),GET_YR(stData)); + //syslog(LOG_DEBUG," max X =%u Y =%u",win.ws_col,win.ws_row); + //syslog(LOG_DEBUG,"coordinates x =%u y =%u",x,y); + + if (avgx < 0) /* press event */ + { + GET_TIME(tv); + if (DIF_TIME(uptv, tv) < opt_time) + { + /* count as button press placed at finger-up pixel */ + state->buttons = GPM_B_LEFT; + realposx = avgx = upx; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = upy; state->y = REAL_TO_YCELL(realposy); + upx = (upx - x); /* upx and upy become offsets to use for this drag */ + upy = (upy - y); + return 0; + } + /* else, count as a new motion event */ + tv.tv_sec = 0; /* invalidate */ + realposx = avgx = x; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = y; state->y = REAL_TO_YCELL(realposy); + } + + state->buttons = 0; + if (tv.tv_sec) /* a drag event: use position relative to press */ + { + x += upx; + y += upy; + state->buttons = GPM_B_LEFT; + } + + realposx = avgx = (9*avgx + x)/10; state->x = REAL_TO_XCELL(realposx); + realposy = avgy = (9*avgy + y)/10; state->y = REAL_TO_YCELL(realposy); + + return 0; + + #undef XC_TO_X + #undef YC_TO_Y + #undef MIN_XC + #undef MAX_XC + #undef MIN_YC + #undef MAX_YC + #undef XRAW_TO_X + #undef YRAW_TO_Y + #undef MIN_XR + #undef MAX_XR + #undef MIN_YR + #undef MAX_YR + + #undef REAL_TO_XCELL + #undef REAL_TO_YCELL + #undef GET_TIME + #undef DIF_TIME +} + static int M_mtouch(Gpm_Event *state, unsigned char *data) { /* @@ -1768,6 +1894,15 @@ return type; } +static Gpm_Type *I_usbmt(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + //int i; + //for(i=0; i< argc; i++) + // syslog(LOG_DEBUG,"I_usbmt no=%d, val=%s",i,argv[i]); + return type; +} + static Gpm_Type *I_mtouch(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { @@ -2042,6 +2177,11 @@ {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + + // usb touch-screen 12-06-2000 RGA + {"usbmt", "MicroTouch touch-screens usb (only button-1 events, by now)", + "", M_usbmt, I_usbmt, STD_FLG, + {0x01, 0x01, 0x00, 0x00}, 11, 1, 0, 1, 0}, {"", "", "", NULL, NULL, 0, gpm-1.20.4/patches/todo/msuite.patch010060000017500001750000000056100760216311400161410ustar00niconico00--- gpm-1.18.1/gpm.h Fri Nov 12 15:27:37 1999 +++ gpm-1.18.2/gpm.h Wed Jan 5 09:45:52 2000 @@ -72,6 +72,13 @@ /*....................................... Cfg buttons */ +/* i think there are possible mouses with more, than 3 advanced buttons ? */ +#define GPM_B_ADVANCED5 128 +#define GPM_B_ADVANCED4 64 + +#define GPM_B_ADVANCED3 32 +#define GPM_B_ADVANCED2 16 +#define GPM_B_ADVANCED1 8 #define GPM_B_LEFT 4 #define GPM_B_MIDDLE 2 #define GPM_B_RIGHT 1 --- gpm-1.18.1/gpm-root.y Fri Nov 12 15:27:37 1999 +++ gpm-1.18.2/gpm-root.y Wed Jan 5 09:45:52 2000 @@ -214,6 +214,11 @@ button: T_BUTTON '1' {$$=GPM_B_LEFT;} | T_BUTTON '2' {$$=GPM_B_MIDDLE;} | T_BUTTON '3' {$$=GPM_B_RIGHT;} + | T_BUTTON '4' {$$=GPM_B_ADVANCED1;} + | T_BUTTON '5' {$$=GPM_B_ADVANCED2;} + | T_BUTTON '6' {$$=GPM_B_ADVANCED3;} + | T_BUTTON '7' {$$=GPM_B_ADVANCED4;} + | T_BUTTON '8' {$$=GPM_B_ADVANCED5;} ; menu: '{' {$$=cfgcurrent=cfg_alloc();} --- gpm-1.18.1/gpm.c Fri Nov 12 15:27:36 1999 +++ gpm-1.18.2/gpm.c Wed Jan 5 09:50:40 2000 @@ -411,7 +411,8 @@ event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ - nEvent.buttons = opt_sequence[nEvent.buttons]&7; /* change the order */ + nEvent.buttons = (nEvent.buttons & 0xf8) | /* 1111 1000 (mask for normal buttons) */ + opt_sequence[nEvent.buttons]&7; /* change the order */ oldB=newB; newB=nEvent.buttons; if (!i) event->buttons=nEvent.buttons; --- gpm-1.18.1/mice.c Fri Nov 12 15:27:37 1999 +++ gpm-1.18.2/mice.c Wed Jan 5 09:46:24 2000 @@ -74,6 +74,25 @@ * The return value is the number of unprocessed bytes */ +/* + * M_msuite function was written by Vadim V. Osikov aka Osa + * (osa@re.com.ua, http://re.com.ua/~osa) + */ + +static int M_msuite(Gpm_Event *state, unsigned char *data) { + if ( data [1] == GPM_EXTRA_MAGIC_1 && data [2] == GPM_EXTRA_MAGIC_2 ) { + // advanced side buttons are D5 (lower) - D3 (higher) + state -> buttons |= ( ( data [0] & 7) << 3 ) ; + } else { + state -> buttons = ((data[0] & 0x20) >> 3) /* left */ + | ((data[0] & 0x10) >> 4); /* right */ + state -> dx = (char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); + state -> dy = (char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); + // state -> dz = (signed char)((data [3] & 0xf) << 4) >> 4 ; + } + return 0 ; +} + static int M_ms(Gpm_Event *state, unsigned char *data) { /* @@ -1436,6 +1455,9 @@ */ Gpm_Type mice[]={ + {"msuite", "The MouseSuite 98 (side buttons and wheel) protocol.", + "", M_msuite, I_serial, CS7 | STD_FLG, + {0x40, 0x40, 0x40, 0x00}, 4, 1, 1, 0}, {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0}, gpm-1.20.4/patches/todo/pnp.patch010060000017500001750000000466010760216311400154350ustar00niconico00diff -uNrX gpm-ignore-files gpm-1.18.1/gpmInt.h gpm-1.18.1.eb1/gpmInt.h --- gpm-1.18.1/gpmInt.h Fri Nov 12 07:27:37 1999 +++ gpm-1.18.1.eb1/gpmInt.h Sun Jan 30 00:30:04 2000 @@ -67,6 +67,7 @@ int (*repeat_fun)(Gpm_Event *state, int fd); /* repeat this event into fd */ /* itz Mon Jan 11 23:27:54 PST 1999 */ + char *pnp_names[10]; } Gpm_Type; #define GPM_EXTRA_MAGIC_1 0xAA Binary files gpm-1.18.1/hltest and gpm-1.18.1.eb1/hltest differ diff -uNrX gpm-ignore-files gpm-1.18.1/mice.c gpm-1.18.1.eb1/mice.c --- gpm-1.18.1/mice.c Fri Nov 12 07:27:37 1999 +++ gpm-1.18.1.eb1/mice.c Sun Jan 30 03:19:45 2000 @@ -1189,6 +1189,349 @@ return type; } + +/* The routines: + * pnpgets, pnpparse, & pnpproto are by Kazutaka YOKOTA, see below. + * + * This is code ripped almost directly out of X to enable automatic + * protocol selection in gpm. + * + * Eric Biederman 30 January 2000 + */ +/* + * Copyright 1998 by Kazutaka YOKOTA + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Kazutaka YOKOTA not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Kazutaka YOKOTA makes no representations + * about the suitability of this software for any purpose. It is provided + * "as is" without express or implied warranty. + * + * KAZUTAKA YOKOTA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KAZUTAKA YOKOTA BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + + +static int pnpgets(int fd, char *buf) +{ + struct termios tty; + fd_set fds; + struct timeval timeout; + int i; + char c; + + /* + * Just put the device to 1200 baud. Thanks to Francois Chastrette + * for his great help and debugging with his own pnp device. + */ + tcgetattr(fd, &tty); + + tty.c_iflag = IGNBRK | IGNPAR; + tty.c_oflag = 0; + tty.c_lflag = 0; + tty.c_line = 0; + tty.c_cc[VTIME] = 0; + tty.c_cc[VMIN] = 1; + tty.c_cflag = (CS7 | CREAD | CLOCAL | HUPCL) | B1200; + tcsetattr(fd, TCSAFLUSH, &tty); /* set parameters */ + + /* toggle rts */ + ioctl(fd, TIOCMGET, &i); + i |= TIOCM_DTR; /* DTR = 1 */ + i &= ~TIOCM_RTS; /* RTS = 0 */ + ioctl(fd, TIOCMSET, &i); + usleep(200000); + + /* wait for response */ + tcflush(fd, TCIFLUSH); + i = TIOCM_DTR | TIOCM_RTS; /* DTR = 1, RTS = 1 */ + ioctl(fd, TIOCMBIS, &i); + + /* try to read something */ + FD_ZERO(&fds); + FD_SET(fd, &fds); + timeout.tv_sec = 0; + timeout.tv_usec = 200000; + if (select(FD_SETSIZE, &fds, NULL, NULL, &timeout) <= 0) + goto connect_idle; + + /* collect PnP COM device ID (2.1.7) */ + i = 0; + usleep(200000); /* the mouse must send `Begin ID' within 200msec */ + + while (read(fd, &c, 1) != 0) { + /* we may see "M", or "M3..." before `Begin ID' */ + if ((c == 0x08) || (c == 0x28)) { /* Begin ID */ + buf[i++] = c; + break; + } + } + + if (i <= 0) { + /* we haven't seen `Begin ID' in time... */ + goto connect_idle; + } + + ++c; /* make it `End ID' */ + for (;;) { + FD_ZERO(&fds); + FD_SET(fd, &fds); + timeout.tv_sec = 0; + timeout.tv_usec = 200000; + if (select(FD_SETSIZE, &fds, NULL, NULL, &timeout) <= 0) + break; + + read (fd, &buf[i], 1); + if (buf[i++] == c) /* End ID */ + break; + if (i >= 256) + break; + } + if (buf[i -1] != c) + goto connect_idle; + return i; + + /* + * According to PnP spec, we should set DTR = 1 and RTS = 0 while + * in idle state. But, `moused' shall set DTR = RTS = 1 and proceed, + * assuming there is something at the port even if it didn't + * respond to the PnP enumeration procedure. + */ + disconnect_idle: + i = TIOCM_DTR | TIOCM_RTS; /* DTR = 1, RTS = 1 */ + ioctl(fd, TIOCMBIS, &i); + connect_idle: + return 0; +} + +/* serial PnP ID string */ +typedef struct { + int revision; /* PnP revision, 100 for 1.00 */ + char *eisaid; /* EISA ID including mfr ID and product ID */ + char *serial; /* serial No, optional */ + char *class; /* device class, optional */ + char *compat; /* list of compatible drivers, optional */ + char *description; /* product description, optional */ + int neisaid; /* length of the above fields... */ + int nserial; + int nclass; + int ncompat; + int ndescription; +} pnpid_t; + +static int pnpparse(pnpid_t *id, char *buf, int len) +{ + char s[3]; + int offset; + int sum = 0; + int i, j; + + id->revision = 0; + id->eisaid = NULL; + id->serial = NULL; + id->class = NULL; + id->compat = NULL; + id->description = NULL; + id->neisaid = 0; + id->nserial = 0; + id->nclass = 0; + id->ncompat = 0; + id->ndescription = 0; + + offset = 0x28 - buf[0]; + + /* calculate checksum */ + for (i = 0; i < len - 3; ++i) { + sum += buf[i]; + buf[i] += offset; + } + sum += buf[len - 1]; + for (; i < len; ++i) + buf[i] += offset; + gpm_debug_log(LOG_DEBUG, "Mouse: PnP ID string: '%*.*s'\n", len, len, buf); + + /* revision */ + buf[1] -= offset; + buf[2] -= offset; + id->revision = ((buf[1] & 0x3f) << 6) | (buf[2] & 0x3f); + gpm_debug_log(LOG_DEBUG, "Mouse: PnP rev %d.%02d\n", + id->revision / 100, id->revision % 100); + + /* EISA vender and product ID */ + id->eisaid = &buf[3]; + id->neisaid = 7; + + /* option strings */ + i = 10; + if (buf[i] == '\\') { + /* device serial # */ + for (j = ++i; i < len; ++i) { + if (buf[i] == '\\') + break; + } + if (i >= len) + i -= 3; + if (i - j == 8) { + id->serial = &buf[j]; + id->nserial = 8; + } + } + if (buf[i] == '\\') { + /* PnP class */ + for (j = ++i; i < len; ++i) { + if (buf[i] == '\\') + break; + } + if (i >= len) + i -= 3; + if (i > j + 1) { + id->class = &buf[j]; + id->nclass = i - j; + } + } + if (buf[i] == '\\') { + /* compatible driver */ + for (j = ++i; i < len; ++i) { + if (buf[i] == '\\') + break; + } + /* + * PnP COM spec prior to v0.96 allowed '*' in this field, + * it's not allowed now; just igore it. + */ + if (buf[j] == '*') + ++j; + if (i >= len) + i -= 3; + if (i > j + 1) { + id->compat = &buf[j]; + id->ncompat = i - j; + } + } + if (buf[i] == '\\') { + /* product description */ + for (j = ++i; i < len; ++i) { + if (buf[i] == ';') + break; + } + if (i >= len) + i -= 3; + if (i > j + 1) { + id->description = &buf[j]; + id->ndescription = i - j; + } + } + + /* checksum exists if there are any optional fields */ + if ((id->nserial > 0) || (id->nclass > 0) + || (id->ncompat > 0) || (id->ndescription > 0)) { + gpm_debug_log(LOG_DEBUG, "Mouse: PnP checksum: 0x%02X\n", sum); + sprintf(s, "%02X", sum & 0x0ff); + if (strncmp(s, &buf[len - 3], 2) != 0) { +#if 0 + /* + * Checksum error!! + * I found some mice do not comply with the PnP COM device + * spec regarding checksum... XXX + */ + return 0; +#endif + } + } + + return 1; +} + +static Gpm_Type *pnplookup(char *s, int len) +{ + Gpm_Type *csr; + int index; + gpm_debug_log(LOG_DEBUG, "Mouse: PnP Looking up: %*.*s\n", len, len, s); + for(csr = mice; csr->fun; csr++) { + for(index = 0; csr->pnp_names[index]; index++) { + if (strncmp(csr->pnp_names[index], s, len) == 0) { + gpm_debug_log(LOG_DEBUG, "Mouse: PnP using: %*.*s\n", len, len, s); + return csr; + } + } + } + return NULL; +} + +static Gpm_Type *pnpproto(pnpid_t *id) +{ + Gpm_Type *type; + int i, j; + + if (id->nclass > 0) + if (strncmp(id->class, "MOUSE", id->nclass) != 0) + /* this is not a mouse! */ + return NULL; + + if (id->neisaid > 0) { + if (type = pnplookup(id->eisaid, id->neisaid)) { + return type; + } + } + + /* + * The 'Compatible drivers' field may contain more than one + * ID separated by ','. + */ + if (id->ncompat <= 0) + return NULL; + for (i = 0; i < id->ncompat; ++i) { + for (j = i; id->compat[i] != ','; ++i) + if (i >= id->ncompat) + break; + if (i > j) { + if (type = pnplookup(id->compat +j, i - j)) { + return type; + } + } + } + return NULL; +} + +static Gpm_Type *I_pnp_auto(int fd, unsigned short flags, struct Gpm_Type *type) +{ + int len; + char buf[256]; + pnpid_t pnpid; + int ret; + + ret = 0; + len = pnpgets(fd, buf); + + if (len) { + ret = pnpparse(&pnpid, buf, len); + } + if (ret == 0) { + return NULL; + } + + type = pnpproto(&pnpid); + if (type) { + type = type->init(fd, type->flags, type); + } + return type; +} + + +static int M_pnp_auto(Gpm_Event *state, unsigned char *data) +{ + return -1; +} + /* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) { @@ -1438,84 +1781,126 @@ Gpm_Type mice[]={ {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ - {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0, {}}, {"ms", "The original ms protocol, with a middle-button extension.", "", M_ms, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, { + }}, {"ms+", "Like 'ms', but allows dragging with the middle button.", "", M_ms_plus, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, {}}, {"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).", "", M_ms_plus_lr, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, {}}, {"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.", "Microsoft", M_bare, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, {}}, {"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.", "MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc}, + {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc, { + "PNP0F04", /* MouseSystems */ + "PNP0F05", /* MouseSystems */ + }}, {"sun", "'msc' protocol, but only 3 bytes per packet.", "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, {}}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, - {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, + {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0, {}}, {"logi", "Used in some Logitech devices (only serial).", "Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG, - {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0}, + {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0, { + "LGI8001", /* Logitech serial */ + "PNP0F08", /* Logitech serial */ + "PNP0F17", /* Logitech compatible serial */ + }}, {"bm", "Micro$oft busmice and compatible devices.", "BusMouse", M_bm, NULL, STD_FLG, /* bm is sun */ - {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0, { + "PNP0F00", /* MS bus */ + "PNP0F02", /* MS InPort */ + "PNP0F0D", /* MS InPort compatible */ + "PNP0F11", /* MS bus compatible */ + "PNP0F15", /* Logitech bus */ + "PNP0F18", /* Logitech bus compatible */ + }}, {"ps2", "Busmice of the ps/2 series. Most busmice, actually.", "PS/2", M_ps2, NULL, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0, { + "PNP0F03", /* MS PS/2 */ + "PNP0F0E", /* MS PS/2 compatible */ + "PNP0F12", /* Logitech PS/2 */ + "PNP0F13", /* PS/2 */ + "PNP0F19", /* Logitech PS/2 compatible */ + }}, {"ncr", "Ncr3125pen, found on some laptops", "", M_ncr, NULL, STD_FLG, - {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0}, + {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0, {}}, {"wacom", "Wacom graphire tablet: pen, mouse", "", M_wacom, I_wacom, STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 8, 8, 0, 0, 0}, + {0x80, 0x80, 0x80, 0x00}, 8, 8, 0, 0, 0, {}}, {"genitizer", "\"Genitizer\" tablet, in relative mode.", "", M_geni, I_serial, CS8|PARENB|PARODD, - {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, {}}, {"logim", "Turn logitech into Mouse-Systems-Compatible.", "", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0, {}}, {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, {}}, + {"pnp+", "Plug and pray. New mice may not run with '-t ms'.", + "", M_ms_plus, I_pnp, CS7 | STD_FLG, + {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, { + "KYEEZ00", /* Genius EZScroll */ + "KYE0001", /* Genius PnP Mouse */ + "PNP0F01", /* MS serial */ + "PNP0F09", /* MS BallPoint serial */ + "PNP0F0A", /* MS PnP serial */ + "PNP0F0B", /* MS PnP BallPoint serial */ + "PNP0F0C", /* MS serial comatible */ + "PNP0F0F", /* MS BallPoint compatible */ + }}, {"imps2", "Microsoft Intellimouse (ps2) - 3 buttons, wheel unused", "", M_ps2, I_imps2, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, {}}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0, { + "MSH0001", /* MS IntelliMouse */ + "MSH0004", /* MS IntelliMouse TrackBall */ + "KYE0003", /* Genius NetMouse */ + "LGI800C", /* Logitech MouseMan (4 button model) */ + "LGI8050", /* Logitech MouseMan+ */ + "LGI8051", /* Logitech FirstMouse+ */ + }}, {"netmouse", "Genius NetMouse - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, {}}, {"cal", "Calcomp UltraSlate", "", M_calus, I_calus, CS8 | CSTOPB | STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0}, + {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0, {}}, {"calr", "Calcomp UltraSlate - relative mode", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0}, + {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0, {}}, {"twid", "Twidddler keyboard", "", M_twid, I_twid, CS8 | STD_FLG, - {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0}, + {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0, {}}, {"syn", "The \"Synaptics\" serial TouchPad.", "synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG, - {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0}, + {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0, {}}, {"synps2", "The \"Synaptics\" PS/2 TouchPad", "synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG, - {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0}, + {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0, {}}, {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", "", M_brw, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0, { + "KYE0002", + }}, #ifdef HAVE_LINUX_JOYSTICK_H {"js", "Joystick mouse emulation", "Joystick", M_js, NULL, 0, - {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0}, + {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0, {}}, #endif {"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)", @@ -1523,19 +1908,38 @@ {0x98, 0x98, 0x00, 0x00}, 5, 1, 0, 1, R_summa}, {"mtouch", "MicroTouch touch-screens (only button-1 events, by now)", "", M_mtouch, I_mtouch, STD_FLG, - {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL}, + {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL, {}}, {"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)", "", M_summa, I_summa, STD_FLG, - {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0}, + {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0, {}}, {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, - {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0, {}}, + + {"auto", "Automatic PNP mouse selection", + "", M_pnp_auto, I_pnp_auto, 0, + {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0, {}}, {"", "", "", NULL, NULL, 0, - {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} + {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0, {NULL}} +#if notyet + { + "KML0001", /* Kensignton ThinkingMouse */ + "PNP0F06", /* Genius Mouse */ + "PNP0F07", /* Genius Mouse */ + "PNP0F10", /* TI QuickPort */ + "PNP0F14", /* MS Kids Mouse */ + "PNP0F16", /* Logitech SWIFT */ + "PNP0F1A", /* Logitech SWIFT compatible */ + "PNP0F1B", /* HP Omnibook */ + "PNP0F1C", /* Compaq LTE TrackBall PS/2 */ + "PNP0F1D", /* Compaq LTE TrackBall serial */ + "PNP0F1E", /* MS Kids TrackBall */ + } +#endif }; /*------------------------------------------------------------------------*/ gpm-1.20.4/patches/todo/pnp.reason010060000017500001750000000020160760216311400156150ustar00niconico00 > Attached is a patch that takes this functionality from XFree86 and > integrates it into gpm. And adds a mouse type specifically for this > auto detection. I though a while about this, and I'd like to do it in another way, to avoid clubbering the mouse table every so often. What I'd like to have is a "pnp.c" file, that includes the probing functions as well as the table of pnp mouse types. Similarly to synaptics and twiddler support, then, the functions in mice.c can call the ones defined in pnp.c. The advantage of this is that there is no need to change the mouse type data structure, and no need to add ID's of mice to the table of types, which will quickly become exceedingly long. Moreover, having the table of pnp ID's as an external object allows to export it to an external text file, so that adding support for a new mouse type (a pnp one) would be trivial: no more "plese try this patch, recompile and tell us if it works" to ask to users, just "pleas add this line to /etc/gpm-pnp.conf and try again". /alessandro gpm-1.20.4/patches/todo/read004070000017500001750000000000001075432545600144605ustar00niconico00gpm-1.20.4/patches/todo/read/alps_touchpad010060000017500001750000000161340760216311400173010ustar00niconico00From - Wed Jun 6 23:37:30 2001 Received: from localhost (rubini@localhost [127.0.0.1]) by morgana.systemy.it (8.9.3/8.9.3/Debian/GNU) with ESMTP id XAA19571 for ; Fri, 20 Oct 2000 23:39:21 +0200 Received: from pop by fetchmail-4.6.4 POP3 for (single-drop); Fri, 20 Oct 2000 23:39:21 MEST Received: from debye.prosa.it ([213.255.48.146]) by pop.systemy.it (8.8.8/8.8.3) with ESMTP id VAA03605 for ; Fri, 20 Oct 2000 21:10:11 +0200 Received: by debye.prosa.it (Postfix) id DBDB0BF70; Fri, 20 Oct 2000 21:07:30 +0200 (CEST) Delivered-To: rubini@prosa.it Received: from ns.prosa.it (ns.prosa.it [213.255.48.149]) by debye.prosa.it (Postfix) with ESMTP id CD41CBF6E; Fri, 20 Oct 2000 21:07:29 +0200 (CEST) Received: from wien.prosa.it (localhost [127.0.0.1]) by ns.prosa.it (Postfix) with ESMTP id 3106EA75E2; Fri, 20 Oct 2000 21:10:05 +0200 (CEST) Delivered-To: gpm@ns.prosa.it Received: from debye.prosa.it (debye.prosa.it [213.255.48.146]) by ns.prosa.it (Postfix) with ESMTP id 3B8A6A75D9 for ; Fri, 20 Oct 2000 21:09:58 +0200 (CEST) Received: by debye.prosa.it (Postfix) id A7481BF70; Fri, 20 Oct 2000 21:07:16 +0200 (CEST) Delivered-To: gpm@prosa.it Received: from penney.prosa.it (penney.prosa.it [213.255.48.131]) by debye.prosa.it (Postfix) with ESMTP id 91269BF6E for ; Fri, 20 Oct 2000 21:07:16 +0200 (CEST) Received: from mercure.math.u-bordeaux.fr (mercure.math.u-bordeaux.fr [147.210.16.143]) by penney.prosa.it (Postfix) with ESMTP id A51951B6007 for ; Fri, 20 Oct 2000 21:09:56 +0200 (CEST) Received: from math.u-bordeaux.fr (sadir.math.u-bordeaux.fr [147.210.16.221]) by mercure.math.u-bordeaux.fr (8.9.3/8.9.1) with ESMTP id VAA11093 for ; Fri, 20 Oct 2000 21:09:55 +0200 (MET DST) Received: (from allomber@localhost) by math.u-bordeaux.fr (8.9.3+Sun/8.9.1) id VAA09151; Fri, 20 Oct 2000 21:09:55 +0200 (MET DST) Date: Fri, 20 Oct 2000 21:09:55 +0200 (MET DST) Message-Id: <200010201909.VAA09151@math.u-bordeaux.fr> From: Bill Allombert To: gpm@prosa.it Cc: Bill.Allombert@math.u-bordeaux.fr Subject: [Gpm] patch for ALPS Glidepoint. Sender: gpm-admin@prosa.it Errors-To: gpm-admin@prosa.it X-BeenThere: gpm@lists.prosa.it X-Mailman-Version: 2.0beta4 Precedence: bulk Reply-To: gpm@prosa.it List-Id: X-UIDL: 37cc9bf9ea94901361d200f5338c6e93 Status: RO Hello, this is a patch for gpm 1.19.3. to handle ALPS GlidePoint in absolute mode. It maps tap as left button and left button as middle button. Drags finished because the finger is on the edge of the touchpad are locked until the drag restart. The patch for gpm.c allows the glidepoint to revert to absolute mode automatically, for example after a suspend. Best regards, Bill Allombert. allomber@math.u-bordaeux.fr ------------- diff -u gpm-1.19.3.orig/gpm.c gpm-1.19.3/gpm.c --- gpm-1.19.3.orig/gpm.c Tue Jul 18 14:06:06 2000 +++ gpm-1.19.3/gpm.c Thu Oct 19 22:36:31 2000 @@ -341,12 +341,24 @@ if ((data[0]&(m_type->proto)[0]) != (m_type->proto)[1]) { - if (m_type->getextra) + if (m_type->getextra==1) { data[1]=GPM_EXTRA_MAGIC_1; data[2]=GPM_EXTRA_MAGIC_2; gpm_debug_log(LOG_DEBUG,"Extra %02x",data[0]); return data; } + /* Bill Allombert Thu Oct 19 20:25:12 UTC 2000 */ + /* allow touchpads to revert automatically to absolute mode */ + if (m_type->getextra==2 && (data[0]&0xc8)==0x08) + { + /*TouchPad has returned to relative mode...*/ + /*read the packet...*/ + read(fd,data,2); + /*revert to absolute mode*/ + m_type=(m_type->init)(fd, m_type->flags, m_type,-1,NULL); + gpm_debug_log(LOG_DEBUG,"gpm: touchpad returned to absolute.\n"); + return NULL; + }/*end*/ gpm_debug_log(LOG_DEBUG,"Error in protocol"); return NULL; } diff -u gpm-1.19.3.orig/mice.c gpm-1.19.3/mice.c --- gpm-1.19.3.orig/mice.c Tue Mar 7 15:10:00 2000 +++ gpm-1.19.3/mice.c Thu Oct 19 22:46:43 2000 @@ -1280,6 +1280,65 @@ return 0; } +/* ALPS touchpad, ps2 version: Bill Allombert Thu Oct 19 20:19:54 UTC 2000 */ +static int M_alps2(Gpm_Event *state, unsigned char *data) +{ + /*driver for PS2 ALPS TouchPad in Advanced mode + (i.e. absolute x/y/z) + bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | + byte 0:| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | + byte 1:| 0 | X 6..0 | + byte 2:| 0 | X 10..7 | 0 | Finger | Gesture | + byte 3:| 0 | Y 9..7 | 1 |(Middle)| Right | Left | + byte 4:| 0 | Y 6..0 | + byte 5:| 0 | Z 6..0 | + */ + static int ox, oy, draglock=0, enter=0; + + long x = data[1] | ((data[2]&0x78)<<4); + long y = data[4] | ((data[3]&0x70)<<3); + long z = data[5]; + long tap = data[2]&1,finger=data[2]&2; + + if (!finger)/*leave touchpad*/ + { + state->dx = state->dy = 0; + /* if we are in the edges*/ + if (x<150 || y<150 || x>950 || y>700 ) + { + if (tap && ox==x && oy==y) + draglock=1; + } + else if (draglock) + { + draglock=0; + } + enter=0; + } + else if ( !enter ) /* enter touchpad */ + { + state->dx = state->dy = 0; + ox=x; oy=y; + enter=1; + } + else + { + /*resolution in 240 counts per inch*/ + /*geometry is normaly 47x31 mm */ + /*synaptic use roughly 6144 X counts ad reports 11%=676*/ + /*there is 47/25.4*240=444 counts here*/ + state->dx = (x-ox)/2; + state->dy = (y-oy)/2; + ox=x; oy=y; + } + if (draglock) tap=1; + state->buttons= + tap * GPM_B_LEFT + + ((data[3]&1)?GPM_B_MIDDLE:0) + + ((data[3]&2)?GPM_B_RIGHT:0); + return 0; +} + /*========================================================================*/ /* Then, mice should be initialized */ @@ -1913,6 +1972,26 @@ return type; } +/* ALPS touchpad, ps2 version: Bill Allombert Thu Oct 19 20:19:54 UTC 2000 */ +static Gpm_Type *I_alps2(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + int i; + unsigned char c = 0; + unsigned char magic[] = {0xf5, 0xf5, 0xf5, 0xf5, 0xf4}; + /* Switch to Advanced mode*/ + for (i=0; i\n",i,c); + return NULL; + } + } + return type; +} + /*========================================================================*/ /* Finally, the table */ #define STD_FLG (CREAD|CLOCAL|HUPCL) @@ -2043,6 +2122,9 @@ "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + {"alps2", "ALPS PS2 GlidePoint", + "glidepoint_ps2", M_alps2, I_alps2, STD_FLG, + {0xff, 0xff, 0x00, 0x00}, 6, 1, 2, 0, 0}, {"", "", "", NULL, NULL, 0, {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} __ Gpm mailing list at Gpm@lists.prosa.it Send help as subject to gpm-request@lists.prosa.it for help Archives at http://www.prosa.it/mailman/gpm gpm-1.20.4/patches/todo/read/gpm.screen.unified.diff010060000017500001750000000070400760216311400210410ustar00niconico00diff -uwr gpm-1.19.3.orig/liblow.c gpm-1.19.3/liblow.c --- gpm-1.19.3.orig/liblow.c Tue Jul 18 14:06:06 2000 +++ gpm-1.19.3/liblow.c Fri Dec 1 00:20:10 2000 @@ -77,7 +77,8 @@ unsigned char _gpm_buf[6*sizeof(short)]; unsigned short * _gpm_arg = (unsigned short *)_gpm_buf +1; -int gpm_consolefd=-1; /* used to invoke ioctl() */ +enum { GPM_FD_INVALID = -1, GPM_FD_SCREEN = -2 }; +int gpm_consolefd = GPM_FD_INVALID; /* used to invoke ioctl() */ int gpm_morekeys=0; /*-------------------------------------------------------------------*/ static inline int putdata(int where, Gpm_Connect *what) @@ -114,7 +115,14 @@ SIG_DFL != gpm_saved_winch_hook.sa_handler) { gpm_saved_winch_hook.sa_handler(signum); } /*if*/ - if (ioctl(gpm_consolefd, TIOCGWINSZ, &win) == -1) { + if (GPM_FD_SCREEN == gpm_consolefd) { + /* TODO: */ + win.ws_col = 80; + win.ws_row = 25; + } else if (gpm_consolefd <= 0) + /* safety check */ + return; + else if (ioctl(gpm_consolefd, TIOCGWINSZ, &win) == -1) { return; } /*if*/ if (!win.ws_col || !win.ws_row) { @@ -177,7 +185,7 @@ /*-------------------------------------------------------------------*/ int Gpm_Open(Gpm_Connect *conn, int flag) { - char tty[32]; + char tty[64]; char *term; int i; struct sockaddr_un addr; @@ -236,13 +244,40 @@ if (!t) goto err; strcpy(tty,t); if (strncmp(tty,"/dev/tty",8) || !isdigit(tty[8])) + { + char* sty = getenv("STY"); + /* as set by SCREEN, e.g + * STY=417.tty1.kristine + * ^hostname + */ + if (sty) + { + /* STY is set. Check, if it has a valid form */ + int n, vc; + if (strlen(sty) >= sizeof tty + || 3 != sscanf(sty, "%d.tty%d.%s", &n, &vc, tty)) + goto err; + else + { + /* we're inside a SCREEN session. Don't connect to + * the tty as below. TODO: how can we get lines + * and columns from SCREEN ? */ + gpm_consolefd = GPM_FD_SCREEN; + conn->vc = vc; + win.ws_col = 80; + win.ws_row = 25; + } + } + else goto err; + } + else conn->vc=atoi(tty+8); } else /* a default handler -- use console */ sprintf(tty,"/dev/tty0"); - if (gpm_consolefd==-1) + if (gpm_consolefd == GPM_FD_INVALID) /* NOT called for SCREEN */ if ((gpm_consolefd=open(tty,O_WRONLY))<0) { gpm_debug_log(LOG_ERR,"%s: %s",tty,strerror(errno)); @@ -254,6 +289,7 @@ /*....................................... Get screen dimensions */ + if (gpm_consolefd != GPM_FD_SCREEN) /* NOT called for SCREEN */ ioctl(gpm_consolefd, TIOCGWINSZ, &win); if (!win.ws_col || !win.ws_row) @@ -395,7 +431,7 @@ sigaction(SIGWINCH, &gpm_saved_winch_hook, 0); #endif close(gpm_consolefd); - gpm_consolefd=-1; + gpm_consolefd = GPM_FD_INVALID; return 0; } diff -uwr gpm-1.19.3.orig/special.c gpm-1.19.3/special.c --- gpm-1.19.3.orig/special.c Mon Jan 17 22:34:00 2000 +++ gpm-1.19.3/special.c Fri Dec 1 00:19:05 2000 @@ -26,6 +26,7 @@ /* This file is compiled conditionally, see the Makefile */ +#include /* OPEN_MAX */ #include #include #include gpm-1.20.4/patches/todo/reinit.patch010060000017500001750000000167510760216311400161350ustar00niconico00Only in gpm-1.17.9.mod: MODIFIED diff -u gpm-1.17.9/README gpm-1.17.9.mod/README --- gpm-1.17.9/README Fri Aug 6 01:35:34 1999 +++ gpm-1.17.9.mod/README Fri Jan 21 20:55:49 2000 @@ -268,3 +268,6 @@ Edmund Grimley Evans (edmund@vocalis.com) Added "-t ms+lr" +George Staikos (staikos@0wned.org) + Added support for auto-reinitialise of mouse. + Common subdirectories: gpm-1.17.9/doc and gpm-1.17.9.mod/doc diff -u gpm-1.17.9/gpm.c gpm-1.17.9.mod/gpm.c --- gpm-1.17.9/gpm.c Fri Aug 6 01:35:33 1999 +++ gpm-1.17.9.mod/gpm.c Fri Jan 21 20:50:40 2000 @@ -60,7 +60,7 @@ { DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, - DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, 0, (Gpm_Type *)NULL }, }; @@ -404,7 +404,7 @@ if ( ((data=getMouseData(fd,m_type,kd_mode))==NULL) || ((*(m_type->fun))(&nEvent,data)==-1) ) { - if (!i) return 0; + if (!i) return -1; else break; } @@ -865,27 +865,17 @@ unlink(GPM_NODE_CTL); } -/*-------------------------------------------------------------------*/ -int main(int argc, char **argv) -{ - int ctlfd, newfd; - struct sockaddr_un ctladdr; - int i, len, kd_mode, fd; - struct timeval timeout; - int maxfd=-1; - int pending; - Gpm_Event event; - prgname=argv[0]; - setuid(0); /* just in case... */ - -/*....................................... parse command line */ +/* + * Moved the initialization code in here so we can reuse it if + * the auto-reinit flag is set and the mouse is unplugged on us. + * + * George Staikos - Jan 21/2000 + */ - cmdline(argc, argv); - atexit(gpm_exited); +static inline int initMouse(int i, int *fd, int *maxfd) +{ - for (i=1; i <= 1+opt_double; i++) - { which_mouse=mouse_table+i; /* used to access options */ /* open the device with ndelay, to catch a locked device */ @@ -893,22 +883,22 @@ { if (!strcmp(opt_dev,"-")) fd=0; - else if ((fd=open(opt_dev,O_RDWR | O_NDELAY))<0) + else if ((*fd=open(opt_dev,O_RDWR | O_NDELAY))<0) { oops(opt_dev); } } else /* use "/dev/mouse" */ { opt_dev = "/dev/mouse"; - if ((fd=open(opt_dev,O_RDWR | O_NDELAY))<0) + if ((*fd=open(opt_dev,O_RDWR | O_NDELAY))<0) { oops(opt_dev); } } /* and then reset the flag */ - fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) & ~O_NDELAY); + fcntl(*fd,F_SETFL,fcntl(*fd,F_GETFL) & ~O_NDELAY); /* init the device, and change mouse type */ if (m_type->init) - m_type=(m_type->init)(fd, m_type->flags, m_type); + m_type=(m_type->init)(*fd, m_type->flags, m_type); if (!m_type) { oops("mouse initialization failed"); } @@ -916,13 +906,39 @@ { unsigned int modem_lines; - ioctl(fd, TIOCMGET, &modem_lines); + ioctl(*fd, TIOCMGET, &modem_lines); modem_lines &= ~opt_toggle; - ioctl(fd, TIOCMSET, &modem_lines); + ioctl(*fd, TIOCMSET, &modem_lines); } - which_mouse->fd=fd; - maxfd=max(fd, maxfd); + which_mouse->fd=*fd; + *maxfd=max(*fd, *maxfd); +} + + + +/*-------------------------------------------------------------------*/ +int main(int argc, char **argv) +{ + int ctlfd, newfd; + struct sockaddr_un ctladdr; + int i, len, kd_mode, fd; + struct timeval timeout; + int maxfd=-1; + int pending; + Gpm_Event event; + + prgname=argv[0]; + setuid(0); /* just in case... */ + +/*....................................... parse command line */ + + cmdline(argc, argv); + atexit(gpm_exited); + + for (i=1; i <= 1+opt_double; i++) + { + initMouse(i, &fd, &maxfd); } /*for*/ /*....................................... catch interesting signals */ @@ -1055,8 +1071,10 @@ which_mouse=mouse_table+i; /* used to access options */ if (FD_ISSET(which_mouse->fd,&selSet)) { + int rc; FD_CLR(which_mouse->fd,&selSet); pending--; - if (processMouse(which_mouse->fd, &event, m_type, kd_mode)) + rc = processMouse(which_mouse->fd, &event, m_type, kd_mode); + if (rc > 0) /* * pass it to the client, if any * or to the default handler, if any @@ -1065,6 +1083,16 @@ (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) || (cinfo[0] && do_client(cinfo[0], &event)) || do_selection(&event); + else if ((rc == -1) && opt_auto_reinit) { + /* try to reinitialise the mouse */ + gpm_debug_log(LOG_WARNING, + "Mouse was removed. Trying to reinitialise.\n"); + FD_CLR(which_mouse->fd, &selSet); + close(which_mouse->fd); + initMouse(i, &fd, &maxfd); + FD_CLR(which_mouse->fd, &selSet); + } + } else { } } diff -u gpm-1.17.9/gpmInt.h gpm-1.17.9.mod/gpmInt.h --- gpm-1.17.9/gpmInt.h Fri Aug 6 01:35:34 1999 +++ gpm-1.17.9.mod/gpmInt.h Fri Jan 21 20:19:38 2000 @@ -87,6 +87,7 @@ char *opt_type, *opt_dev, *opt_sequence; int opt_baud,opt_sample,opt_delta, opt_accel, opt_scale, opt_scaley; int opt_time, opt_cluster, opt_three, opt_toggle, opt_glidepoint_tap; + int opt_auto_reinit; Gpm_Type *m_type; int fd; }; @@ -110,7 +111,8 @@ #define opt_toggle (which_mouse->opt_toggle) #define opt_glidepoint_tap \ (which_mouse->opt_glidepoint_tap) - +#define opt_auto_reinit \ + (which_mouse->opt_auto_reinit) #define m_type (which_mouse->m_type) /* the other variables */ diff -u gpm-1.17.9/gpn.c gpm-1.17.9.mod/gpn.c --- gpm-1.17.9/gpn.c Fri Aug 6 01:35:33 1999 +++ gpm-1.17.9.mod/gpn.c Fri Jan 21 20:13:18 2000 @@ -212,7 +212,8 @@ " Use a non-existent type (e.g. \"help\") to get a list\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" - " -V verbosity increase number of logged messages\n", + " -V verbosity increase number of logged messages\n" + " -y automatically reinitialize when unplugged\n", DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT, DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; @@ -296,7 +297,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TyvV::23"; int i, opt; FILE *f; static struct {char *in; char *out;} seq[] = { @@ -374,6 +375,7 @@ break; case 't': opt_type=optarg; break; case 'T': opt_test++; break; + case 'y': opt_auto_reinit++; break; case 'v': printf(GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); exit(0); case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); diff -u gpm-1.17.9/mouse-test.c gpm-1.17.9.mod/mouse-test.c --- gpm-1.17.9/mouse-test.c Fri Aug 6 01:35:34 1999 +++ gpm-1.17.9.mod/mouse-test.c Fri Jan 21 20:18:57 2000 @@ -54,7 +54,7 @@ struct mouse_features mymouse = { DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, - DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, + DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_TOGGLE, DEF_GLIDEPOINT_TAP, 0, (Gpm_Type *)NULL }; Common subdirectories: gpm-1.17.9/sample and gpm-1.17.9.mod/sample gpm-1.20.4/patches/todo/solar_patches004070000017500001750000000000001075432545600163745ustar00niconico00gpm-1.20.4/patches/todo/solar_patches/gpm-1.19.6-owl-gpm-root.diff010060000017500001750000000357500760216311400231610ustar00niconico00diff -urN gpm-1.19.6.orig/conf/gpm-root.conf gpm-1.19.6/conf/gpm-root.conf --- gpm-1.19.6.orig/conf/gpm-root.conf Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/conf/gpm-root.conf Sat Oct 6 04:48:34 2001 @@ -18,7 +18,7 @@ "tty 8" f.jptty "8" "" f.nop "more of them..." { - + "tty 9" f.jptty "9" "tty 10" f.jptty "10" "tty 11" f.jptty "11" @@ -33,7 +33,6 @@ "tty 17" f.jptty "17" } } - } button 2 { @@ -47,12 +46,10 @@ "%b %d %Y" f.time "%H:%M" f.time "" f.nop - "load: " f.load + "load: " f.load "free:" f.free "" f.nop - "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" - "print mail headers to tty" f.bgcmd - "grep '^From ' /var/spool/mail/$USER | tail" + "report disk usage to ~/du" f.bgcmd "du ~ | sort -rn > ~/du" } button 3 { diff -urN gpm-1.19.6.orig/doc/doc.gpm.in gpm-1.19.6/doc/doc.gpm.in --- gpm-1.19.6.orig/doc/doc.gpm.in Thu Oct 4 01:35:54 2001 +++ gpm-1.19.6/doc/doc.gpm.in Sat Oct 6 04:48:34 2001 @@ -135,7 +135,6 @@ As of release 0.96, a default-handler is released with gpm, and can be used to handle Control-Mouse events to draw menus on the screen. -The @code{gpm-root} program, however, needs kernel 1.1.73 or newer. @xref{gpm-root}. Release 1.00 has been an incompatible one (is is incompatible with @@ -1945,17 +1944,9 @@ The program @code{gpm-root} is designed to handle Control-Mouse events to draw menus on the background of the current tty. The actual menus -are described by a configuration file in the user's home directory. - -Please note that @code{gpm-root} needs to run with Linux 1.1.73 or -newer, because previous kernels lack some screen handling capabilities -required by the program. +are described by the configuration file, @file{/etc/gpm-root.conf}. The program uses the files @file{/dev/vcs*} to draw to the console screen. -These are available only from kernel 1.1.81 onward. If you miss those -device nodes, you should create them using @code{create_vcs} in the -distribution directory. The tool won't run with kernels older than 1.1.81, -because they lacked a full screen dump/restore capability. Available command line options are the following: @@ -1966,14 +1957,6 @@ Allowed strings are @samp{shift}, @samp{anyAlt}, @samp{leftAlt}, @samp{rightAlt}, @samp{control}. -@item -u - Deny using user-specific configuration files. With this - option on, only @file{/etc/gpm-root.conf} will be used as a source - of configuration information. This option - is intended for those system administrators who fear security could - be broken by this daemon. Things should be sufficiently secure, but - if you find a hole please tell me about it. - @item -D Do not automatically enter background operation when started, and log messages to the standard error stream, not the syslog @@ -2172,9 +2155,8 @@ %M .SH BUGS -Known bugs have been fixed. In particular, if you invoke @code{gpm-root} -right after @code{gpm}, it will delay a few seconds before trying to connect -to the daemon. +Anyone with access to the console may cause @code{gpm-root} to run any of +the commands given in @file{/etc/gpm-root.conf} as root. @ignore .SH AUTHOR @@ -2184,7 +2166,6 @@ .nf /dev/gpmctl The socket used to connect to gpm. /etc/gpm-root.conf The default configuration file. -$(HOME)/.gpm-root The user configuration file. /dev/vcs* Virtual Console Screens .fi diff -urN gpm-1.19.6.orig/src/Makefile.in gpm-1.19.6/src/Makefile.in --- gpm-1.19.6.orig/src/Makefile.in Tue Oct 2 18:26:25 2001 +++ gpm-1.19.6/src/Makefile.in Sat Oct 6 04:57:41 2001 @@ -20,7 +20,7 @@ # Main portion: regular build rules -GSRC = gpm.c gpn.c mice.c special.c twiddler.c synaptics.c +GSRC = closeall.c gpm.c gpn.c mice.c special.c twiddler.c synaptics.c GOBJ = $(GSRC:.c=.o) debuglog.o devfs.o @@ -73,6 +73,7 @@ mouse-test: mice.o twiddler.o synaptics.o $(PROG): libgpm.a +gpm-root: closeall.o libgpm.so.@abi_full@: $(PICS) $(CC) @SOLDFLAGS@libgpm.so.@abi_lev@ \ @@ -86,13 +87,12 @@ STRIP = -s -install: check +install: check $(INSTALL_PROGRAM) gpm $(sbindir)/gpm + $(INSTALL_PROGRAM) gpm-root $(sbindir)/gpm-root $(INSTALL_DATA) -m 644 libgpm.a $(libdir)/libgpm.a $(INSTALL_DATA) -m 644 $(srcdir)/headers/gpm.h $(includedir)/gpm.h - for i in mev gpm-root; do \ - $(INSTALL_PROGRAM) $$i $(bindir)/$$i ;\ - done + $(INSTALL_PROGRAM) mev $(bindir)/mev $(INSTALL_PROGRAM) disable-paste $(bindir)/disable-paste # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional diff -urN gpm-1.19.6.orig/src/closeall.c gpm-1.19.6/src/closeall.c --- gpm-1.19.6.orig/src/closeall.c Thu Jan 1 03:00:00 1970 +++ gpm-1.19.6/src/closeall.c Sat Oct 6 04:48:34 2001 @@ -0,0 +1,27 @@ +#include +#include + +#ifdef __linux__ +#include +#endif + +int close_all(void) +{ + int fd, max; + + max = sysconf(_SC_OPEN_MAX); + if (max <= 0) + return -1; + +#ifdef __linux__ + if (max < NR_OPEN) + max = NR_OPEN; +#endif + + for (fd = 3; fd < max; fd++) { + if (close(fd) && errno != EBADF) + return -1; + } + + return 0; +} diff -urN gpm-1.19.6.orig/src/gpm-root.y gpm-1.19.6/src/gpm-root.y --- gpm-1.19.6.orig/src/gpm-root.y Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/src/gpm-root.y Sat Oct 6 04:50:11 2001 @@ -26,8 +26,6 @@ %{ -static char rcsid[] = "$Id: gpm-1.19.6-owl-gpm-root.diff,v 1.2 2002/05/28 19:13:57 nico Exp $"; - #include #include #include @@ -64,6 +62,8 @@ #define VCS_MAJOR 7 #endif +extern int close_all(void); + #define MAX_NR_USER_CONSOLES 63 /* needs __KERNEL__ */ #include "headers/gpmInt.h" /* itz Thu Aug 13 14:10:26 PDT 1998 @@ -78,6 +78,7 @@ #include "headers/wd.h" /* when debugging macros */ #define USER_CFG ".gpm-root" +#undef USER_CFG #define SYSTEM_CFG SYSCONFDIR "/gpm-root.conf" #define DEFAULT_FORE 7 @@ -117,7 +118,9 @@ /* provide defaults */ int opt_mod = 4; /* control */ int opt_buf = 0; /* ask the kernel about it */ +#ifdef USER_CFG int opt_user = 1; /* allow user cfg files */ +#endif @@ -134,7 +137,7 @@ typedef struct Draw { short width; /* length of longest item */ short height; /* the number of items */ - short uid; /* owner */ + int uid; /* owner */ short buttons; /* which button */ short fore,back,bord,head; /* colors */ char *title; /* name */ @@ -321,10 +324,18 @@ cfglineno++; } if (s[i]=='\\') s[i]=getc(cfgfile); + if (i>=sizeof(s)-1) + { + yyerror("line too long"); + if (s[i]!='\n') + while ((c=getc(cfgfile))!='\n' && c!=EOF); + cfglineno++; + break; + } + i++; } - /* get '"' as '\"' */ - while (s[i++]!='\"' && s[i-2] !='\\') + while (s[i-1]!='\"' && (i < 2 || s[i-2]!='\\')) ; s[i-1]=0; yylval.string=(char *)strdup(s); return T_STRING; @@ -342,7 +353,17 @@ } /* get a single word and convert it */ do - s[i++]=c; + { + if (i>=sizeof(s)-1) + { + yyerror("line too long"); + if (s[i]!='\n') + while ((c=getc(cfgfile))!='\n' && c!=EOF); + cfglineno++; + break; + } + s[i++]=c; + } while (isalnum(c=getc(cfgfile)) || c=='.'); ungetc(c,cfgfile); s[i]=0; @@ -447,9 +468,10 @@ /*====================================================================*/ void f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + if (setgid(pass->pw_gid) < 0 || + initgroups(pass->pw_name, pass->pw_gid) < 0 || + setuid(pass->pw_uid) < 0) + exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); @@ -525,7 +547,6 @@ /*---------------------------------------------------------------------*/ int f_bgcmd(int mode, DrawItem *self, int uid) { - int i; struct passwd *pass; switch (mode) @@ -545,10 +566,11 @@ if (!pass) exit(1); f__fix(pass); /* setgid(), setuid(), setenv(), ... */ close(0); close(1); close(2); - open("/dev/null",O_RDONLY); /* stdin */ - open("/dev/tty0",O_WRONLY); /* stdout */ - dup(1); /* stderr */ - for (i=3;iarg,(char *)NULL); exit(1); /* shouldn't happen */ @@ -683,22 +705,18 @@ FILE *f; double l1,l2,l3; - l1=l2=l3=0.0; - switch (mode) { case F_CREATE: /* modify name, just to fake its length */ - self->clientdata=malloc(strlen(self->name)+20); - self->name=realloc(self->name,strlen(self->name)+20); - strcpy(self->clientdata,self->name); - strcat(self->clientdata," %5.2f %5.2f %5.2f"); - sprintf(self->name,self->clientdata,l1,l2,l3); - break; + /* XXX: no failure checks */ + self->clientdata=strdup(self->name); + self->name=realloc(self->name,strlen(self->name)+3*20); case F_POST: if (!(f=fopen("/proc/loadavg","r"))) return 1; fscanf(f,"%lf %lf %lf",&l1,&l2,&l3); - sprintf(self->name,self->clientdata,l1,l2,l3); + sprintf(self->name,"%s %5.2f %5.2f %5.2f", + (char *)self->clientdata,l1,l2,l3); fclose(f); case F_INVOKE: @@ -714,24 +732,20 @@ long l1,l2; char s[80]; - l1=l2=0; switch (mode) { case F_CREATE: /* modify name, just to fake its length */ - self->clientdata=malloc(strlen(self->name)+30); - self->name=realloc(self->name,strlen(self->name)+30); - strcpy(self->clientdata,self->name); - strcat(self->clientdata," %5.2fM mem + %5.2fM swap"); - sprintf(self->name,self->clientdata,(double)l1,(double)l2); - break; + /* XXX: no failure checks */ + self->clientdata=strdup(self->name); + self->name=realloc(self->name,strlen(self->name)+2*30); case F_POST: if (!(f=fopen("/proc/meminfo","r"))) return 1; - fgets(s,80,f); - fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l1); - fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l2); - sprintf(self->name,self->clientdata, - (double)l1/1024/1024,(double)l2/1024/1024); + fgets(s,sizeof(s),f); + fgets(s,sizeof(s),f); sscanf(s,"%*s %*s %*s %ld",&l1); + fgets(s,sizeof(s),f); sscanf(s,"%*s %*s %*s %ld",&l2); + sprintf(self->name,"%s %5.2fM mem + %5.2fM swap", + (char *)self->clientdata,(double)l1/1024/1024,(double)l2/1024/1024); fclose(f); case F_INVOKE: @@ -751,6 +765,7 @@ { case F_CREATE: /* modify name, just to fake its length */ self->clientdata=self->name; + /* XXX: "format features" */ strftime(s,110,self->clientdata,broken); strcat(s,"1234567890"); /* names can change length */ self->name=(char *)strdup(s); @@ -832,20 +847,25 @@ /* the return value tells whether it has been newly loaded or not */ int getdraw(int uid, int buttons, time_t mtime1, time_t mtime2) { +#ifdef USER_CFG struct passwd *pass; +#endif struct stat buf; Draw *new, *np, *op, *pp; int retval=0; time_t mtime; gpm_debug_log(LOG_DEBUG,"getdraw: %i %i %li %li",uid,buttons,mtime1,mtime2); +#ifdef USER_CFG pass=getpwuid(uid); /* deny personal cfg to root for security reasons */ if (pass==NULL || !uid || !opt_user) { +#endif mtime=mtime2; uid=-1; strcpy(cfgname,SYSTEM_CFG); +#ifdef USER_CFG } else { @@ -853,6 +873,7 @@ strcpy(cfgname,pass->pw_dir); strcat(cfgname,"/" USER_CFG); } +#endif if (stat(cfgname,&buf)==-1) { @@ -926,7 +947,9 @@ "Usage: %s [options]\n",prgname); printf(" Valid options are\n" " -m modifier to use\n" +#ifdef USER_CFG " -u inhibit user configuration files\n" +#endif " -D don't auto-background and run as daemon\n" " -V increase amount of logged messages\n" ); @@ -972,12 +995,18 @@ int opt; gpm_log_daemon = 1; +#ifdef USER_CFG while ((opt = getopt(argc, argv,"m:uDV::")) != -1) +#else + while ((opt = getopt(argc, argv,"m:DV::")) != -1) +#endif { switch (opt) { case 'm': opt_mod=getmask(optarg, tableMod); break; +#ifdef USER_CFG case 'u': opt_user=0; break; +#endif case 'D': gpm_log_daemon = 0; break; case 'V': gpm_debug_level += (0 == optarg ? 1 : strtol(optarg, 0, 0)); @@ -1201,10 +1230,9 @@ int evflag; int recursenow=0; /* not on first iteration */ - prgname=argv[0]; - setuid(0); /* if we're setuid, force it */ + prgname = argv[0] ?: "gpm-root"; - if (getuid()) + if (getuid() != 0 || getuid() != geteuid()) { fprintf(stderr,"%s: Must be root\n", prgname); exit(1); @@ -1285,7 +1313,13 @@ } if (!vc) { - oops("can't open mouse connection"); + fprintf(stderr,"%s: Can't open mouse connection\n",prgname); + exit (1); + } + if (gpm_fd == -2) + { + fprintf(stderr,"%s: Can't run in an xterm or rxvt\n",prgname); + exit(2); } conn.eventMask=~0; /* grab everything away form selection */ @@ -1325,6 +1359,7 @@ /*....................................... Loop */ + posty = 0; while((evflag=Gpm_GetEvent(&ev))!=0) { if (do_resize) {get_winsize(); do_resize--;} diff -urN gpm-1.19.6.orig/src/special.c gpm-1.19.6/src/special.c --- gpm-1.19.6.orig/src/special.c Tue Oct 2 18:48:54 2001 +++ gpm-1.19.6/src/special.c Sat Oct 6 04:48:34 2001 @@ -38,6 +38,8 @@ #include "headers/gpmInt.h" +extern int close_all(void); + /* * This function is only called at button press, to avoid unnecessary * overhead due to function call at every mouse event @@ -67,7 +69,7 @@ */ int processSpecial(Gpm_Event *event) { - char *command=NULL; int i; + char *command=NULL; FILE *consolef; if ((event->type & GPM_TRIPLE) @@ -152,10 +154,11 @@ case 0: /* child */ close(0); close(1); close(2); - open(GPM_NULL_DEV,O_RDONLY); /* stdin */ - open(consolename,O_WRONLY); /* stdout */ - dup(1); /* stderr */ - for (i=3;i /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" @} button 3 @{ diff -ur gpm-1.19.6.orig/doc/gpm.info gpm-1.19.6/doc/gpm.info --- gpm-1.19.6.orig/doc/gpm.info Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/doc/gpm.info Fri Oct 5 08:48:17 2001 @@ -1626,7 +1626,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" } button 3 { diff -ur gpm-1.19.6.orig/doc/gpmdoc.ps gpm-1.19.6/doc/gpmdoc.ps --- gpm-1.19.6.orig/doc/gpmdoc.ps Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/doc/gpmdoc.ps Fri Oct 5 08:48:17 2001 @@ -3466,7 +3466,7 @@ 2190 y("")477 b(f.nop)430 2294 y("load:)46 b(")191 b(f.load)430 2398 y("free:")237 b(f.free)430 2501 y("---------")45 b(f.nop)430 2605 y("disk)h(usage")g(f.bgcmd)94 b("du)47 -b(|)g(sort)g(-rn)g(>)g(/tmp/du")334 2709 y(})334 2916 +b(|)g(sort)g(-rn)g(>)g(/var/run/du")334 2709 y(})334 2916 y(button)g(3)g({)430 3020 y(name)g("jump")430 3228 y(foreground)e (black)430 3332 y(background)g(red)430 3435 y(border)h(bright)g(yellow) 430 3539 y(head)h(bright)f(yellow)430 3747 y("tty1")94 diff -ur gpm-1.19.6.orig/doc/gpmdoc.txt gpm-1.19.6/doc/gpmdoc.txt --- gpm-1.19.6.orig/doc/gpmdoc.txt Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/doc/gpmdoc.txt Fri Oct 5 08:48:17 2001 @@ -1589,7 +1589,7 @@ "load: " f.load "free:" f.free "---------" f.nop - "disk usage" f.bgcmd "du | sort -rn > /tmp/du" + "disk usage" f.bgcmd "du | sort -rn > /var/run/du" } button 3 { diff -ur gpm-1.19.6.orig/src/gpn.c gpm-1.19.6/src/gpn.c --- gpm-1.19.6.orig/src/gpn.c Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/src/gpn.c Fri Oct 5 09:00:00 2001 @@ -224,16 +224,17 @@ static void check_uniqueness(void) { - static char tmp_pidfile[64]; + char tmp_pidfile[64]; int fd; FILE* fp = 0; - strncpy (tmp_pidfile, GPM_NODE_DIR "gpmXXXXXX", 63); + tmp_pidfile[0] = '\0'; + strncat(tmp_pidfile, GPM_NODE_DIR "gpmXXXXXX", sizeof(tmp_pidfile) - 1); if ((fd = mkstemp(tmp_pidfile)) == -1) { oops("mkstemp()"); } - if ((fp = fdopen(fd,"w")) != NULL) { + if ((fp = fdopen(fd, "w")) != NULL) { fprintf(fp,"%d\n",getpid()); fclose(fp); } else if (getuid()) { gpm-1.20.4/patches/todo/solar_patches/gpm-1.19.6-owl-warnings.diff010060000017500001750000000236700760216311400232430ustar00niconico00diff -ur gpm-1.19.6.orig/src/gpm.c gpm-1.19.6/src/gpm.c --- gpm-1.19.6.orig/src/gpm.c Tue Oct 2 00:02:25 2001 +++ gpm-1.19.6/src/gpm.c Sat Oct 6 04:45:26 2001 @@ -1144,9 +1144,9 @@ * or to the default handler, if any * or to the selection handler */ /* FIXME -- check event.vc */ - (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) - || (cinfo[0] && do_client(cinfo[0], &event)) - || do_selection(&event); + if (!(cinfo[event.vc] && do_client(cinfo[event.vc], &event))) + if (!(cinfo[0] && do_client(cinfo[0], &event))) + do_selection(&event); } } diff -ur gpm-1.19.6.orig/src/libcurses.c gpm-1.19.6/src/libcurses.c --- gpm-1.19.6.orig/src/libcurses.c Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/src/libcurses.c Sat Oct 6 04:45:26 2001 @@ -93,7 +93,7 @@ /* JD patch 11/08/1998 */ #define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; - extern gpm_convert_event(char *data, Gpm_Event *event); + extern int gpm_convert_event(unsigned char *data, Gpm_Event *event); int c; unsigned char mdata[4]; /* JD patch 11/08/1998 */ diff -ur gpm-1.19.6.orig/src/liblow.c gpm-1.19.6/src/liblow.c --- gpm-1.19.6.orig/src/liblow.c Tue Oct 2 00:08:47 2001 +++ gpm-1.19.6/src/liblow.c Sat Oct 6 04:45:26 2001 @@ -529,7 +529,7 @@ #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; - extern gpm_convert_event(unsigned char *data, Gpm_Event *event); + int gpm_convert_event(unsigned char *data, Gpm_Event *event); int c; unsigned char mdata[4]; if (nbprevchar) /* if there are some consumed char ... */ diff -ur gpm-1.19.6.orig/src/mice.c gpm-1.19.6/src/mice.c --- gpm-1.19.6.orig/src/mice.c Thu Sep 27 16:50:29 2001 +++ gpm-1.19.6/src/mice.c Sat Oct 6 04:45:26 2001 @@ -50,7 +50,7 @@ #include #include #include -#include +#include #include #include @@ -665,10 +665,10 @@ int treshold; } wcmodell[] = { /* ModellName Magic MaxX MaxY Border Tresh */ - "UltraPad" , "UD", 0, 0, 250, 20, - /* "Intuos" , "GD", 0, 0, 0, 20, not yet supported */ - "PenPartner", "CT", 0, 0, 0, 20, - "Graphire" , "ET", 5103, 3711, 0, 20 + {"UltraPad" , "UD", 0, 0, 250, 20}, + /*{"Intuos" , "GD", 0, 0, 0, 20}, not yet supported */ + {"PenPartner", "CT", 0, 0, 0, 20}, + {"Graphire" , "ET", 5103, 3711, 0, 20} }; #define IsA(m) ((WacomModell==(-1))? 0:!strcmp(#m,wcmodell[WacomModell].name)) @@ -1687,7 +1687,8 @@ /* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ /* Autodetect: Steve Bennett */ -static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +static Gpm_Type *I_imps2(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) { int id; static unsigned char basic_init[] = { GPM_AUX_ENABLE_DEV, GPM_AUX_SET_SAMPLE, 100 }; diff -ur gpm-1.19.6.orig/src/synaptics.c gpm-1.19.6/src/synaptics.c --- gpm-1.19.6.orig/src/synaptics.c Sun Sep 23 23:00:03 2001 +++ gpm-1.19.6/src/synaptics.c Sat Oct 6 04:46:45 2001 @@ -182,11 +182,12 @@ { 0, No_Action } /* flag value */ }; +#if 0 static corner_action_type *upper_left_action = &corner_actions [0]; static corner_action_type *lower_left_action = &corner_actions [1]; static corner_action_type *upper_right_action = &corner_actions [2]; static corner_action_type *lower_right_action = &corner_actions [3]; - +#endif /* ** These types are used to read the configuration data from the config file. @@ -212,43 +213,43 @@ static param_data_type param_data [] = { /* enabling configuration parameters */ - { "edge_motion_enabled", Flag_Param, &edge_motion_enabled }, - { "edge_motion_speed_enabled", Flag_Param, &edge_motion_speed_enabled }, - { "corner_taps_enabled", Flag_Param, &corner_taps_enabled }, - { "taps_enabled", Flag_Param, &taps_enabled }, - { "pressure_speed_enabled", Flag_Param, &pressure_speed_enabled }, - { "tossing_enabled", Flag_Param, &tossing_enabled }, - { "does_toss_use_static_speed", Flag_Param, &does_toss_use_static_speed }, + { "edge_motion_enabled", Flag_Param, {&edge_motion_enabled} }, + { "edge_motion_speed_enabled", Flag_Param, {&edge_motion_speed_enabled} }, + { "corner_taps_enabled", Flag_Param, {&corner_taps_enabled} }, + { "taps_enabled", Flag_Param, {&taps_enabled} }, + { "pressure_speed_enabled", Flag_Param, {&pressure_speed_enabled} }, + { "tossing_enabled", Flag_Param, {&tossing_enabled} }, + { "does_toss_use_static_speed", Flag_Param, {&does_toss_use_static_speed}}, /* pressure induced speed related configuration parameters */ - { "low_pressure", Integer_Param, &low_pressure }, - { "speed_up_pressure", Integer_Param, &speed_up_pressure }, - { "pressure_factor", Float_Param, &pressure_factor }, - { "standard_speed_factor", Float_Param, &standard_speed_factor }, + { "low_pressure", Integer_Param, {&low_pressure} }, + { "speed_up_pressure", Integer_Param, {&speed_up_pressure} }, + { "pressure_factor", Float_Param, {&pressure_factor} }, + { "standard_speed_factor", Float_Param, {&standard_speed_factor} }, /* toss/catch related parameters */ - { "min_toss_time", Integer_Param, &min_toss_time }, - { "max_toss_time", Integer_Param, &max_toss_time }, - { "toss_cleanup_time", Integer_Param, &toss_cleanup_time }, - { "min_toss_dist", Integer_Param, &min_toss_dist }, - { "static_toss_speed", Integer_Param, &static_toss_speed }, - { "toss_speed_factor", Float_Param, &toss_speed_factor }, + { "min_toss_time", Integer_Param, {&min_toss_time} }, + { "max_toss_time", Integer_Param, {&max_toss_time} }, + { "toss_cleanup_time", Integer_Param, {&toss_cleanup_time} }, + { "min_toss_dist", Integer_Param, {&min_toss_dist} }, + { "static_toss_speed", Integer_Param, {&static_toss_speed} }, + { "toss_speed_factor", Float_Param, {&toss_speed_factor} }, /* edge motion related configuration parameters */ - { "edge_speed", Integer_Param, &edge_speed }, + { "edge_speed", Integer_Param, {&edge_speed} }, /* corner tap actions */ - { "upper_left_action", Corner_Param, &corner_actions [0] }, - { "lower_left_action", Corner_Param, &corner_actions [1] }, - { "upper_right_action", Corner_Param, &corner_actions [2] }, - { "lower_right_action", Corner_Param, &corner_actions [3] }, + { "upper_left_action", Corner_Param, {&corner_actions [0]} }, + { "lower_left_action", Corner_Param, {&corner_actions [1]} }, + { "upper_right_action", Corner_Param, {&corner_actions [2]} }, + { "lower_right_action", Corner_Param, {&corner_actions [3]} }, /* use wmode */ - { "use_wmode", Flag_Param, &use_wmode }, - { "finger_threshold", Integer_Param, &finger_threshold }, - { "tap_lower_limit", Integer_Param, &tap_lower_limit }, - { "tap_upper_limit", Integer_Param, &tap_upper_limit }, - { "tap_range", Integer_Param, &tap_range }, - { "tap_interval", Integer_Param, &tap_interval }, - { "drag_lock", Flag_Param, &drag_lock }, - { "multiple_click_delay", Integer_Param, &multiple_click_delay }, + { "use_wmode", Flag_Param, {&use_wmode} }, + { "finger_threshold", Integer_Param, {&finger_threshold} }, + { "tap_lower_limit", Integer_Param, {&tap_lower_limit} }, + { "tap_upper_limit", Integer_Param, {&tap_upper_limit} }, + { "tap_range", Integer_Param, {&tap_range} }, + { "tap_interval", Integer_Param, {&tap_interval} }, + { "drag_lock", Flag_Param, {&drag_lock} }, + { "multiple_click_delay", Integer_Param, {&multiple_click_delay} }, /* end of list */ - { NULL, Flag_Param, NULL } + { NULL, Flag_Param, {NULL} } }; @@ -1080,6 +1081,7 @@ } } +#if 0 /* write 'cmd' to mode byte 1 */ static void ps2_set_mode1(int fd, byte cmd) @@ -1088,6 +1090,7 @@ ps2_putbyte(fd, 0xF3); ps2_putbyte(fd, 0x0A); } +#endif /* write 'cmd' to mode byte 2 */ static void ps2_set_mode2(int fd, @@ -1155,6 +1158,7 @@ cap->cap_palm_detect = check_bits (bytes[2], 0x01); } +#if 0 /* read the modes from the touchpad (in ps/2 format) */ static void read_ps2_modes (int fd) { @@ -1165,6 +1169,7 @@ gpm_debug_log (LOG_DEBUG,"PS/2 modes: %02X", bytes [2]); #endif } +#endif /* Translate the reported data into a record for processing */ static void syn_translate_ps2_report (unsigned char *data, @@ -1229,9 +1234,6 @@ static int drag_locked = 0; if (((data[0] & 0xc8) == 0x80) && ((data[3] & 0xc8) == 0xc0)) { - unsigned int w = ((data[3] & 0x04) >> 2) | - ((data[0] & 0x04) >> 1) | - ((data[0] & 0x30) >> 2); report->left = check_bits (data[0], 0x01); report->middle = check_bits (data[0] ^ data[3], 0x01); report->down = check_bits (data[0] ^ data[3], 0x02); gpm-1.20.4/patches/todo/solar_patches/gpm-1.19.6-rh-owl-socket-mode.diff010060000017500001750000000011500760216311400242210ustar00niconico00diff -ur gpm-1.19.6.orig/src/gpm.c gpm-1.19.6/src/gpm.c --- gpm-1.19.6.orig/src/gpm.c Tue Oct 2 00:02:25 2001 +++ gpm-1.19.6/src/gpm.c Sat Oct 6 03:27:06 2001 @@ -1030,10 +1030,10 @@ len=sizeof(ctladdr.sun_family)+strlen(GPM_NODE_CTL); if (bind(ctlfd,(struct sockaddr *)(&ctladdr),len)==-1) oops(ctladdr.sun_path); - maxfd=max(maxfd,ctlfd); + maxfd=max(maxfd,ctlfd); - /* needs to be 0777, so all users can _try_ to access gpm */ - chmod(GPM_NODE_CTL,0777); + if (chmod(GPM_NODE_CTL,0600)==-1) + oops(GPM_NODE_CTL); /*....................................... get screen dimensions */ gpm-1.20.4/patches/todo/suvil-gpm-patch010060000017500001750000000075430760216311400165640ustar00niconico00--- ../original-gpm-1.19.2/mice.c Tue Mar 7 15:10:00 2000 +++ mice.c Wed Jun 14 12:36:42 2000 @@ -305,7 +305,6 @@ return 0; } - /* Thu Jan 28 20:54:47 MET 1999 hof@hof-berlin.de SummaSketch reportformat */ static int R_summa(Gpm_Event *state, int fd) { @@ -332,7 +331,55 @@ return write(fd,buffer,5); } +/* Suvil Penbrush Professional tablet support absolute mode*/ +/* Summagraphics MM-Series format*/ +/* (Grzegorz Adam Hankiewicz) gradha@iname.com Wed Jun 14 11:32:27 CEST 2000 */ +int suvilmaxx,suvilmaxy; +static int M_suvil (Gpm_Event *state, unsigned char *data) +{ + int x, y; + + x = data[2] * 128 + data[1]; + y = data[4] * 128 + data[3]; + + if (x >= suvilmaxx) x = suvilmaxx; + if (y >= suvilmaxy) y = suvilmaxy; + + state->x = x * win.ws_col / suvilmaxx; + state->y = 1 + y * win.ws_row / suvilmaxy; + + realposx = x * REALPOS_MAX / suvilmaxx; + realposy = y * REALPOS_MAX / suvilmaxy; + + state->buttons = + !!(data[0]&1) * GPM_B_LEFT + + !!(data[0]&2) * GPM_B_RIGHT + + !!(data[0]&4) * GPM_B_MIDDLE; + return 0; +} + +/* Wed Jun 14 11:32:27 CEST 2000 gradha@iname.com */ +static int R_suvil(Gpm_Event *state, int fd) +{ + signed char buffer[5]; + static int x, y; + + buffer[0] = 0x98 + ((state->buttons & GPM_B_LEFT) > 0 ? 1:0) + + ((state->buttons & GPM_B_MIDDLE) > 0 ? 2:0) + + ((state->buttons & GPM_B_RIGHT) > 0 ? 3:0); + + x = realposx * suvilmaxx / REALPOS_MAX ; y = realposy; + + buffer[1] = x & 0x7f; + buffer[2] = (x >> 7) & 0x7f; + buffer[3] = y & 0x7f; + buffer[4] = (y >> 7) & 0x7f; + + + + return write (fd, buffer, 5); +} /* 'Genitizer' (kw@dtek.chalmers.se 11/12/97) */ static int M_geni(Gpm_Event *state, unsigned char *data) @@ -1768,6 +1815,57 @@ return type; } +static Gpm_Type *I_suvil(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + char byte; + char config[5]; + + #define SUVIL_SP66 0x06 + + write (fd, 0, 1); /* Reset */ + usleep (400000); /* wait */ + setspeed (fd, 1200, 1200, 1, B1200|CS7|CREAD|CLOCAL|HUPCL|PARENB|PARODD); + write (fd, 0, 1); /* Reset */ + usleep (400000); /* wait */ + + /* First try setting tablet to tablet mode */ + write (fd, "X", 1); + usleep (3000); + + /* Now set stablet speed to 9600 */ + setspeed (fd, 1200, 9600, 1, B9600|CS8|CREAD|CLOCAL|HUPCL|PARENB|PARODD); + + /* Set tablet to not report coordinates and ask model */ + write (fd, "D?", 2); + usleep (3000); + read (fd, &byte, 1); + + switch (byte) + { + case 'S': + case SUVIL_SP66: + byte = SUVIL_SP66; + /* Set upper left origin and read maximum resolution range */ + write (fd, "ba", 2); + read (fd, config, 5); + + suvilmaxx = config[2]*128+config[1]; + suvilmaxy = config[4]*128+config[3]; + + /* Finally set tablet to report absolute coordinates in stream mode */ + write (fd, "I!@", 3); + break; + + default: + /* Don't support this model */ + return NULL; + break; + } + + return type; +} + static Gpm_Type *I_mtouch(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { @@ -2043,6 +2141,9 @@ "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, + {"suvil", "Suvil Penbrush Professional (sp-66)", "", M_suvil, I_suvil, STD_FLG, + {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_suvil}, + {"", "", "", NULL, NULL, 0, {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} @@ -2068,7 +2169,7 @@ } - + /* * Use 4 as indent-level. It used to be 2, but new stuff will be inserted * using 4. gpm-1.20.4/patches/todo/suvil-gpm-patch.readme010060000017500001750000000000640760216311400200070ustar00niconico00Support for a new graphic tablet. Lokks good to me. gpm-1.20.4/patches/todo/xfree4.patch010060000017500001750000000133060760216311400160310ustar00niconico00Index: doc/doc.gpm --- doc/doc.gpm.orig Fri Mar 17 00:10:01 2000 +++ doc/doc.gpm Fri Mar 17 00:15:51 2000 @@ -398,6 +398,11 @@ behaviour of @file{selection-1.7}, but it is sometimes confusing. The default is not to show the pointer, which can be confusing as well. +@item -P + Use a pty as repeater device instead of a fifo, see @samp{-R}. + @file{/dev/gpmdata} will be a symbolic link to the pty. + XFree86 4.0 seems to need this. + @item -q Quit after changing mouse behaviour. This is intended to allow users to change the mouse @emph{feeling} (@samp{-a}, @samp{-B}, @samp{-d}, @@ -414,15 +419,17 @@ @item -R @var{name} Causes @code{gpm} to act as a repeater: any mouse data received while - in graphic mode will be produced on the fifo @file{/dev/gpmdata} - in protocol @var{name}. In principle, you can use the same + in graphic mode will be produced on the fifo (or symlink, see the + @samp{-P} option) @file{/dev/gpmdata} in protocol @var{name}. + In principle, you can use the same names as for the @samp{-t} option, although repeating into some protocols may not be implemented for a while. @xref{Mouse Types}. In addition, you can specify @samp{raw} as the @var{name}, to repeat the mouse data byte by byte, without any protocol translation. If @var{name} is omitted, it defaults to @samp{msc}. Using @i{gpm} in repeater mode, you can configure the X - server to use its fifo as a mouse device. This option is useful for + server to use @file{/dev/gpmdata} as a mouse device. + This option is useful for bus-mouse owners to override the single-open limitation. It is also an easy way to manage those stupid dual-mode mice which force you to keep the middle button down while changing video mode. The option Index: gpn.c --- gpn.c.orig Thu Mar 16 23:42:00 2000 +++ gpn.c Fri Mar 17 00:20:19 2000 @@ -45,6 +45,10 @@ #include #endif +#ifdef HAVE_PTY_H +#include +#endif + #ifndef HAVE___U32 typedef unsigned int __u32; #endif @@ -315,11 +319,68 @@ return type; } +#ifdef HAVE_OPENPTY +#include + +static int +find_pty(int* ttyfd, char ttyName[]) +{ + int master; + int ret = openpty(&master, ttyfd, ttyName, 0, 0); + + return (ret == 0 ? master : ret); +} + +#else /* HAVE_OPENPTY */ + +static const char* major = "pqrstuvwxyzabcde"; +static const char* minor = "0123456789abcdef"; + +static int +find_pty(int* ttyfd, char ttyName[]) +{ + char ptempl[] = "/dev/ptyXX"; + char ttempl[] = "/dev/ttyXX"; + int fd = -1; + const char* map; + const char* mip; + + for (map = major; *map && fd == -1; map++) + { + ptempl[8] = *map; + ttempl[8] = *map; + for (mip = minor; *mip && fd == -1; mip++) + { + int fd2; + ptempl[9] = *mip; + ttempl[9] = *mip; + +#ifndef O_NOCTTY +#define O_NOCTTY 0 +#endif + if ((fd = open(ptempl, O_RDWR)) != -1 && + (fd2 = open(ttempl, O_RDWR|O_NOCTTY)) != -1) + { + *ttyfd = fd2; + strcpy(ttyName, ttempl); + } + else + { + close(fd); + fd = -1; + } + } + } + + return fd; +} +#endif /* HAVE_OPENPTY */ + /*===================================================================*/ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pqr:R::s:S:t:TvV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pPqr:R::s:S:t:TvV::23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -369,6 +430,7 @@ which_mouse=mouse_table+2; break; case 'o': opt_options = optarg; break; case 'p': opt_ptrdrag=0; break; + case 'P': opt_ptyrep=1; break; case 'q': opt_quit++; gpm_log_daemon = 0; break; case 'r': /* being called responsiveness, I must take the inverse */ @@ -411,10 +473,24 @@ } if (opt_repeater) { - if (mkfifo(GPM_NODE_FIFO,0666) && errno!=EEXIST) - { oops(GPM_NODE_FIFO); } - if ((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK))<0) - { oops(GPM_NODE_FIFO); } + if (opt_ptyrep) + { + char tty_name[32]; + int ttyfd; + + if ((fifofd=find_pty(&ttyfd,tty_name))==-1) + { oops("can't find free pty"); } + unlink(GPM_NODE_FIFO); + if (symlink(tty_name,GPM_NODE_FIFO)==-1) + { oops(GPM_NODE_FIFO); } + } + else + { + if (mkfifo(GPM_NODE_FIFO,0666) && errno!=EEXIST) + { oops(GPM_NODE_FIFO); } + if ((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK))<0) + { oops(GPM_NODE_FIFO); } + } } Index: configure.in --- configure.in.orig Thu Mar 16 23:15:40 2000 +++ configure.in Thu Mar 16 23:40:33 2000 @@ -64,7 +64,7 @@ CURSES_OBJS=libcurses.o ; fi ;; esac -AC_CHECK_HEADERS(sys/sysmacros.h linux/major.h linux/tty.h) +AC_CHECK_HEADERS(sys/sysmacros.h linux/major.h linux/tty.h pty.h) ITZ_CHECK_TYPE(__u32,linux/types.h) if test ${itz_cv_type___u32} = yes || test ${ac_cv_type___u32} = yes ; then @@ -78,7 +78,8 @@ SHLIB= fi -AC_CHECK_FUNCS(vsyslog syslog) +AC_CHECK_LIB(util, openpty) +AC_CHECK_FUNCS(openpty vsyslog syslog) AC_FUNC_ALLOCA case $with_curses in Index: gpmInt.h --- gpmInt.h.orig Thu Mar 16 23:47:30 2000 +++ gpmInt.h Thu Mar 16 23:48:13 2000 @@ -128,6 +128,7 @@ extern time_t opt_age_limit; extern char *opt_special; extern int opt_rawrep; +extern int opt_ptyrep; extern int fifofd; extern char *consolename; /* the selected one */ Index: gpm.c --- gpm.c.orig Thu Mar 16 23:48:34 2000 +++ gpm.c Thu Mar 16 23:49:11 2000 @@ -79,6 +79,7 @@ int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ int opt_rawrep=0; +int opt_ptyrep=0; Gpm_Type *repeated_type=0; char *consolename = "/dev/tty0"; gpm-1.20.4/patches/todo/xterm-mouse-for-console.patch010060000017500001750000000153700760216311400213500ustar00niconico00 * xterm-style mouse reporting with "gpm" * -------------------------------------- * * With this patch, programs on the text console can use the mouse without * using "libgpm" by requesting to get mouse reports such as button click * events in xterm style (see "man 4 console_codes"). * * To let the 'ncurses' library take advantage of it, one has to add the * 'kmous' capability from xterm to the LINUX console terminfo description. * Recent ncurses versions (5.0) will then use it. * * The usual select and copy mechanism of gpm is still available by pressing * the CNTRL button while using the mouse. Only the SHIFT and ALT key can * be used as modifiers as described in the xterm interface. * * A patched terminal description "linux-mouse.tic" is included. Use command * tic linux-mouse.tic * to install it. Setting "TERM=linux-mouse" will switch to it. One can also * substitute the original "TERM=linux" description with it. It will not * cause any harm (in case you are still using an unpatched "gpm" or not using * the mouse at all). * * Advantages: * - There is no need for "libgpm" support in the ncurses library anymore. * IMHO ncurses could ship with the patched terminfo description for the * console and libgpm support could be removed. * - Simplified interface to mouse (i. e. same as xterm). * * Internals: * gpm will be made to query the status of the kernel 'mouse_report' variable * before updating selection. If mouse_report is set, gpm tells the kernel to * issue the xterm escape sequence to the program. * * Joerg Schoen 6/2000 * * This patch is under the GNU whatever-is-appropriate-here license. * * I can be reached via "JoergSchoen@maf.org". ONLY text emails please! * diff -Naur gpm.c gpm.c --- gpm.c Fri Nov 12 14:27:36 1999 +++ gpm.c Sun Jun 4 20:44:14 2000 @@ -41,6 +41,14 @@ #include /* KDGETMODE */ #include /* winsize */ +#include /* to use KG_SHIFT and so on */ + +/* These two flags in event->modifiers are used to + * signal mouse tracking for this console. + */ +#define MOUSE_REPORT 0x40 +#define MOUSE_REPORT2 0x80 + #include "gpmInt.h" #ifndef max @@ -166,8 +174,15 @@ if ((fd=open_console(O_WRONLY))<0) oops("open_console"); gpm_debug_log(LOG_DEBUG,"ctl %i, mode %i",(int)*buf, arg[4]); - if (ioctl(fd, TIOCLINUX, buf+sizeof(short)-1) < 0) - oops("ioctl(TIOCLINUX)"); + if (ioctl(fd, TIOCLINUX, buf+sizeof(short)-1) < 0) { + /* If we ask the kernel to report a mouse event (mode & 16), it + * could be that mouse report mode was switched off meanwhile, + * resulting in EINVAL. Just ignore it in this case. + */ + if(!((mode & 16) && errno == EINVAL)) + oops("ioctl(TIOCLINUX)"); + } + close(fd); if (mode < 3) { @@ -200,11 +215,58 @@ } /*-------------------------------------------------------------------*/ +static inline int do_mousereport(Gpm_Event *event) +{ + int x2,y2,mode; + + x2=event->x; y2=event->y; + if (x2<1) x2++; else if (x2>maxx) x2--; + if (y2<1) y2++; else if (y2>maxy) y2--; + + switch(GPM_BARE_EVENTS(event->type)) { + case GPM_MOVE: + case GPM_DRAG: + selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ + return 0; + case GPM_DOWN: + switch (event->buttons) { + case GPM_B_LEFT: mode = 0; break; + case GPM_B_MIDDLE: mode = 1; break; + case GPM_B_RIGHT: mode = 2; break; + default: + /* FIXME: Is that the right thing to do? */ + return 0; + } + break; + case GPM_UP: + /* Don't report button up in report mode 1 */ + if(!(event->modifiers & MOUSE_REPORT2)) return 0; + mode = 3; + break; + } + + if(event->modifiers & (1<modifiers & ((1<modifiers & ((1<x; y2=event->y; switch(GPM_BARE_EVENTS(event->type)) { @@ -506,6 +568,18 @@ event->modifiers=6; /* code for the ioctl */ if (ioctl(i,TIOCLINUX,&(event->modifiers))<0) oops("get_shift_state"); + + /* Get also state of mouse_report */ + { + char report_state = 7; + + if(ioctl(i,TIOCLINUX,&report_state) < 0) oops("get_mouse_report"); + + if(report_state) + event->modifiers |= report_state == 2 ? + (MOUSE_REPORT|MOUSE_REPORT2) : MOUSE_REPORT; + } + close(i); event->modifiers |= j; /* add mouse-specific bits */ event->vc = stat.v_active; diff -Naur linux-mouse.tic linux-mouse.tic --- linux-mouse.tic Thu Jan 1 01:00:00 1970 +++ linux-mouse.tic Sun Jun 4 20:34:33 2000 @@ -0,0 +1,29 @@ +linux-mouse|linux console with mouse support in xterm style, + am, bce, eo, mir, msgr, xenl, xon, + colors#8, it#8, ncv#18, pairs#64, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i\316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[?25l, + clear=\E[H\E[J, cnorm=\E[?25h\E[?0c, cr=^M, + csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^J, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, cvvis=\E[?25h\E[?0c, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, + dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E[?5h\E[?5l$<200/>, home=\E[H, hpa=\E[%i%p1%dG, + ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, + il1=\E[L, ind=^J, invis=\E[8m, kb2=\E[G, kbs=\177, kcbt=\E[Z, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kdch1=\E[3~, kend=\E[4~, kf1=\E[[A, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, + kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + kmous=\E[M, + khome=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, kspd=^Z, + nel=^M^J, op=\E[39;49m, rc=\E8, rev=\E[7m, ri=\EM, + rmacs=\E[10m, rmir=\E[4l, rmpch=\E[10m, rmso=\E[27m, + rmul=\E[24m, rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + sgr0=\E[m, smacs=\E[11m, smir=\E[4h, smpch=\E[11m, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, + u7=\E[6n, u8=\E[?6c, u9=\E[c, vpa=\E[%i%p1%dd, gpm-1.20.4/patches/todo/xterm-mouse-for-console.patch.readme010060000017500001750000000000660760216311400226000ustar00niconico00documentation is inside. Looks good to me /alessandro gpm-1.20.4/patches/todo/zephian-hull-1.19.5004070000017500001750000000000001075432545600166765ustar00niconico00gpm-1.20.4/patches/todo/zephian-hull-1.19.5/002_force_repeat_000010060000017500001750000000077220760216311400222720ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpm.c gpm-1.19.5/src/gpm.c --- gpm-1.19.5.orig/src/gpm.c Thu Oct 4 23:32:33 2001 +++ gpm-1.19.5/src/gpm.c Thu Oct 4 23:32:26 2001 @@ -79,6 +79,7 @@ int opt_ptrdrag=DEF_PTRDRAG; int opt_kill=0; int opt_repeater=0, opt_double=0; +int opt_force_repeat = 0; char* opt_repeater_type = 0; int opt_aged = 0; char *opt_special=NULL; /* special commands, like reboot or such */ @@ -379,7 +380,8 @@ do { j=read(fd,edata-i,i); /* edata is pointer just after data */ - if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep && j > 0) + if ((kd_mode!=KD_TEXT || opt_force_repeat) + && fifofd != -1 && opt_rawrep && j > 0) write(fifofd, edata-i, j); i-=j; } @@ -499,7 +501,7 @@ /*....................................... we're a repeater, aren't we? */ - if (kd_mode!=KD_TEXT) + if ((kd_mode!=KD_TEXT) || opt_force_repeat) { if (fifofd != -1 && ! opt_rawrep) { @@ -1127,17 +1129,16 @@ * but actually it only matters if you have events. */ { - int fd = open_console(O_RDONLY); - if (ioctl(fd, KDGETMODE, &kd_mode)<0) - oops("ioctl(KDGETMODE)"); - close(fd); - if (kd_mode != KD_TEXT && !opt_repeater) - { - wait_text(&mouse_table[1].fd); - maxfd=max(maxfd,mouse_table[1].fd); - readySet=connSet; - FD_SET(mouse_table[1].fd,&readySet); - continue; /* reselect */ + int fd = open_console(O_RDONLY); + if (ioctl(fd, KDGETMODE, &kd_mode)<0) + oops("ioctl(KDGETMODE)"); + close(fd); + if (kd_mode != KD_TEXT && !opt_repeater && !opt_force_repeat) { + wait_text(&mouse_table[1].fd); + maxfd=max(maxfd,mouse_table[1].fd); + readySet=connSet; + FD_SET(mouse_table[1].fd,&readySet); + continue; /* reselect */ } } /*....................................... got mouse, process event */ diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpn.c gpm-1.19.5/src/gpn.c --- gpm-1.19.5.orig/src/gpn.c Thu Oct 4 23:32:33 2001 +++ gpm-1.19.5/src/gpn.c Thu Oct 4 23:32:26 2001 @@ -172,6 +172,7 @@ " -R mouse-type enter repeater mode. X should read /dev/gpmdata\n" " like it was a mouse-type device. Default is MouseSystems.\n" " You can also specify \"raw\" to relay the raw device data.\n" + " -F Force always in repeat mode..\n" " -s sample-rate sets the sample rate (default %d)\n" " -S [commands] enable special commands (see man page)\n" " -t mouse-type sets mouse type (default '%s')\n" @@ -291,7 +292,7 @@ int cmdline(int argc, char **argv) { - char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:TveV::23"; + char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:FR::s:S:t:TveV::23"; int i, opt; static struct {char *in; char *out;} seq[] = { {"123","01234567"}, @@ -356,6 +357,12 @@ opt_repeater_type = "msc"; } /*if*/ break; + case 'F': + opt_force_repeat = 1; + opt_repeater++; + if (0 == opt_repeater_type) + opt_repeater_type = "msc"; + break; case 's': opt_sample = atoi(optarg); break; case 'S': if (optarg) opt_special=optarg; diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/headers/gpmInt.h gpm-1.19.5/src/headers/gpmInt.h --- gpm-1.19.5.orig/src/headers/gpmInt.h Thu Sep 20 16:56:25 2001 +++ gpm-1.19.5/src/headers/gpmInt.h Thu Oct 4 23:32:26 2001 @@ -171,6 +171,7 @@ extern int opt_test, opt_ptrdrag; extern int opt_kill; extern int opt_repeater, opt_double; +extern int opt_force_repeat; extern char* opt_repeater_type; extern int opt_kernel, opt_explicittype; extern int opt_aged; gpm-1.20.4/patches/todo/zephian-hull-1.19.5/003_wheel_000010060000017500001750000000122240760216311400207320ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpm.c gpm-1.19.5/src/gpm.c --- gpm-1.19.5.orig/src/gpm.c Thu Oct 4 23:33:48 2001 +++ gpm-1.19.5/src/gpm.c Thu Oct 4 23:33:37 2001 @@ -446,6 +446,7 @@ else { event->dx=event->dy=0; + event->wdx=event->wdy=0; nEvent.modifiers = 0; /* some mice set them */ FD_ZERO(&fdSet); FD_SET(fd,&fdSet); i=0; @@ -488,6 +489,10 @@ event->dx = (nEvent.x) - (event->x); event->dy = (nEvent.y) - (event->y); } + + /* propagate wheel */ + event->wdx += nEvent.wdx; + event->wdy += nEvent.wdy; select(fd+1,&fdSet,(fd_set *)NULL,(fd_set *)NULL,&timeout/* zero */); } diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/headers/gpm.h gpm-1.19.5/src/headers/gpm.h --- gpm-1.19.5.orig/src/headers/gpm.h Wed Sep 12 17:07:34 2001 +++ gpm-1.19.5/src/headers/gpm.h Thu Oct 4 23:33:37 2001 @@ -115,6 +115,7 @@ unsigned char buttons, modifiers; /* try to be a multiple of 4 */ unsigned short vc; short dx, dy, x, y; + short wdx, wdy; enum Gpm_Etype type; int clicks; enum Gpm_Margin margin; diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/mice.c gpm-1.19.5/src/mice.c --- gpm-1.19.5.orig/src/mice.c Thu Oct 4 23:33:48 2001 +++ gpm-1.19.5/src/mice.c Thu Oct 4 23:33:37 2001 @@ -359,16 +359,49 @@ /* m$ 'Intellimouse' (steveb 20/7/97) */ static int M_ms3(Gpm_Event *state, unsigned char *data) { + state->wdx = state->wdy = 0; + state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x10) >> 3) /* middle */ | ((data[0] & 0x10) >> 4); /* right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); - /* wheel (dz??) is (data[3] & 0x0f) */ + + switch (data[3] & 0x0f) { + case 0x0e: state->wdx = +1; break; + case 0x02: state->wdx = -1; break; + case 0x0f: state->wdy = +1; break; + case 0x01: state->wdy = -1; break; + } return 0; } +static int R_ms3(Gpm_Event *state, int fd) +{ + char buf[4] = {0, 0, 0, 0}; + + buf[0] |= 0x40; + + buf[0] |= ((state->buttons & GPM_B_LEFT) ? 0x20 : 0); + buf[3] |= ((state->buttons & GPM_B_MIDDLE) ? 0x10 : 0); + buf[0] |= ((state->buttons & GPM_B_RIGHT) ? 0x10 : 0); + + buf[1] = state->dx & ~0xC0; + buf[0] |= (state->dx & 0xC0) >> 6; + + buf[2] = state->dy & ~0xC0; + buf[0] |= (state->dy & 0xC0) >> 4; + + if (state->wdy > 0) + buf[3] |= 0x0f; + else if (state->wdy < 0) + buf[3] |= 0x01; + + return write(fd,buf,4); +} + + /* M_brw is a variant of m$ 'Intellimouse' the middle button is different */ static int M_brw(Gpm_Event *state, unsigned char *data) { @@ -499,6 +532,39 @@ return 0; } +static int M_imps2(Gpm_Event *state, unsigned char *data) +{ + static int tap_active=0; // there exist glidepoint ps2 mice + state->wdx = state->wdy = 0; // Clear them.. + + state->dx = state->dy = state->wdx = state->wdy = 0; + + state->buttons= ((data[0] & 1) << 2) // left + | ((data[0] & 6) >> 1); // middle and right + + if (data[0]==0 && opt_glidepoint_tap) // by default this is false + state->buttons = tap_active = opt_glidepoint_tap; + else if (tap_active) { + if (data[0]==8) + state->buttons = tap_active = 0; + else state->buttons = tap_active; + } + + // Standard movement.. + state->dx = (data[0] & 0x10) ? data[1] - 256 : data[1]; + state->dy = (data[0] & 0x20) ? -(data[2] - 256) : -data[2]; + + // The wheels.. + switch (data[3] & 0x0f) { + case 0x0e: state->wdx = +1; break; + case 0x02: state->wdx = -1; break; + case 0x0f: state->wdy = +1; break; + case 0x01: state->wdy = -1; break; + } + + return 0; +} + static int M_netmouse(Gpm_Event *state, unsigned char *data) { /* Avoid this beasts if you can. They connect to normal PS/2 port, @@ -2096,14 +2162,14 @@ "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"imps2","Microsoft Intellimouse (ps2) - autodetect 2/3 buttons,wheel unused", - "", M_ps2, I_imps2, STD_FLG, + "", M_imps2, I_imps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused", "ExplorerPS/2", M_ps2, I_exps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, - {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, + {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3}, {"netmouse", "Genius NetMouse (ps2) - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, gpm-1.20.4/patches/todo/zephian-hull-1.19.5/004_priv_elevation_000010060000017500001750000000034110760216311400226530ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpm-root.y gpm-1.19.5/src/gpm-root.y --- gpm-1.19.5.orig/src/gpm-root.y Sat Sep 15 17:17:19 2001 +++ gpm-1.19.5/src/gpm-root.y Thu Oct 4 23:34:39 2001 @@ -445,14 +445,19 @@ } /*====================================================================*/ -void f__fix(struct passwd *pass) +static int f__fix(struct passwd *pass) { - setgid(pass->pw_gid); - initgroups(pass->pw_name, pass->pw_gid); - setuid(pass->pw_uid); + /* CPhipps 2000/02/14 - + * Flag failure to drop priviledges */ + if (setgid(pass->pw_gid) || initgroups(pass->pw_name, pass->pw_gid) + || setuid(pass->pw_uid)) + return -1; + /* We don't mind if these fail */ setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); + /* Paranoia */ + return (chdir(pass->pw_dir) && chdir("/")); } /*---------------------------------------------------------------------*/ @@ -541,14 +546,16 @@ return 1; case 0: + /* CPhipps 2000/02/14 - we _must_ keep root priviledges as + * far as the f__fix call, otherwise that won't be able to + * drop groups. */ pass=getpwuid(uid); if (!pass) exit(1); - f__fix(pass); /* setgid(), setuid(), setenv(), ... */ - close(0); close(1); close(2); + if (f__fix(pass)) exit(1); /* Abort if not dropped completely */ + for (i=0;iarg,(char *)NULL); exit(1); /* shouldn't happen */ gpm-1.20.4/patches/todo/zephian-hull-1.19.5/005_types_000010060000017500001750000000304750760216311400210040ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpn.c gpm-1.19.5/src/gpn.c --- gpm-1.19.5.orig/src/gpn.c Thu Oct 4 23:35:50 2001 +++ gpm-1.19.5/src/gpn.c Thu Oct 4 23:35:38 2001 @@ -8,6 +8,10 @@ * * Tue, 5 Jan 1999 23:26:10 +0000, modified by James Troup * (usage): typo (s/an unexistent/a non-existent/) + * (cmdline): modified handling of -t command line argument, so it + * can be used by anyone regardless of whether or not a + * copy of gpm is already running. + * (usage): update for new -t option "types". * * 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 @@ -177,6 +181,7 @@ " -S [commands] enable special commands (see man page)\n" " -t mouse-type sets mouse type (default '%s')\n" " Use a non-existent type (e.g. \"help\") to get a list\n" + " or \"types\" to get a list of just the mnemonics.\n" " -T test: read mouse, no clients\n" " -v print version and exit\n" " -e output messages to stderr instead of syslog\n" @@ -368,7 +373,21 @@ if (optarg) opt_special=optarg; else opt_special=""; break; - case 't': opt_type=optarg; break; + case 't': + opt_type=optarg; + for (m_type=mice; m_type->fun; m_type++) + if (!strcmp(opt_type,m_type->name) + || !strcasecmp(opt_type,m_type->synonyms)) + break; + + if (!(m_type->fun)) { + /* not found */ + if (strcmp(opt_type,"types")==0) + exit(M_listTypes()); + else + exit(M_listMice()); + } + break; case 'T': opt_test++; break; case 'v': printf(GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); exit(0); case 'V': @@ -421,7 +440,7 @@ /* look for the mouse type */ m_type = find_mouse_by_name(opt_type); if (!m_type) /* not found */ - exit(M_listTypes()); + exit(M_listMice()); } /*for*/ if (opt_repeater) { diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/mice.c gpm-1.19.5/src/mice.c --- gpm-1.19.5.orig/src/mice.c Thu Oct 4 23:35:50 2001 +++ gpm-1.19.5/src/mice.c Thu Oct 4 23:35:45 2001 @@ -6,6 +6,12 @@ * Copyright (C) 1998,1999 Ian Zimmerman * Copyright (C) 2001 Nico Schottelius * + * Tue, 5 Jan 1999 23:44:58 +0000, modified by James Troup : + * Improved (?) descriptions of mouse types. + * (M_listMice): function used by -t help, reworked version of old + * M_listTypes. + * (M_listTypes): function used by -t types; lists only mnemonics. + * * 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 @@ -50,6 +56,7 @@ #include #include #include +#include #include #include @@ -2113,10 +2120,14 @@ */ Gpm_Type mice[]={ - {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", + {"mman", "The MouseMan protocol used by new Logitech mice.", + /* The \"MouseMan\" and similar devices (3/4 bytes per packet). */ "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0}, - {"ms", "The original ms protocol, with a middle-button extension.", + {"ms", "For Microsoft mice (2 or 3 buttons). Some old 2 button mice\n" + " send some spurious packets, which can be misunderstood as\n" + " middle-button events. If this is happens to you, use the\n" + " 'bare' mouse type.", "", M_ms, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"ms+", "Like 'ms', but allows dragging with the middle button.", @@ -2125,25 +2136,29 @@ {"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).", "", M_ms_plus_lr, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.", + {"bare", "For some 2 button Microsoft mice. Same as 'ms' except that\n" + " gpm will not attempt to simulate a third button.", "Microsoft", M_bare, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.", + {"msc", "For most 3 button serial mice.", + /* Mouse-Systems-Compatible (5bytes). Most 3-button mice. */ "MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG, {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc}, - {"sun", "'msc' protocol, but only 3 bytes per packet.", + {"sun", "For Sparc mice.", + /* 'msc' protocol, but only 3 bytes per packet. */ "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, - {"logi", "Used in some Logitech devices (only serial).", + {"logi", "For old serial Logitech mice.", "Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG, {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0}, - {"bm", "Micro$oft busmice and compatible devices.", + {"bm", "For some busmice, including Microsoft and Logitech busmice.", "BusMouse", M_bm, I_empty, STD_FLG, /* bm is sun */ {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, - {"ps2", "Busmice of the ps/2 series. Most busmice, actually.", + {"ps2", "For most busmice connected to a PS/2 port (round with 6 metal\n" + " pins).", "PS/2", M_ps2, I_empty, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"ncr", "Ncr3125pen, found on some laptops", @@ -2155,60 +2170,65 @@ {"genitizer", "\"Genitizer\" tablet, in relative mode.", "", M_geni, I_serial, CS8|PARENB|PARODD, {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, - {"logim", "Turn logitech into Mouse-Systems-Compatible.", + {"logim","For turning on the MouseSystems compatible mode (3 buttons)\n" + " of some Logitech mice.", "", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG, {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0}, - {"pnp", "Plug and pray. New mice may not run with '-t ms'.", + {"pnp", "For the new 'plug and play' mice produced by Microsoft.\n" + " Try it if '-t ms' does not work.", "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, - {"imps2","Microsoft Intellimouse (ps2) - autodetect 2/3 buttons,wheel unused", + {"imps2","For the Microsoft IntelliMouse on a PS/2 port (round\n" + " connector with 6 pins), 3 buttons (wheel is repeated).", + "", M_imps2, I_imps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused", "ExplorerPS/2", M_ps2, I_exps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, - {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", + {"ms3", "For the Microsoft IntelliMouse (serial), 3 buttons (wheel is repeated).", "", M_ms3, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3}, - {"netmouse", "Genius NetMouse (ps2) - 2 buttons and 2 buttons 'up'/'down'.", + {"netmouse","For the \"Genius NetMouse\". This one has two normal buttons plus\n" + " 'up'/'down' buttons.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, - {"cal", "Calcomp UltraSlate", + {"cal", "For a Calcomp UltraSlate", "", M_calus, I_calus, CS8 | CSTOPB | STD_FLG, {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0}, - {"calr", "Calcomp UltraSlate - relative mode", + {"calr", "For a Calcomp UltraSlate in relative mode.", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0}, - {"twid", "Twidddler keyboard", + {"twid", "For the \"Twidddler\" keyboard.", "", M_twid, I_twid, CS8 | STD_FLG, {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0}, - {"syn", "The \"Synaptics\" serial TouchPad.", + {"syn", "For the \"Synaptics\" serial TouchPad.", "synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0}, - {"synps2", "The \"Synaptics\" PS/2 TouchPad", + {"synps2", "For the \"Synaptics\" PS/2 TouchPad", "synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0}, - {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", + {"brw", "For the Fellowes Browser - 4 buttons (and a wheel) (dual protocol?).", "", M_brw, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, #ifdef HAVE_LINUX_JOYSTICK_H - {"js", "Joystick mouse emulation", + {"js", "For \"Joystick\" mouse emulation.", "Joystick", M_js, NULL, 0, {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0}, #endif - {"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)", + {"summa", "For a Summa/Genius tablet in absolute mode (906,1212B,EasyPainter...).", "", M_summa, I_summa, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_summa}, - {"mtouch", "MicroTouch touch-screens (only button-1 events, by now)", + {"mtouch", "For MicroTouch touch-screens (only button-1 events right now).", "", M_mtouch, I_mtouch, STD_FLG, {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL}, {"gunze", "Gunze touch-screens (only button-1 events, by now)", "", M_gunze, I_gunze, STD_FLG, {0xF9, 0x50, 0xF0, 0x30}, 11, 1, 0, 1, NULL}, - {"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)", + {"acecad", "For Acecad tablet in absolute mode (Sumagrapics MM-Series mode).", "", M_summa, I_summa, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0}, @@ -2224,18 +2244,37 @@ /*------------------------------------------------------------------------*/ /* and the help */ -int M_listTypes(void) +int M_listMice(void) { Gpm_Type *type; printf("\n" GPM_NAME " " GPM_RELEASE ", " GPM_DATE "\n"); printf("Available mouse types are:\n\n"); - printf("r name synonym description\n\n"); - for (type=mice; type->fun; type++) - printf("%c %-8s %s\n Synonyms: %s\n", type->repeat_fun ?'*':' ', - type->name, type->desc, type->synonyms); + printf("name (synonym) description\n\n"); + for (type=mice; type->fun; type++) { + char buffer[30]; + if (type->synonyms[0]=='\0') + sprintf(buffer,"%s",type->name); + else + sprintf(buffer,"%s (%s)",type->name,type->synonyms); + printf("%-18s - %s\n",buffer, type->desc); + } putchar('\n'); + + return 1; /* to exit() */ +} + +int M_listTypes(void) +{ + Gpm_Type *type; + + /* Only print the mouse mnemonics so that it is easy to parse */ + for (type=mice; type->fun; type++) { + printf("%s\n",type->name); + if (type->synonyms[0]!='\0') + printf("%s\n", type->synonyms); + } return 1; /* to exit() */ } gpm-1.20.4/patches/todo/zephian-hull-1.19.5/006_version_000010060000017500001750000000010460760216311400213160ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/configure.in gpm-1.19.5/configure.in --- gpm-1.19.5.orig/configure.in Thu Sep 20 17:27:21 2001 +++ gpm-1.19.5/configure.in Thu Oct 4 23:36:45 2001 @@ -13,9 +13,9 @@ dnl These are chosen so that we can switch to the libtool scheme dnl transparently. -abi=19 -abi_age=18 -abi_rev=0 +abi=20 +abi_age=19 +abi_rev=5 abi_lev=`expr $abi - $abi_age` abi_full=$abi_lev.$abi_age.$abi_rev gpm-1.20.4/patches/todo/zephian-hull-1.19.5/007_doc_fix_000010060000017500001750000000031470760216311400212510ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/doc/doc.gpm gpm-1.19.5/doc/doc.gpm --- gpm-1.19.5.orig/doc/doc.gpm Wed Sep 19 16:22:22 2001 +++ gpm-1.19.5/doc/doc.gpm Thu Oct 4 23:37:34 2001 @@ -403,7 +403,7 @@ Set the responsiveness. A higher responsiveness is used for a faster cursor motion. -@item -R @var{name} +@item -R@var{name} Causes @code{gpm} to act as a repeater: any mouse data received while in graphic mode will be produced on the fifo @file{/dev/gpmdata} in protocol @var{name}. In principle, you can use the same diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/gpn.c gpm-1.19.5/src/gpn.c --- gpm-1.19.5.orig/src/gpn.c Thu Oct 4 23:37:40 2001 +++ gpm-1.19.5/src/gpn.c Thu Oct 4 23:37:34 2001 @@ -173,7 +173,7 @@ " -p draw the pointer while striking a selection\n" " -q quit after changing mouse behaviour\n" " -r number sets the responsiveness (default %i)\n" - " -R mouse-type enter repeater mode. X should read /dev/gpmdata\n" + " -Rmouse-type enter repeater mode. X should read /dev/gpmdata\n" " like it was a mouse-type device. Default is MouseSystems.\n" " You can also specify \"raw\" to relay the raw device data.\n" " -F Force always in repeat mode..\n" gpm-1.20.4/patches/todo/zephian-hull-1.19.5/008_ps2_init_000010060000017500001750000000224360760216311400213700ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/doc/doc.gpm gpm-1.19.5/doc/doc.gpm --- gpm-1.19.5.orig/doc/doc.gpm Thu Oct 4 23:38:13 2001 +++ gpm-1.19.5/doc/doc.gpm Thu Oct 4 23:38:08 2001 @@ -421,6 +421,8 @@ @item -s @var{number} Set the sample rate for the mouse device. + This currently only does anything for the ps2, imps2, and logi + protocols. @item -S @var{commands} Enable special-command processing, and optionally specify custom diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/headers/defines.h gpm-1.19.5/src/headers/defines.h --- gpm-1.19.5.orig/src/headers/defines.h Wed Sep 19 08:56:43 2001 +++ gpm-1.19.5/src/headers/defines.h Thu Oct 4 23:38:08 2001 @@ -54,6 +54,7 @@ #define GPM_AUX_SET_SAMPLE 0xF3 /* Set sample rate */ #define GPM_AUX_ENABLE_DEV 0xF4 /* Enable aux device */ #define GPM_AUX_DISABLE_DEV 0xF5 /* Disable aux device */ +#define GPM_AUX_DEFAULTS 0xF6 /* Reset to defaults */ #define GPM_AUX_RESET 0xFF /* Reset aux device */ #define GPM_AUX_ACK 0xFA /* Command byte ACK. */ diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/headers/gpmInt.h gpm-1.19.5/src/headers/gpmInt.h --- gpm-1.19.5.orig/src/headers/gpmInt.h Thu Oct 4 23:38:13 2001 +++ gpm-1.19.5/src/headers/gpmInt.h Thu Oct 4 23:38:08 2001 @@ -78,6 +78,7 @@ #define GPM_AUX_SET_SAMPLE 0xF3 /* Set sample rate */ #define GPM_AUX_ENABLE_DEV 0xF4 /* Enable aux device */ #define GPM_AUX_DISABLE_DEV 0xF5 /* Disable aux device */ +#define GPM_AUX_DEFAULTS 0xF6 /* Reset to defaults */ #define GPM_AUX_RESET 0xFF /* Reset aux device */ #define GPM_AUX_ACK 0xFA /* Command byte ACK. */ diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/mice.c gpm-1.19.5/src/mice.c --- gpm-1.19.5.orig/src/mice.c Thu Oct 4 23:38:13 2001 +++ gpm-1.19.5/src/mice.c Thu Oct 4 23:38:08 2001 @@ -1719,82 +1719,112 @@ * * Returns 0 if OK, or >0 if 1 or more errors occurred. */ -static int write_to_mouse(int fd, unsigned char *data, size_t len) +static int write_ps2(int fd, unsigned char cmd0, unsigned char cmd1, + size_t num, unsigned long int sleep) { - int i; - int error = 0; - for (i = 0; i < len; i++) { - unsigned char c; - write(fd, &data[i], 1); - read(fd, &c, 1); - if (c != GPM_AUX_ACK) { + int i, error = 0, rcnt; + unsigned char cmd[2], ret[512]; + + cmd[0] = cmd0; cmd[1] = cmd0; + + write(fd, cmd, num); + if (sleep == -1) + usleep(50000); + else + usleep(sleep); + + rcnt = read(fd, ret, sizeof(ret)); + if (rcnt != num) + error++; + + for (i = 0; i < rcnt; i++) { + if (ret[i] != GPM_AUX_ACK) error++; - } } - - /* flush any left-over input */ - usleep (30000); - tcflush (fd, TCIFLUSH); return(error); } - /* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ /* Autodetect: Steve Bennett */ -static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type) +static Gpm_Type *I_ps2(int fd, unsigned short flags, struct Gpm_Type *type, + int argc, char **argv) { - int i; - int id; - static unsigned char basic_init[] = { GPM_AUX_ENABLE_DEV, GPM_AUX_SET_SAMPLE, 100 }; - static unsigned char imps2_init[] = { GPM_AUX_SET_SAMPLE, 200, GPM_AUX_SET_SAMPLE, 100, GPM_AUX_SET_SAMPLE, 80, }; - static unsigned char ps2_init[] = { GPM_AUX_SET_SCALE11, GPM_AUX_ENABLE_DEV, GPM_AUX_SET_SAMPLE, 100, GPM_AUX_SET_RES, 3, }; - - /* Do a basic init in case the mouse is confused */ - write_to_mouse(fd, basic_init, sizeof (basic_init)); - - /* Now try again and make sure we have a PS/2 mouse */ - if (write_to_mouse(fd, basic_init, sizeof (basic_init)) != 0) { - gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed init"); - return(NULL); - } + int i, id, error = 0, rate; - /* Try to switch to 3 button mode */ - if (write_to_mouse(fd, imps2_init, sizeof (imps2_init)) != 0) { - gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed (3 button) init"); + /* Flush any existing input. */ + tcflush (fd, TCIFLUSH); + + if (write_ps2 (fd, GPM_AUX_DEFAULTS, '\0', 1, -1)) { + gpm_debug_log(LOG_ERR, "PS/2 mouse failed init"); return(NULL); } - /* Read the mouse id */ - id = read_mouse_id(fd); - if (id == GPM_AUX_ID_ERROR) { - gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed to read id, assuming standard PS/2"); - id = GPM_AUX_ID_PS2; + // Magic to enable the IMPS/2 protocol. + if (!strcmp(type->name, "imps2")) { + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 200, 2, -1); + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 100, 2, -1); + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 80, 2, -1); + if (error) { + gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed (3 button) init"); + return(NULL); + } + } else if (!strcmp(type->name, "exps2")) { + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 200, 2, -1); + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 200, 2, -1); + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 80, 2, -1); + if (error) { + gpm_debug_log (LOG_ERR, "exps2: PS/2 mouse failed (3 button) init"); + return (NULL); + } } - /* And do the real initialisation */ - if (write_to_mouse(fd, ps2_init, sizeof (ps2_init)) != 0) { - gpm_debug_log(LOG_ERR, "imps2: PS/2 mouse failed setup, continuing..."); + if (write_ps2 (fd, GPM_AUX_SET_SCALE11, '\0', 1, -1)) { + gpm_debug_log(LOG_ERR, "PS/2 mouse failed init: Unable to set 1:1 scale."); + return (NULL); } - if (id == GPM_AUX_ID_IMPS2) { - /* Really an intellipoint, so initialise 3 button mode (4 byte packets) */ - gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected intellimouse PS/2"); - - return type; + if (opt_sample > 0) { + if (opt_sample >= 200) rate = 200; + else if (opt_sample >= 100) rate = 100; + else if (opt_sample >= 80) rate = 80; + else if (opt_sample >= 60) rate = 60; + else if (opt_sample >= 40) rate = 40; + else rate = 20; + } else { + rate = 100; } - if (id != GPM_AUX_ID_PS2) { - gpm_debug_log(LOG_ERR, "imps2: Auto-detected unknown mouse type %d, assuming standard PS/2", id); - } - else { - gpm_debug_log(LOG_NOTICE, "imps2: Auto-detected standard PS/2"); + + if (write_ps2 (fd, GPM_AUX_SET_SAMPLE, rate, 2, -1)) { + gpm_debug_log(LOG_ERR, "PS/2 mouse failed init: Unable to set rate."); + return (NULL); } - for (type=mice; type->fun; type++) { - if (strcmp(type->name, "ps2") == 0) { - return(type); - } + + write_ps2 (fd, GPM_AUX_SET_STREAM, '\0', 1, 1); + return type; + + /* FIXME: We need to decide how to handle this. */ +#if 0 + /* Read the mouse id */ + id = read_mouse_id(fd); + + switch (id) { + case GPM_AUX_ID_ERROR: + gpm_debug_log (LOG_ERR, "Unable to read PS/2 mouse ID: Using selected protocol.\n"); + return type; + case GPM_AUX_ID_PS2: + gpm_debug_log(LOG_NOTICE, "PS/2 protocol mouse."); + return get_mouse_type("ps2"); + case GPM_AUX_ID_IMPS2: + gpm_debug_log(LOG_NOTICE, "IMPS/2 protocol mouse."); + return get_mouse_type("imps2"); + case GPM_AUX_ID_EXPS2: + gpm_debug_log(LOG_NOTICE, "EXPS/2 protocol mouse."); + return get_mouse_type("exps2"); + default: + gpm_debug_log (LOG_ERR, "Unknown mouse ID, using selected protocol."); + return type; } - /* ps2 was not found!!! */ - return(NULL); +#endif } /* @@ -2159,8 +2189,8 @@ {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, {"ps2", "For most busmice connected to a PS/2 port (round with 6 metal\n" " pins).", - "PS/2", M_ps2, I_empty, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, 0}, + "PS/2", M_ps2, I_ps2, STD_FLG, + {0x08, 0x08, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"ncr", "Ncr3125pen, found on some laptops", "", M_ncr, NULL, STD_FLG, {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0}, @@ -2180,12 +2210,11 @@ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"imps2","For the Microsoft IntelliMouse on a PS/2 port (round\n" " connector with 6 pins), 3 buttons (wheel is repeated).", - - "", M_imps2, I_imps2, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + "", M_imps2, I_ps2, STD_FLG, + {0x08, 0x08, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused", - "ExplorerPS/2", M_ps2, I_exps2, STD_FLG, - {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, + "ExplorerPS/2", M_ps2, I_ps2, STD_FLG, + {0x08, 0x08, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"ms3", "For the Microsoft IntelliMouse (serial), 3 buttons (wheel is repeated).", "", M_ms3, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3}, gpm-1.20.4/patches/todo/zephian-hull-1.19.5/009_sun_repeat_000010060000017500001750000000022310760216311400217760ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/mice.c gpm-1.19.5/src/mice.c --- gpm-1.19.5.orig/src/mice.c Thu Oct 4 23:38:59 2001 +++ gpm-1.19.5/src/mice.c Thu Oct 4 23:38:53 2001 @@ -449,6 +449,16 @@ return 0; } +static int R_sun(Gpm_Event *state, int fd) +{ + signed char buffer[3]; + + buffer[0]= (state->buttons ^ 0x07) | 0x80; + buffer[1]= state->dx; + buffer[2]= -(state->dy); + return write(fd,buffer,3); +} + static int M_msc(Gpm_Event *state, unsigned char *data) { state->buttons= (~data[0]) & 0x07; @@ -2177,7 +2187,7 @@ {"sun", "For Sparc mice.", /* 'msc' protocol, but only 3 bytes per packet. */ "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, - {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, + {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, R_sun}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, gpm-1.20.4/patches/todo/zephian-hull-1.19.5/010_fups2_fuimps2_000010060000017500001750000000045060760216311400223340ustar00niconico00diff -ruN -x Makefile -x configure -x config.cache -x config.h -x *.[178] -x gpm.info -x gpmdoc.ps -x gpmdoc.txt -x gpm-root.c -x stamp-h -x *.elc gpm-1.19.5.orig/src/mice.c gpm-1.19.5/src/mice.c --- gpm-1.19.5.orig/src/mice.c Thu Oct 4 23:40:48 2001 +++ gpm-1.19.5/src/mice.c Thu Oct 4 23:40:34 2001 @@ -1837,6 +1837,29 @@ #endif } +/* PS/2 Init */ +static Gpm_Type *I_fuimps2(int fd, unsigned short flags, + struct Gpm_Type *type, int argc, char **argv) +{ + // cmd is used by the write_ps2* macros. + unsigned char cmd[15]; + int tmp, error = 0; + + if (check_no_argv(argc, argv)) return NULL; + + // Magic to enable the IMPS/2 protocol. + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 200, 2, -1); + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 100, 2, -1); + error += write_ps2 (fd, GPM_AUX_SET_SAMPLE, 80, 2, -1); + if (error) { + gpm_debug_log(LOG_ERR, "fuimps2: PS/2 mouse failed (3 button) init"); + return(NULL); + } + + return type; +} + + /* * This works with Dexxa Optical Mouse, but because in X same initstring * is named ExplorerPS/2 so I named it in the same way. @@ -2197,6 +2220,9 @@ {"bm", "For some busmice, including Microsoft and Logitech busmice.", "BusMouse", M_bm, I_empty, STD_FLG, /* bm is sun */ {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, + {"fups2","For BROKEN PS/2 mice (round with 6 metal pins).", + "PS/2", M_ps2, I_empty, STD_FLG, + {0xc0, 0xc0, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"ps2", "For most busmice connected to a PS/2 port (round with 6 metal\n" " pins).", "PS/2", M_ps2, I_ps2, STD_FLG, @@ -2222,6 +2248,10 @@ " connector with 6 pins), 3 buttons (wheel is repeated).", "", M_imps2, I_ps2, STD_FLG, {0x08, 0x08, 0x00, 0x00}, 4, 1, 0, 0, 0}, + {"fuimps2","For BROKEN wheel mice on a PS/2 port\n" + "(round connector with 6 pins), 3 buttons (wheel is repeated).", + "", M_imps2, I_fuimps2, STD_FLG, + {0xc0, 0xc0, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused", "ExplorerPS/2", M_ps2, I_ps2, STD_FLG, {0x08, 0x08, 0x00, 0x00}, 4, 1, 0, 0, 0}, gpm-1.20.4/scripts004070000017500001750000000000001101736502000126205ustar00niconico00gpm-1.20.4/scripts/git-archiv-tarbz2.sh010070000017500001750000000020511077613005200164760ustar00niconico00#!/bin/sh # # 2008 Nico Schottelius (nico-git-dev at schottelius.org) # # # This file 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 3 of the License, or # (at your option) any later version. # # This file 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 ccollect. If not, see . # # Written on: 20080314 # version="$1" me=${0##*/} if [ ! "$version" ]; then echo "${me}: Version" exit 1 fi if [ ! -d .git ]; then echo "There is no .git in here." exit 2 fi pwd=$(pwd) name=${pwd##*/} git archive --format=tar --prefix=${name}-${version}/ HEAD | \ tee ../${name}-${version}.tar | bzip2 -9 > ../${name}-${version}.tar.bz2 gpm-1.20.4/scripts/gpm.release010070000017500001750000000040151077613517400150440ustar00niconico00#!/bin/sh # Nico Schottelius # Build release tar # Date: Sat Oct 15 21:38:29 CEST 2005 # Last Changed: ls -l # only release if I tell it to release [ "$1" = "now" ] || exit 23 #if [ $# -ne 2 ]; then # echo "This is a maintainer-only script to release cinit" # echo $(basename $0): source-dir version # exit 1 #fi DDIR="$(cd $(dirname $0)/../../; pwd -P)" DIR="$(cd $(dirname $0)/../; pwd -P)" RDIR="$(basename "$DIR")" VERSION="$(awk -F= '/^release=/ { print $2 }' configure.in )" #VERSION="$(cd "$DIR"; pwd -P | sed 's;.*/gpm-;;')" #VERSION_CONF="$(head -n1 $(dirname $0)/../../conf/version | sed 's/^"\(.*\)"$/\1/')" #VERSION_CHANGES="$(head -n1 "$(dirname $0)/../../CHANGES" | sed 's/cinit-\(.*\):$/\1/')" echo -n "=> Version: $VERSION; ok?" read ok #echo "=> Version directory: $VERSION" #echo "=> Version conf/version: $VERSION_CONF" #echo "=> Version CHANGES: $VERSION_CHANGES" #if [ "$VERSION" = "$VERSION_CONF" -a "$VERSION" = "$VERSION_CHANGES" ]; then # echo "=> Version confirmed." #fi #DIR=$1 #VERSION=$2 TAR_NAME="gpm-${VERSION}.tar.bz2" OUT_NAME="$DDIR/$TAR_NAME" D_HOST=home.schottelius.org D_BASE=www/org/schottelius/unix/www/gpm D_DIR=${D_BASE}/archives/ D_SOURCE=${D_BASE}/browse_source/ LINK=current echo "$VERSION in $DIR to $DDIR with $RDIR?" echo "Copying to ${D_HOST}:${D_DIR}" echo -n "=> Continue? " read yes if [ ! -d "$DIR" ]; then echo "$DIR is not a directory" exit 1 fi #( cd "$DIR" && make dist ) || exit 1 echo "Creating bzip2 compressed tar" tar cj -X "$DIR/.exclude" -C "$DDIR" -f "$OUT_NAME" "$RDIR" chmod 0644 "$OUT_NAME" echo "Transfering to $D_HOST" scp "$OUT_NAME" "$D_HOST:$D_DIR" echo "Extracting to $D_SOURCE" ssh "$D_HOST" "tar xfj $D_DIR/$OUT_NAME -C $D_SOURCE" echo "Correcting paranoid permissions" ssh "$D_HOST" "find \"$D_SOURCE/$RDIR\" -type f -exec chmod 0644 {} \\;" ssh "$D_HOST" "find \"$D_SOURCE/$RDIR\" -type d -exec chmod 0755 {} \\;" ssh "$D_HOST" "cd \"$D_SOURCE\" && rm -f \"$LINK\" && ln -s \"$RDIR\" \"$LINK\"" echo "Please do not forget to update the website..." gpm-1.20.4/scripts/report_success.sh010070000017500001750000000034651100114570500163050ustar00niconico00#!/bin/sh # # 2008 Nico Schottelius (nico-ccollect at schottelius.org) # # This file is part of ccollect. # # ccollect 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 3 of the License, or # (at your option) any later version. # # ccollect 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 ccollect. If not, see . # # Sends feedback # # Adapted for gpm # software="gpm" author="Nico Schottelius" subject="==> success: $software" to="nico-gpm-success" host="schottelius.org" fullto="${to}@${host}" info="$(awk -F= '/^release=/ { print $2 }' configure.in; uname -s -v -r -m)" echo "Reporting success for $software to ${author}" echo "-----------------" echo -n "Your name (leave free for anonymous): " read name echo -n "Your email (leave free for anonymous): " read email echo -n "Your normal gpm parameters (-m -t -o ...): " read params echo -n "Comment (leave free for no comment): " read comment echo "" echo "The following information will be send to ${author}:" echo "" cat << eof Name: $name (will be used to contact you and kept secret) E-Mail: $email (will be used to contact you and kept secret) Comment: $comment Info: $info Parameters: $params eof echo -n "Is it ok to send out that mail (press enter to send or ctrl-c to abort)? " read yes cat << eof | mail -s "$subject" "$fullto" Name: $name E-Mail: $email Comment: $comment Info: $info Parameters: $params eof echo "Send. Thank you for your feedback." gpm-1.20.4/src004070000017500001750000000000001101761662200117275ustar00niconico00gpm-1.20.4/src/Makefile.in010060000017500001750000000142001101754443100140450ustar00niconico00# -*-makefile-*- (gpm/src) # # Copyright 1994,1997 rubini@linux.it # Copyright 1997 dickey@clark.net # Copyright (C) 1998 Ian Zimmerman # Copyright (C) 2001-2008 Nico Schottelius # srcdir = @srcdir@ top_builddir = .. include $(top_builddir)/Makefile.include # Main portion: regular build rules GSRC = mice.c twiddler.c synaptics.c \ daemon/add_mouse.c daemon/init_mice.c daemon/reset_mice.c \ daemon/build_argv.c daemon/disable_paste.c daemon/do_client.c \ daemon/do_selection.c daemon/get_console_size.c daemon/get_data.c \ daemon/getmousedata.c daemon/gpm.c daemon/gpm-killed.c \ daemon/header.c daemon/main.c daemon/old_main.c \ daemon/open_console.c daemon/check_kill.c daemon/gpm_exited.c \ generic/isodigit.c generic/getsym.c \ daemon/processspecial.c daemon/processconn.c daemon/processmouse.c \ daemon/processrequest.c daemon/selection_copy.c daemon/selection_paste.c\ daemon/cmdline.c daemon/loadlut.c daemon/find_mouse_by_name.c \ daemon/usage.c daemon/check_uniqueness.c \ daemon/startup.c daemon/wait_text.c GOBJ = $(GSRC:.c=.o) report.o tools.o LSRC = lib/liblow.c lib/libhigh.c lib/libxtra.c lib/report-lib.c LOBJ = $(LSRC:.c=.o) tools.o @CURSES_OBJS@ PICS = $(LOBJ:.o=.lo) HDRS = gpm.h gpmInt.h twiddler.h synaptics.h message.h PSRC = prog/mev.c prog/hltest.c prog/mouse-test.c prog/disable-paste.c \ prog/display-buttons.c prog/display-coords.c POBJ = $(PSRC:.c=.o) prog/gpm-root.o PROG = $(POBJ:.o=) SRCS = $(GSRC) $(LSRC) $(PSRC) report.c DEFS = @DEFS@ STRIP = -s ### BUILD PROCESS # allow CFLAGS to be overriden from make command line # ideally one would never have to write this rule again, but the GNU # makefile standards are at cross-purposes: CFLAGS is reserved for # user-overridable flags, but it's also all the implicit rule looks at. # the prog rules are not very clean... prog/%.o: prog/%.c $(CC) -Iheaders @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@ $< prog/%: prog/%.o $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS) %.o: %.c $(CC) @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@ $< %.lo: %.c $(CC) @CPPFLAGS@ $(CPPFLAGS) @PICFLAGS@ @CFLAGS@ $(CFLAGS) -c -o $@ $< %: %.o $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS) # old, unused, but good rule [dependings] #%.d: $(srcdir)/%.c # $(SHELL) -ec '$(CC) -M $(GPMCPPFLAGS) $(CPPFLAGS) $< \ # | $(SED) '\''s/\($*\)\.o\([ :]*\)/\1.o \1.lo\2/g'\'' > $(DEPDIR)/$@' # Do it all! all: gpm lib/libgpm.so.@abi_lev@ lib/libgpm.a $(PROG) gpm: $(GOBJ) $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $(GOBJ) @LIBS@ $(LIBS) -lm # construct dependings of sourcefiles and link sourcefiles $(DEPFILE) dep: prog/gpm-root.c # make links in subdirectories -@for cfiledirs in prog lib; do $(MKDIR) $$cfiledirs; \ cd $$cfiledirs; for cfiles in `echo $(srcdir)/$$cfiledirs/*.c`; \ do $(LN_S) $$cfiles 2>/dev/null; done; cd ..; done # make links in srcdir -@for cfiles in `echo $(srcdir)/*.c`; do $(LN_S) $$cfiles 2>/dev/null; done # create dependencies for DEPS in `echo *.c */*.c`; do \ $(CC) -I. -I $(srcdir) -M @CPPFLAGS@ $(CPPFLAGS) $$DEPS | \ $(SED) 's/^\(.*\)\.o\([ :]+\)/\1.o \1.lo\2/g' >> $(DEPFILE) ; done ### INSTALL check: all installdirs: install: check $(INSTALL_PROGRAM) gpm $(sbindir)/gpm $(INSTALL_DATA) -m 644 lib/libgpm.a $(libdir)/libgpm.a $(INSTALL_DATA) -m 644 $(srcdir)/headers/gpm.h $(includedir)/gpm.h # POSIX requires the range of a for loop be nonempty and Bash # 2.x goes along; unfortunately that means an additional # headache in cases like this if test "x@SHLIB@" != "x" ; then \ $(INSTALL_DATA) -m 644 lib/libgpm.so.@abi_full@ $(libdir)/libgpm.so.@abi_full@ ; \ cd $(libdir) && $(LN_S) -f libgpm.so.@abi_full@ libgpm.so.@abi_lev@ ; \ echo "WARNING: We installed a lib, you should now call ldconfig" ; \ echo "f.i.: ldconfig -n -l $(libdir)/libgpm.so.@abi_full@" ; \ echo "Or to update everything just type ldconfig" ; \ fi # The unversioned files seems to be not needed -> correct me, if I am wrong. # && $(LN_S) -f libgpm.so.@abi_lev@ libgpm.so ; \ # prog/ for i in $(PROG); do \ $(INSTALL_PROGRAM) $$i $(bindir)/`echo $$i | sed 's,prog/,,'` ;\ done install-strip: $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) $(STRIP)' install # Note: this leaves around /usr/lib/libgpm.so.1 and /usr/lib/libgpm.so.1.nn # This is probably the right thing, because programs may be linked to it uninstall: rm -f $(bindir)/mev $(bindir)/gpm-root $(bindir)/disable-paste \ $(sbindir)/gpm $(libdir)/libgpm.a $(libdir)/libgpm.so $(includedir)/gpm.h for i in $(PROG); do \ rm -f $(bindir)/$$i ;\ done # Configure & unconfigure Makefile: Makefile.in $(top_builddir)/config.status Makefile # Subdirectory prog/ prog/gpm-root.c: $(srcdir)/prog/gpm-root.y $(YACC) $(YFLAGS) $< && mv y.tab.c prog/gpm-root.c # gpm-root needs an own rule, because gpm-root.c is not in $(srcdir) prog/gpm-root: prog/gpm-root.c lib/libgpm.so.@abi_lev@ $(CC) -I. @CPPFLAGS@ $(CPPFLAGS) @CFLAGS@ $(CFLAGS) -c -o $@.o $< $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $@.o @LIBS@ $(LIBS) lib/libgpm.so.@abi_lev@ prog/mouse-test: prog/mouse-test.o mice.o twiddler.o synaptics.o prog/open_console.o $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $^ @LIBS@ $(LIBS) -lm $(PROG): lib/libgpm.so.@abi_lev@ # Subdirectory lib/ lib/libgpm.a: $(LOBJ) $(AR) rc lib/libgpm.a $(LOBJ) $(RANLIB) lib/libgpm.a lib/libgpm.so.@abi_full@: $(PICS) $(CC) @SOLDFLAGS@libgpm.so.@abi_lev@ \ @LDFLAGS@ $(LDFLAGS) -o lib/libgpm.so.@abi_full@ $^ @LIBS@ @SHARED_LIBS@ $(LIBS) lib/libgpm.so.@abi_lev@: lib/libgpm.so.@abi_full@ $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so.@abi_lev@ # unneeded, isn't it? #lib/libgpm.so: lib/libgpm.so.@abi_full@ # $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so include $(DEPFILE) ## Release / Dist ## Cleanup clean: rm -f gpm lib/libgpm.a lib/libgpm.so.* $(RDEPS) rm -f core *~ $(GOBJ) $(LOBJ) $(POBJ) $(PICS) gpm-root.c $(DEPFILE) rm -f $(PROG) $(POBJ) prog/gpm-root.c prog/open_console.o distclean: clean rm -f headers/config.h headers/drivers.h \ Makefile $(DEPFILE) allclean: clean rm -f headers/config.h.in gpm-1.20.4/src/daemon004070000017500001750000000000001101761662200131725ustar00niconico00gpm-1.20.4/src/daemon/add_mouse.c010060000017500001750000000112701101736502000153460ustar00niconico00/* * general purpose mouse support for Linux * * *several tools only needed by the server* * * Copyright (c) 2002-2008 Nico Schottelius * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include "headers/gpmInt.h" #include "headers/message.h" #include "headers/daemon.h" #include /* malloc() */ /* DESCR: add this to the list of mice. initialization follows later */ /* RETURN: - */ /* COMMENT: does error handling and exiting itself */ void add_mouse(int type, char *value) { struct micetab *tmp = option.micelist; /* PREAMBLE for all work: */ /* -m /dev/misc/psaux -t ps2 [ -o options ] */ switch(type) { /*---------------------------------------------------------------------*/ /********************** -m mousedevice *********************************/ /*---------------------------------------------------------------------*/ case GPM_ADD_DEVICE: /* first invocation */ if(option.micelist == NULL) { gpm_report(GPM_PR_DEBUG,"adding mouse device: %s",value); option.micelist = (struct micetab *) malloc(sizeof(struct micetab)); if(!option.micelist) gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); option.micelist->next = NULL; option.micelist->device = value; option.micelist->protocol = NULL; option.micelist->options = NULL; return; } /* find actual mouse */ while(tmp->device != NULL && tmp->protocol != NULL && tmp->next !=NULL) tmp = tmp->next; gpm_report(GPM_PR_DEBUG,"finished searching"); /* found end of micelist, add new mouse */ if(tmp->next == NULL && tmp->protocol != NULL) { gpm_report(GPM_PR_DEBUG,"next mouse making"); tmp->next = (struct micetab *) malloc(sizeof(struct micetab)); if(!tmp) gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); tmp->next = NULL; tmp->device = value; tmp->protocol = NULL; tmp->options = NULL; return; } else gpm_report(GPM_PR_OOPS,GPM_MESS_FIRST_DEV); //} else if(tmp->device != NULL && tmp->protocol == NULL) // gpm_report(GPM_PR_OOPS,GPM_MESS_FIRST_DEV); /* -m -m */ break; /*---------------------------------------------------------------------*/ /************************* -t type / protocol **************************/ /*---------------------------------------------------------------------*/ case GPM_ADD_TYPE: if(option.micelist == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_FIRST_DEV); /* skip to next mouse, where either device or protocol is missing */ while(tmp->device != NULL && tmp->protocol != NULL && tmp->next !=NULL) tmp = tmp->next; /* check whether device (-m) is there, if so, write protocol */ if(tmp->device == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_FIRST_DEV); else { gpm_report(GPM_PR_DEBUG,"adding mouse type: %s",value); tmp->protocol = value; option.no_mice++; /* finally we got our mouse */ } break; /*---------------------------------------------------------------------*/ /*************************** -o options ********************************/ /*---------------------------------------------------------------------*/ case GPM_ADD_OPTIONS: if(option.micelist == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_FIRST_DEV); /* look for the last mouse */ tmp = option.micelist; while(tmp->next != NULL) tmp = tmp->next; /* if -m or -t are missing exit */ if(tmp->device == NULL || tmp->protocol == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_FIRST_DEV); else { gpm_report(GPM_PR_DEBUG,"adding mouse options: %s",value); tmp->options = value; } break; } } gpm-1.20.4/src/daemon/build_argv.c010060000017500001750000000034511101736502000155260ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* str* */ #include /* calloc */ #include "headers/message.h" /* messaging in gpm */ /* build_argv is used for mouse initialization routines */ char **build_argv(char *argv0, char *str, int *argcptr, char sep) { int argc = 1; char **argv; char *s; /* argv0 is never NULL, but the extra string may well be */ if (str) for (s=str; sep && (s = strchr(s, sep)); argc++) s++; argv = calloc(argc+2, sizeof(char **)); if (!argv) gpm_report(GPM_PR_OOPS,GPM_MESS_ALLOC_FAILED); argv[0] = argv0; if (!str) { *argcptr = argc; /* 1 */ return argv; } /* else, add arguments */ s = argv[1] = strdup(str); argc = 2; /* first to fill */ /* ok, now split: the first one is in place, and s is the whole string */ for ( ; sep && (s = strchr(s, sep)) ; argc++) { *s = '\0'; s++; argv[argc] = s; } *argcptr = argc; return argv; } gpm-1.20.4/src/daemon/check_kill.c010060000017500001750000000040441101736502000154770ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* kill */ #include /* unlink */ #include /* exit */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ /* itz Sat Sep 12 10:55:51 PDT 1998 Added this as replacement for the unwanted functionality in check_uniqueness. */ void check_kill(void) { int old_pid; FILE* fp = fopen(GPM_NODE_PID, "r"); /* if we cannot find the old pid file, leave */ if (fp == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN, GPM_NODE_PID); /* else read the pid */ if (fscanf(fp,"%d",&old_pid) != 1) gpm_report(GPM_PR_OOPS,GPM_MESS_READ_PROB,GPM_NODE_PID); fclose(fp); gpm_report(GPM_PR_DEBUG,GPM_MESS_KILLING,old_pid); /* first check if we run */ if (kill(old_pid,0) == -1) { gpm_report(GPM_PR_INFO,GPM_MESS_STALE_PID, GPM_NODE_PID); unlink(GPM_NODE_PID); } /* then kill us (not directly, but the other instance ... ) */ if (kill(old_pid,SIGTERM) == -1) gpm_report(GPM_PR_OOPS,GPM_MESS_CANT_KILL, old_pid); gpm_report(GPM_PR_INFO,GPM_MESS_KILLED,old_pid); exit(0); } gpm-1.20.4/src/daemon/check_uniqueness.c010060000017500001750000000037011101736502000167420ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* kill */ #include /* kill, getpid */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ /* itz Sat Sep 12 10:30:05 PDT 1998 this function used to mix two completely different things; opening a socket to a running daemon and checking that a running daemon existed. Ugly. */ /* rewritten mostly on 20th of February 2002 - nico */ void check_uniqueness(void) { FILE *fp = 0; int old_pid = -1; if((fp = fopen(GPM_NODE_PID, "r")) != NULL) { fscanf(fp, "%d", &old_pid); if (kill(old_pid,0) == -1) { gpm_report(GPM_PR_INFO,GPM_MESS_STALE_PID, GPM_NODE_PID); unlink(GPM_NODE_PID); } else /* we are really running, exit asap! */ gpm_report(GPM_PR_OOPS,GPM_MESS_ALREADY_RUN, old_pid); } /* now try to sign ourself */ if ((fp = fopen(GPM_NODE_PID,"w")) != NULL) { fprintf(fp,"%d\n",getpid()); fclose(fp); } else { gpm_report(GPM_PR_OOPS,GPM_MESS_NOTWRITE,GPM_NODE_PID); } } gpm-1.20.4/src/daemon/cmdline.c010060000017500001750000000106741101736502000150300ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* atoi */ #include /* getopt */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ /***************************************************************************** * Check the command line and / or set the appropriate variables * Can't believe it, today cmdline() really does what the name tries to say *****************************************************************************/ void cmdline(int argc, char **argv) { extern struct options option; char options[]="a:A::b:B:d:Dg:hi:kl:m:Mo:pr:R::s:S:t:Tuv23"; int opt; /* initialize for the dual mouse */ mouse_table[2]=mouse_table[1]=mouse_table[0]; /* copy defaults */ which_mouse = mouse_table+1; /* use the first */ while ((opt = getopt(argc, argv, options)) != -1) { switch (opt) { case 'a': (which_mouse->opt_accel) = atoi(optarg); break; case 'A': opt_aged++; if (optarg) opt_age_limit = atoi(optarg); break; case 'b': (which_mouse->opt_baud) = atoi(optarg); break; case 'B': (which_mouse->opt_sequence) = optarg; break; case 'd': (which_mouse->opt_delta) = atoi(optarg); break; case 'D': option.run_status = GPM_RUN_DEBUG; break; case 'g': (which_mouse->opt_glidepoint_tap)=atoi(optarg); break; case 'h': exit(usage(NULL)); case 'i': (which_mouse->opt_time)=atoi(optarg); break; case 'k': check_kill(); break; case 'l': opt_lut = optarg; break; case 'm': add_mouse(GPM_ADD_DEVICE,optarg); (which_mouse->opt_dev) = optarg; break; /* GO AWAY!*/ case 'M': opt_double++; option.repeater++; if (option.repeater_type == 0) option.repeater_type = "msc"; which_mouse=mouse_table+2; break; case 'o': add_mouse(GPM_ADD_OPTIONS,optarg); gpm_report(GPM_PR_DEBUG,"options: %s",optarg); (which_mouse->opt_options) = optarg; break; /* GO AWAY */ case 'p': opt_ptrdrag = 0; break; case 'r': /* being called responsiveness, I must take the inverse */ (which_mouse->opt_scale)=atoi(optarg); if(!(which_mouse->opt_scale) || (which_mouse->opt_scale) > 100) (which_mouse->opt_scale)=100; /* the maximum */ else (which_mouse->opt_scale)=100/(which_mouse->opt_scale); break; case 'R': option.repeater++; if (optarg) option.repeater_type = optarg; else option.repeater_type = "msc"; break; case 's': (which_mouse->opt_sample) = atoi(optarg); break; case 'S': if (optarg) opt_special = optarg; else opt_special=""; break; case 't': add_mouse(GPM_ADD_TYPE,optarg); (which_mouse->opt_type) = optarg; break; /* GO AWAY */ case 'u': option.autodetect = 1; break; case 'T': opt_test++; break; case 'v': printf(GPM_MESS_VERSION "\n"); exit(0); case '2': (which_mouse->opt_three) = -1; break; case '3': (which_mouse->opt_three) = 1; break; default: exit(usage("commandline")); } } } gpm-1.20.4/src/daemon/disable_paste.c010060000017500001750000000021021101736502000161770ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ void disable_paste(int vc) { opt_aged++; gpm_report(GPM_PR_INFO,GPM_MESS_DISABLE_PASTE,vc); } gpm-1.20.4/src/daemon/do_client.c010060000017500001750000000042151101736502000153470ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* write */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* daemon internals */ /*-------------------------------------------------------------------*/ /* returns 0 if the event has not been processed, and 1 if it has */ int do_client(Gpm_Cinfo *cinfo, Gpm_Event *event) { Gpm_Connect info=cinfo->data; int fd=cinfo->fd; /* value to return if event is not used */ int res = !(info.defaultMask & event->type); /* instead of returning 0, scan the stack of clients */ if ((info.minMod & event->modifiers) < info.minMod) goto scan; if ((info.maxMod & event->modifiers) < event->modifiers) goto scan; /* if not managed, use default mask */ if (!(info.eventMask & GPM_BARE_EVENTS(event->type))) { if (res) return res; else goto scan; } /* WARNING */ /* This can generate a SIGPIPE... I'd better catch it */ MAGIC_P((write(fd,&magic, sizeof(int)))); write(fd,event, sizeof(Gpm_Event)); return info.defaultMask & GPM_HARD ? res : 1; /* HARD forces pass-on */ scan: if (cinfo->next != 0) return do_client (cinfo->next, event); /* try the next */ return 0; /* no next, not used */ } gpm-1.20.4/src/daemon/do_selection.c010060000017500001750000000052251101736502000160600ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* daemon internals */ /*-------------------------------------------------------------------*/ int do_selection(Gpm_Event *event) /* returns 0, always */ { static int x1=1, y1=1, x2, y2; #define UNPOINTER() 0 x2=event->x; y2=event->y; switch(GPM_BARE_EVENTS(event->type)) { case GPM_MOVE: if (x2<1) x2++; else if (x2>maxx) x2--; if (y2<1) y2++; else if (y2>maxy) y2--; selection_copy(x2,y2,x2,y2,3); /* just highlight pointer */ return 0; case GPM_DRAG: if (event->buttons==GPM_B_LEFT) { if (event->margin) /* fix margins */ switch(event->margin) { case GPM_TOP: x2=1; y2++; break; case GPM_BOT: x2=maxx; y2--; break; case GPM_RGT: x2--; break; case GPM_LFT: y2<=y1 ? x2++ : (x2=maxx, y2--); break; } selection_copy(x1,y1,x2,y2,event->clicks); if (event->clicks>=opt_ptrdrag && !event->margin) /* pointer */ selection_copy(x2,y2,x2,y2,3); } /* if */ return 0; case GPM_DOWN: switch (event->buttons) { case GPM_B_LEFT: x1=x2; y1=y2; selection_copy(x1,y1,x2,y2,event->clicks); /* start selection */ return 0; case GPM_B_MIDDLE: selection_paste(); return 0; case GPM_B_RIGHT: if ((which_mouse->opt_three)==1) selection_copy(x1,y1,x2,y2,event->clicks); else selection_paste(); return 0; } } /* switch above */ return 0; } gpm-1.20.4/src/daemon/find_mouse_by_name.c010060000017500001750000000035301101736502000172300ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* str* */ #include /* isspace */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ /***************************************************************************** * the function returns a valid type pointer or NULL if not found *****************************************************************************/ struct Gpm_Type *find_mouse_by_name(char *name) { Gpm_Type *type; char *s; int len = strlen(name); for (type=mice; type->fun; type++) { if (!strcasecmp(name, type->name)) break; /* otherwise, look in the synonym list */ for (s = type->synonyms; s; s = strchr(s, ' ')) { while (*s && isspace(*s)) s++; /* skip spaces */ if(!strncasecmp(name, s, len) && !isprint(*(s + len))) break;/*found*/ } if(s) break; /* found a synonym */ } if (!type->fun) return NULL; return type; } gpm-1.20.4/src/daemon/get_console_size.c010060000017500001750000000046351101736502000167500ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* close */ #include /* open */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* daemon internals */ void get_console_size(Gpm_Event *ePtr) { int i, prevmaxx, prevmaxy; struct mouse_features *which_mouse; /* local */ /* before asking the new console size, save the previous values */ prevmaxx = maxx; prevmaxy = maxy; i=open_console(O_RDONLY); ioctl(i, TIOCGWINSZ, &win); close(i); if (!win.ws_col || !win.ws_row) { gpm_report(GPM_PR_DEBUG,GPM_MESS_ZERO_SCREEN_DIM); win.ws_col=80; win.ws_row=25; } maxx=win.ws_col; maxy=win.ws_row; gpm_report(GPM_PR_DEBUG,GPM_MESS_SCREEN_SIZE,maxx,maxy); if (!prevmaxx) { /* first invocation, place the pointer in the middle */ statusX = ePtr->x = maxx/2; statusY = ePtr->y = maxy/2; } else { /* keep the pointer in the same position where it was */ statusX = ePtr->x = ePtr->x * maxx / prevmaxx; statusY = ePtr->y = ePtr->y * maxy / prevmaxy; } for (i=1; i <= 1+opt_double; i++) { which_mouse=mouse_table+i; /* used to access options */ /* * the following operation is based on the observation that 80x50 * has square cells. (An author-centric observation ;-) */ (which_mouse->opt_scaley)=(which_mouse->opt_scale)*50*maxx/80/maxy; gpm_report(GPM_PR_DEBUG,GPM_MESS_X_Y_VAL,(which_mouse->opt_scale),(which_mouse->opt_scaley)); } } gpm-1.20.4/src/daemon/get_data.c010060000017500001750000000033511101736502000151570ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* read */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* daemon internals */ /*-------------------------------------------------------------------* * This was inline, and incurred in a compiler bug (2.7.0) *-------------------------------------------------------------------*/ int get_data(Gpm_Connect *where, int whence) { static int i; #ifdef GPM_USE_MAGIC while ((i=read(whence,&check,sizeof(int)))==4 && check!=GPM_MAGIC) gpm_report(GPM_PR_INFO,GPM_MESS_NO_MAGIC); if (!i) return 0; if (check!=GPM_MAGIC) { gpm_report(GPM_PR_INFO,GPM_MESS_NOTHING_MORE); return -1; } #endif if ((i=read(whence, where, sizeof(Gpm_Connect)))!=sizeof(Gpm_Connect)) { return i ? -1 : 0; } return 1; } gpm-1.20.4/src/daemon/getmousedata.c010060000017500001750000000064721101736502000161000ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* guess what */ #include /* read */ #include /* exit */ #include /* strerror */ #include /* KD* */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* daemon internals */ /*------------------------------------------------------------------- * fetch the actual device data from the mouse device, dependent on * what Gpm_Type is being passed. *-------------------------------------------------------------------*/ char *getMouseData(int fd, Gpm_Type *type, int kd_mode) { static unsigned char data[32]; /* quite a big margin :) */ char *edata=data+type->packetlen; int howmany=type->howmany; int i,j; /*....................................... read and identify one byte */ if (read(fd, data, howmany)!=howmany) { if (opt_test) exit(0); gpm_report(GPM_PR_ERR,GPM_MESS_READ_FIRST, strerror(errno)); return NULL; } if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep) write(fifofd, data, howmany); if ((data[0]&((which_mouse->m_type)->proto)[0]) != ((which_mouse->m_type)->proto)[1]) { if ((which_mouse->m_type)->getextra == 1) { data[1]=GPM_EXTRA_MAGIC_1; data[2]=GPM_EXTRA_MAGIC_2; gpm_report(GPM_PR_DEBUG,GPM_EXTRA_DATA,data[0]); return data; } gpm_report(GPM_PR_DEBUG,GPM_MESS_PROT_ERR); return NULL; } /*....................................... read the rest */ /* * well, this seems to work almost right with ps2 mice. However, I've never * tried ps2 with the original selection package, which called usleep() */ if((i=(which_mouse->m_type)->packetlen-howmany)) /* still to get */ do { j = read(fd,edata-i,i); /* edata is pointer just after data */ if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep && j > 0) write(fifofd, edata-i, j); i -= j; } while (i && j); if (i) { gpm_report(GPM_PR_ERR,GPM_MESS_READ_REST, strerror(errno)); return NULL; } if ((data[1]&((which_mouse->m_type)->proto)[2]) != ((which_mouse->m_type)->proto)[3]) { gpm_report(GPM_PR_INFO,GPM_MESS_SKIP_DATA); return NULL; } gpm_report(GPM_PR_DEBUG,GPM_MESS_DATA_4,data[0],data[1],data[2],data[3]); return data; } gpm-1.20.4/src/daemon/gpm-killed.c010060000017500001750000000032021101736502000154270ustar00niconico00/* * general purpose mouse support * * Copyright (C) 1993 Andreq Haylett * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998 Ian Zimmerman * Copyright (c) 2001-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include /* SIG* */ #include /* exit() */ #include /* getpid() */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ void gpm_killed(int signo) { if(signo == SIGWINCH) { gpm_report(GPM_PR_WARN, GPM_MESS_RESIZING, option.progname, getpid()); opt_resize++; return; } if(signo==SIGUSR1) { gpm_report(GPM_PR_WARN,GPM_MESS_KILLED_BY, option.progname, getpid(), option.progname); } exit(0); } gpm-1.20.4/src/daemon/gpm.c010060000017500001750000000071341101736502000141750ustar00niconico00/* * general purpose mouse support * * Copyright (C) 1993 Andreq Haylett * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998 Ian Zimmerman * Copyright (c) 2001-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include /* strerror(); ?!? */ #include #include /* select(); */ #include /* SIGPIPE */ #include /* time() */ #include #include /* O_RDONLY */ #include /* wait() */ #include /* mkdir() */ #include /* timeval */ #include /* socket() */ #include /* socket() */ #include /* struct sockaddr_un */ #include /* VT_GETSTATE */ #include /* for serial console check */ #include /* KDGETMODE */ #include /* winsize */ #include "headers/gpmInt.h" /* old daemon header */ #include "headers/message.h" #include "headers/daemon.h" /* clean daemon header */ /* who the f*** runs gpm without glibc? doesn't have dietlibc __socklent_t? */ #if !defined(__GLIBC__) typedef unsigned int __socklen_t; #endif /* __GLIBC__ */ /* global variables that are in daemon.h */ struct options option; /* one should be enough for us */ Gpm_Type *repeated_type = 0; /* FIXME: BRAINDEAD..ok not really, but got to leave anyway... */ /* argc and argv for mice initialization */ int mouse_argc[3]; /* 0 for default (unused) and two mice */ char **mouse_argv[3]; /* 0 for default (unused) and two mice */ int opt_aged = 0; int statusX,statusY,statusB; /* to return info */ /* * all the values duplicated for dual-mouse operation are * now in this structure (see gpmInt.h) * mouse_table[0] is single mouse, mouse_table[1] and mouse_table[2] * are copied data from mouse_table[0] for dual mouse operation. */ struct mouse_features mouse_table[3] = { { DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, 0 /* scaley */, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, (char *)NULL /* extra */, (Gpm_Type *)NULL, -1 } }; struct mouse_features *which_mouse; /* These are only the 'global' options */ char *opt_lut=DEF_LUT; int opt_test=DEF_TEST; int opt_ptrdrag=DEF_PTRDRAG; int opt_double=0; char *opt_special=NULL; /* special commands, like reboot or such */ int opt_rawrep=0; struct winsize win; int maxx, maxy; int fifofd=-1; int eventFlag=0; Gpm_Cinfo *cinfo[MAX_VC+1]; time_t last_selection_time; time_t opt_age_limit = 0; int opt_resize=0; /* not really an option */ int statusC = 0; /* clicks */ void get_console_size(Gpm_Event *ePtr); /* in daemon.h */ fd_set selSet, readySet, connSet; gpm-1.20.4/src/daemon/gpm_exited.c010060000017500001750000000022761101736502000155410ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* unlink,geteuid */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ /* what todo atexit */ void gpm_exited(void) { gpm_report(GPM_PR_DEBUG,GPM_MESS_REMOVE_FILES, GPM_NODE_PID, GPM_NODE_CTL); unlink(GPM_NODE_PID); unlink(GPM_NODE_CTL); } gpm-1.20.4/src/daemon/header.c010060000017500001750000000017361101736502000146440ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ gpm-1.20.4/src/daemon/init_mice.c010060000017500001750000000032361101736502100153520ustar00niconico00/* * general purpose mouse support for Linux * * *several tools only needed by the server* * * Copyright (c) 2002-2008 Nico Schottelius * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include "headers/gpmInt.h" #include "headers/message.h" #include "headers/daemon.h" #include /* malloc() */ /* DESCR: mice initialization. currently print mice. */ /* RETURN: 0 - failed to init one or more devices 1 - init was fine */ /* COMMENT: does error handling and exiting itself */ int init_mice(struct micetab *micelist) { struct micetab *tmp = micelist; while(tmp != NULL) { /* there are still mice to init */ gpm_report(GPM_PR_DEBUG,"initialize %s with proto %s",tmp->device,tmp->protocol); if(tmp->options != NULL) { gpm_report(GPM_PR_DEBUG,"and options %s",tmp->options); } tmp = tmp->next; } gpm_report(GPM_PR_DEBUG,"finished initialization"); return 1; } gpm-1.20.4/src/daemon/loadlut.c010060000017500001750000000057621101736502100150640ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* datatypes */ #include /* open */ #include /* malloc */ #include /* str* */ #include /* errno.h */ #include /* getuid */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* GPM_SYS_CONSOLE */ int loadlut(char *charset) { int i, c, fd; unsigned char this, next; static uint32_t long_array[9]={ 0x05050505, /* ugly, but preserves alignment */ 0x00000000, /* control chars */ 0x00000000, /* digits */ 0x00000000, /* uppercase and '_' */ 0x00000000, /* lowercase */ 0x00000000, /* Latin-1 control */ 0x00000000, /* Latin-1 misc */ 0x00000000, /* Latin-1 uppercase */ 0x00000000 /* Latin-1 lowercase */ }; #define inwordLut (long_array+1) for (i=0; charset[i]; ) { i += getsym(charset+i, &this); if (charset[i] == '-' && charset[i + 1] != '\0') i += getsym(charset+i+1, &next) + 1; else next = this; for (c = this; c <= next; c++) inwordLut[c>>5] |= 1 << (c&0x1F); } if ((fd=open(option.consolename, O_WRONLY)) < 0) { /* try /dev/console, if /dev/tty0 failed -- is that really senseful ??? */ free(option.consolename); /* allocated by main */ if((option.consolename=malloc(strlen(GPM_SYS_CONSOLE)+1)) == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); /* FIXME: remove hardcoded device names */ strcpy(option.consolename,GPM_SYS_CONSOLE); if ((fd=open(option.consolename, O_WRONLY)) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON); } if (ioctl(fd, TIOCLINUX, &long_array) < 0) { /* fd <0 is checked */ if (errno==EPERM && getuid()) gpm_report(GPM_PR_WARN,GPM_MESS_ROOT); /* why do we still continue?*/ else if (errno==EINVAL) gpm_report(GPM_PR_OOPS,GPM_MESS_CSELECT); } close(fd); return 0; } gpm-1.20.4/src/daemon/main.c010060000017500001750000000023121101736502100143300ustar00niconico00/* * general purpose mouse support for Linux * * *main.c* * * Copyright (c) 2002 Nico Schottelius * * small main routine * * isn't that a nice clean function ? * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include "headers/daemon.h" #include "headers/gpmInt.h" int main(int argc, char **argv) { startup(argc,argv); /* setup configurations */ old_main(); /* LATER: exit(daemon()); */ return 0; /* if we didn't exit before, just give back success */ } gpm-1.20.4/src/daemon/old_main.c010060000017500001750000000207641101736502100152010ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* UNIX */ #include /* SOCKET */ #include /* open */ #include /* guess again */ #include /* guess again */ #include /* unlink */ #include /* chmod */ #include /* linux hd* */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* daemon internals */ #ifndef max #define max(a,b) ((a)>(b) ? (a) : (b)) #endif int old_main() { int ctlfd, newfd; struct sockaddr_un ctladdr; int i, len, kd_mode, fd; struct timeval timeout; int maxfd=-1; int pending; Gpm_Event event; for (i = 1; i <= 1+opt_double; i++) { which_mouse=mouse_table+i; /* used to access options */ if (!(which_mouse->opt_dev)) gpm_report(GPM_PR_OOPS,GPM_MESS_NEED_MDEV); if(!strcmp((which_mouse->opt_dev),"-")) fd=0; /* use stdin */ else if( (fd=open((which_mouse->opt_dev),O_RDWR | O_NDELAY)) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN,(which_mouse->opt_dev)); /* and then reset the flag */ fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) & ~O_NDELAY); /* create argc and argv for this device */ mouse_argv[i] = build_argv((which_mouse->opt_type), (which_mouse->opt_options), &mouse_argc[i], ','); /* init the device, and use the return value as new mouse type */ if ((which_mouse->m_type)->init) (which_mouse->m_type)=((which_mouse->m_type)->init)(fd, (which_mouse->m_type)->flags, (which_mouse->m_type), mouse_argc[i], mouse_argv[i]); if (!(which_mouse->m_type)) gpm_report(GPM_PR_OOPS,GPM_MESS_MOUSE_INIT); which_mouse->fd=fd; maxfd=max(fd, maxfd); } /*....................................... catch interesting signals */ signal(SIGTERM, gpm_killed); signal(SIGINT, gpm_killed); signal(SIGUSR1, gpm_killed); /* usr1 is used by a new gpm killing the old */ signal(SIGWINCH,gpm_killed); /* winch can be sent if console is resized */ /*....................................... create your nodes */ /* control node */ if((ctlfd=socket(AF_UNIX,SOCK_STREAM,0))==-1) gpm_report(GPM_PR_OOPS,GPM_MESS_SOCKET_PROB); bzero((char *)&ctladdr,sizeof(ctladdr)); ctladdr.sun_family=AF_UNIX; strcpy(ctladdr.sun_path,GPM_NODE_CTL); unlink(GPM_NODE_CTL); len=sizeof(ctladdr.sun_family)+strlen(GPM_NODE_CTL); if(bind(ctlfd,(struct sockaddr *)(&ctladdr),len) == -1) gpm_report(GPM_PR_OOPS,GPM_MESS_BIND_PROB,ctladdr.sun_path); maxfd=max(maxfd,ctlfd); /* needs to be 0777, so all users can _try_ to access gpm */ chmod(GPM_NODE_CTL,0777); get_console_size(&event); /* get screen dimensions */ /*....................................... wait for mouse and connections */ listen(ctlfd, 5); /* Queue up calls */ #define NULL_SET ((fd_set *)NULL) #define resetTimeout() (timeout.tv_sec=SELECT_TIME,timeout.tv_usec=0) FD_ZERO(&connSet); FD_SET(ctlfd,&connSet); if (opt_double) FD_SET(mouse_table[2].fd,&connSet); readySet=connSet; FD_SET(mouse_table[1].fd,&readySet); signal(SIGPIPE,SIG_IGN); /* WARN */ /*--------------------------------------- main loop begins here */ while(1) { selSet=readySet; resetTimeout(); if (opt_test) timeout.tv_sec=0; if (eventFlag) { /* an event left over by clustering */ pending=1; FD_ZERO(&selSet); FD_SET(mouse_table[eventFlag].fd,&selSet); } else while((pending=select(maxfd+1,&selSet,NULL_SET,NULL_SET,&timeout))==0){ selSet=readySet; resetTimeout(); } /* go on */ if(opt_resize) { /* did the console resize? */ get_console_size(&event); opt_resize--; signal(SIGWINCH,gpm_killed); /* reinstall handler */ /* and notify clients */ for(i=0; inext) kill(ci->data.pid,SIGWINCH); } } if (pending < 0) { if (errno==EBADF) gpm_report(GPM_PR_OOPS,GPM_MESS_SELECT_PROB); gpm_report(GPM_PR_ERR,GPM_MESS_SELECT_STRING,strerror(errno)); selSet=readySet; resetTimeout(); continue; } gpm_report(GPM_PR_DEBUG,GPM_MESS_SELECT_TIMES,pending); /*....................................... manage graphic mode */ /* * Be sure to be in text mode. This used to be before select, * but actually it only matters if you have events. */ { int fd = open_console(O_RDONLY); if (ioctl(fd, KDGETMODE, &kd_mode) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_KDGETMODE); close(fd); if(kd_mode != KD_TEXT && !option.repeater) { wait_text(&mouse_table[1].fd); maxfd=max(maxfd,mouse_table[1].fd); readySet=connSet; FD_SET(mouse_table[1].fd,&readySet); continue; /* reselect */ } } /*....................................... got mouse, process event */ /* * Well, actually, run a loop to maintain inlining of functions without * lenghtening the file. This is not too clean a code, but it works.... */ for (i=1; i <= 1+opt_double; i++) { which_mouse=mouse_table+i; /* used to access options */ if (FD_ISSET(which_mouse->fd,&selSet)) { FD_CLR(which_mouse->fd,&selSet); pending--; if (processMouse(which_mouse->fd, &event, (which_mouse->m_type), kd_mode)) /* pass it to the client, if any * or to the default handler, if any * or to the selection handler */ /* FIXME -- check event.vc */ /* can't we please rewrite the following a bit nicer?*/ (cinfo[event.vc] && do_client(cinfo[event.vc], &event)) || (cinfo[0] && do_client(cinfo[0], &event)) || do_selection(&event); } } /*..................... got connection, process it */ if (pending && FD_ISSET(ctlfd,&selSet)) { FD_CLR(ctlfd,&selSet); pending--; newfd=processConn(ctlfd); if (newfd>=0) { FD_SET(newfd,&connSet); FD_SET(newfd,&readySet); maxfd=max(maxfd,newfd); } } /*........................ got request */ /* itz 10-22-96 check _all_ clients, not just those on top! */ for (i=0; pending && (i<=MAX_VC); i++) { Gpm_Cinfo* ci; for (ci = cinfo[i]; pending && ci; ci = ci->next) { if (FD_ISSET(ci->fd,&selSet)) { FD_CLR(ci->fd,&selSet); pending--; /* itz Sat Sep 12 21:10:22 PDT 1998 */ /* this code is clearly incorrect; the next highest descriptor after the one we're closing is not necessarily being used. Fortunately, it doesn't hurt simply to leave this out. */ #ifdef NOTDEF if ((processRequest(ci,i)==-1) && maxfd==ci->fd) maxfd--; #else (void)processRequest(ci,i); #endif } } } /*.................. look for a spare fd */ /* itz 10-22-96 this shouldn't happen now! */ for (i=0; pending && i<=maxfd; i++) { if (FD_ISSET(i,&selSet)) { FD_CLR(i,&selSet); pending--; gpm_report(GPM_PR_WARN,GPM_MESS_STRANGE_DATA,i); } } /*................... all done. */ if(pending) gpm_report(GPM_PR_OOPS,GPM_MESS_SELECT_PROB); } /* while(1) */ } gpm-1.20.4/src/daemon/open_console.c010060000017500001750000000036521101736502100160770ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* open and co. */ #include /* stat() */ #include /* ioctl */ /* Linux specific (to be outsourced in gpm2 */ #include /* for serial console check */ #include /* for serial console check */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ int open_console(const int mode) { int fd; int maj; int twelve = 12; struct serial_struct si; struct stat sb; fd = open(option.consolename, mode); if (fd != -1) { fstat(fd, &sb); maj = major(sb.st_rdev); if (maj != 4 && (maj < 136 || maj > 143)) { if (ioctl(fd, TIOCLINUX, &twelve) < 0) { if (si.line > 0) { gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_SERIALCON); } } } return fd; } else gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON); } gpm-1.20.4/src/daemon/processconn.c010060000017500001750000000115201101736502100157410ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* accept */ #include /* malloc */ #include /* close */ #include /* unix socket */ #include /* stat */ #include /* str* */ #include /* errno.h */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ int processConn(int fd) /* returns newfd or -1 */ { Gpm_Cinfo *info; Gpm_Connect *request; Gpm_Cinfo *next; int vc, newfd; #if !defined(__GLIBC__) int len; #else /* __GLIBC__ */ size_t len; /* isn't that generally defined in C ??? -- nico */ #endif /* __GLIBC__ */ struct sockaddr_un addr; /* reuse this each time */ struct stat statbuf; uid_t uid; char *tty = NULL; /*....................................... Accept */ bzero((char *)&addr,sizeof(addr)); addr.sun_family=AF_UNIX; len=sizeof(addr); if ((newfd=accept(fd,(struct sockaddr *)&addr, &len))<0) { gpm_report(GPM_PR_ERR,GPM_MESS_ACCEPT_FAILED,strerror(errno)); return -1; } gpm_report(GPM_PR_DEBUG, GPM_MESS_CONECT_AT,newfd); info=malloc(sizeof(Gpm_Cinfo)); if (!info) gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); request=&(info->data); if(get_data(request,newfd)==-1) { free(info); close(newfd); return -1; } if ((vc=request->vc)>MAX_VC) { gpm_report(GPM_PR_DEBUG, GPM_MESS_REQUEST_ON, vc, MAX_VC); free(info); close(newfd); return -1; } #ifndef SO_PEERCRED if (stat (addr.sun_path, &statbuf) == -1 || !S_ISSOCK(statbuf.st_mode)) { gpm_report(GPM_PR_ERR,GPM_MESS_ADDRES_NSOCKET,addr.sun_path); free(info); /* itz 10-12-95 verify client's right */ close(newfd); return -1; /* to read requested tty */ } unlink(addr.sun_path); /* delete socket */ staletime = time(0) - 30; if (statbuf.st_atime < staletime || statbuf.st_ctime < staletime || statbuf.st_mtime < staletime) { gpm_report(GPM_PR_ERR,GPM_MESS_SOCKET_OLD); free (info); close(newfd); return -1; /* socket is ancient */ } uid = statbuf.st_uid; /* owner of socket */ #else { struct ucred sucred; socklen_t credlen = sizeof(struct ucred); if(getsockopt(newfd, SOL_SOCKET, SO_PEERCRED, &sucred, &credlen) == -1) { gpm_report(GPM_PR_ERR,GPM_MESS_GETSOCKOPT, strerror(errno)); free(info); close(newfd); return -1; } uid = sucred.uid; gpm_report(GPM_PR_DEBUG,GPM_MESS_PEER_SCK_UID, uid); } #endif if (uid != 0) { if(( tty = malloc(strlen(option.consolename)+Gpm_cnt_digits(vc) + sizeof(char))) == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); strncpy(tty,option.consolename,strlen(option.consolename)-1); sprintf(&tty[strlen(option.consolename)-1],"%d",vc); if(stat(tty, &statbuf) == -1) { gpm_report(GPM_PR_ERR,GPM_MESS_STAT_FAILS,tty); free(info); free(tty); close(newfd); return -1; } if (uid != statbuf.st_uid) { gpm_report(GPM_PR_WARN,GPM_MESS_FAILED_CONNECT, uid, tty); /*SUSPECT!*/ free(info); free(tty); close(newfd); return -1; } free(tty); /* at least here it's not needed anymore */ } /* register the connection information in the right place */ info->next=next=cinfo[vc]; info->fd=newfd; cinfo[vc]=info; gpm_report(GPM_PR_DEBUG,GPM_MESS_LONG_STATUS, request->pid, request->vc, request->eventMask, request->defaultMask, request->minMod, request->maxMod); /* if the client gets motions, give it the current position */ if(request->eventMask & GPM_MOVE) { Gpm_Event event={0,0,vc,0,0,statusX,statusY,GPM_MOVE,0,0}; do_client(info, &event); } return newfd; } gpm-1.20.4/src/daemon/processmouse.c010060000017500001750000000232731101736502100161440ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * 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. * * call getMouseData to get hardware device data, call mouse device's fun() * to retrieve the hardware independent event data, then optionally repeat * the data via repeat_fun() to the repeater device * ********/ #include /* stat */ #include /* KD */ #include /* vt */ #include /* open */ #include /* close */ #include /* time */ #include /* gettimeofday */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #define abs(value) ((value) < 0 ? -(value) : (value)) #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000 + \ (t2.tv_usec-t1.tv_usec)/1000) int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode) { char *data; static int fine_dx, fine_dy, i, j, m, newB=0, /* old buttons and Type to chain events */ oldB=0, oldT=0; static Gpm_Event nEvent; static struct vt_stat stat; static struct timeval tv1={0,0}, tv2; /* tv1==0: first click is single */ static struct timeval timeout={0,0}; fd_set fdSet; oldT = event->type; if(eventFlag) { eventFlag=0; if((which_mouse->m_type)->absolute) { /* a pen or other absolute device */ event->x=nEvent.x; event->y=nEvent.y; } event->dx=nEvent.dx; event->dy=nEvent.dy; event->buttons=nEvent.buttons; } else { event->dx=event->dy = 0; event->wdx=event->wdy = 0; nEvent.modifiers = 0; /* some mice set them */ i = 0; FD_ZERO(&fdSet); FD_SET(fd,&fdSet); do { /* cluster loop */ if(((data=getMouseData(fd, (which_mouse->m_type), kd_mode)) == NULL) || ((*((which_mouse->m_type)->fun))(&nEvent,data)==-1) ) { if (!i) { return 0; } else { break; } } event->modifiers = nEvent.modifiers; /* propagate modifiers */ /* propagate buttons */ nEvent.buttons = ((which_mouse->opt_sequence)[nEvent.buttons&7]&7) | (nEvent.buttons & ~7); /* change the order */ oldB=newB; newB=nEvent.buttons; if (!i) event->buttons=nEvent.buttons; if (oldB != newB) { eventFlag = (i!=0)*(which_mouse-mouse_table); /* 1 or 2 */ break; } /* propagate movement */ if (!((which_mouse->m_type)->absolute)) { /* mouse */ if (abs(nEvent.dx)+abs(nEvent.dy) > (which_mouse->opt_delta)) nEvent.dx*=(which_mouse->opt_accel), nEvent.dy*=(which_mouse->opt_accel); /* increment the reported dx,dy */ event->dx+=nEvent.dx; event->dy+=nEvent.dy; } else { /* a pen */ /* get dx,dy to check if there has been movement */ event->dx = (nEvent.x) - (event->x); event->dy = (nEvent.y) - (event->y); } /* propagate wheel */ event->wdx += nEvent.wdx; event->wdy += nEvent.wdy; select(fd+1,&fdSet,(fd_set *)NULL,(fd_set *)NULL,&timeout/* zero */); } while (i++ <(which_mouse->opt_cluster) && nEvent.buttons==oldB && FD_ISSET(fd,&fdSet)); } /* if(eventFlag) */ /*....................................... update the button number */ if ((event->buttons&GPM_B_MIDDLE) && !(which_mouse->opt_three)) (which_mouse->opt_three)++; /*....................................... we're a repeater, aren't we? */ if (kd_mode!=KD_TEXT) { if (fifofd != -1 && ! opt_rawrep) { if ((which_mouse->m_type)->absolute) { /* hof Wed Feb 3 21:43:28 MET 1999 */ /* prepare the values from a absolute device for repeater mode */ static struct timeval rept1,rept2; gettimeofday(&rept2, (struct timezone *)NULL); if (((rept2.tv_sec -rept1.tv_sec) *1000+(rept2.tv_usec-rept1.tv_usec)/1000)>250) { event->dx=0; event->dy=0; } rept1=rept2; event->dy=event->dy*((win.ws_col/win.ws_row)+1); event->x=nEvent.x; event->y=nEvent.y; } repeated_type->repeat_fun(event, fifofd); /* itz Jan 11 1999 */ } return 0; /* no events nor information for clients */ } /* first if of these three */ /*....................................... no, we arent a repeater, go on */ /* use fine delta values now, if delta is the information */ if (!((which_mouse->m_type))->absolute) { fine_dx+=event->dx; fine_dy+=event->dy; event->dx=fine_dx/(which_mouse->opt_scale); event->dy=fine_dy/(which_mouse->opt_scaley); fine_dx %= (which_mouse->opt_scale); fine_dy %= (which_mouse->opt_scaley); } /* up and down, up and down, ... who does a do..while(0) loop ??? and then makes a break into it... argh ! */ /* rodney 13/mar/2008 wheel movement similar to mouse movement * must also be excluded from time (click) processing */ if (!event->dx && !event->dy && !event->wdx && !event->wdy && (event->buttons==oldB) ) do { /* so to break */ static long awaketime; /* * Ret information also if never happens, but enough time has elapsed. * Note: return 1 will segfault due to missing event->vc; FIXME! */ if (time(NULL)<=awaketime) return 0; awaketime=time(NULL)+1; break; } while (0); /*....................................... fill missing fields */ event->x+=event->dx, event->y+=event->dy; statusB=event->buttons; i=open_console(O_RDONLY); /* modifiers */ j = event->modifiers; /* save them */ event->modifiers=6; /* code for the ioctl */ if (ioctl(i,TIOCLINUX,&(event->modifiers))<0) gpm_report(GPM_PR_OOPS,GPM_MESS_GET_SHIFT_STATE); event->modifiers |= j; /* add mouse-specific bits */ /* status */ j = stat.v_active; if (ioctl(i,VT_GETSTATE,&stat)<0) gpm_report(GPM_PR_OOPS,GPM_MESS_GET_CONSOLE_STAT); /* * if we changed console, request the current console size, * as different consoles can be of different size */ if (stat.v_active != j) get_console_size(event); close(i); event->vc = stat.v_active; if (oldB==event->buttons) event->type = (event->buttons ? GPM_DRAG : GPM_MOVE); else event->type = (event->buttons > oldB ? GPM_DOWN : GPM_UP); switch(event->type) { /* now provide the cooked bits */ case GPM_DOWN: GET_TIME(tv2); if (tv1.tv_sec && (DIF_TIME(tv1,tv2)<(which_mouse->opt_time))) /* check first click */ statusC++, statusC%=3; /* 0, 1 or 2 */ else statusC=0; event->type|=(GPM_SINGLE<buttons^=oldB; /* for button-up, tell which one */ event->type|= (oldT&GPM_MFLAG); event->type|=(GPM_SINGLE<type |= GPM_MFLAG; event->type|=(GPM_SINGLE<clicks=statusC; /* UGLY - FIXME! */ /* The current policy is to force the following behaviour: * - At buttons up, must fit inside the screen, though flags are set. * - At button down, allow going outside by one single step */ /* selection used 1-based coordinates, so do I */ /* * 1.05: only one margin is current. Y takes priority over X. * The i variable is how much margin is allowed. "m" is which one is there. */ m = 0; i = ((event->type&(GPM_DRAG|GPM_UP))!=0); /* i is boolean */ if (event->y>win.ws_row) {event->y=win.ws_row+1-!i; i=0; m = GPM_BOT;} else if (event->y<=0) {event->y=1-i; i=0; m = GPM_TOP;} if (event->x>win.ws_col) {event->x=win.ws_col+1-!i; if (!m) m = GPM_RGT;} else if (event->x<=0) {event->x=1-i; if (!m) m = GPM_LFT;} event->margin=m; gpm_report(GPM_PR_DEBUG,"dx: %3i dy: %3i x: %3i y: %3i butt: %i vc: %i clicks: %i", event->dx,event->dy, event->x,event->y, event->buttons, event->vc, event->clicks); /* update the global state */ statusX=event->x; statusY=event->y; if (opt_special && event->type & GPM_DOWN) return processSpecial(event); return 1; } gpm-1.20.4/src/daemon/processrequest.c010060000017500001750000000067411101736502100165050ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* close */ #include /* open */ #include /* free */ #include /* vt */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ int processRequest(Gpm_Cinfo *ci, int vc) { int i; Gpm_Cinfo *cinfoPtr; Gpm_Cinfo *next; Gpm_Connect conn; static Gpm_Event event; static struct vt_stat stat; gpm_report(GPM_PR_INFO, GPM_MESS_CON_REQUEST, ci->fd, vc); if (vc>MAX_VC) return -1; /* itz 10-22-96 this shouldn't happen now */ if (vc==-1) gpm_report(GPM_PR_OOPS, GPM_MESS_UNKNOWN_FD); i=get_data(&conn,ci->fd); if (!i) { /* no data */ gpm_report(GPM_PR_DEBUG, GPM_MESS_CLOSE); close(ci->fd); FD_CLR(ci->fd,&connSet); FD_CLR(ci->fd,&readySet); if (cinfo[vc]->fd == ci->fd) { /* it was on top of the stack */ cinfoPtr = cinfo[vc]; cinfo[vc]=cinfo[vc]->next; /* pop the stack */ free(cinfoPtr); return -1; } /* somewhere inside the stack, have to walk it */ cinfoPtr = cinfo[vc]; while (cinfoPtr && cinfoPtr->next) { if (cinfoPtr->next->fd == ci->fd) { next = cinfoPtr->next; cinfoPtr->next = next->next; free (next); break; } cinfoPtr = cinfoPtr->next; } return -1; } /* not data */ if (i == -1) return -1; /* too few bytes */ if (conn.pid!=0) { ci->data = conn; return 0; } /* Aha, request for information (so-called snapshot) */ switch(conn.vc) { case GPM_REQ_SNAPSHOT: i = open_console(O_RDONLY); ioctl(i,VT_GETSTATE,&stat); event.modifiers=6; /* code for the ioctl */ if (ioctl(i,TIOCLINUX,&(event.modifiers))<0) gpm_report(GPM_PR_OOPS,GPM_MESS_GET_SHIFT_STATE); close(i); event.vc = stat.v_active; event.x=statusX; event.y=statusY; event.dx=maxx; event.dy=maxy; event.buttons= statusB; event.clicks=statusC; /* fall through */ /* missing break or do you want this ??? */ case GPM_REQ_BUTTONS: event.type= ((which_mouse->opt_three)==1 ? 3 : 2); /* buttons */ write(ci->fd,&event,sizeof(Gpm_Event)); break; case GPM_REQ_NOPASTE: disable_paste(vc); break; } return 0; } /*-------------------------------------------------------------------*/ gpm-1.20.4/src/daemon/processspecial.c010060000017500001750000000121541101736502100164300ustar00niconico00/* * special commands support for gpm * * Copyright 1996 Alessandro Rubini * Copyright 1998 Ian Zimmerman * Copyright 2001-2008 Nico Schottelius * * Based on an idea by KARSTEN@piobelix.physik.uni-karlsruhe.de * (Karsten Ballueder) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ /* This file is compiled conditionally, see the Makefile */ #include /* for OPEN_MAX */ #include #include #include #include #include #include #include #include #include #include "headers/gpmInt.h" #include "headers/daemon.h" /* daemon internals */ /* * This function is only called at button press, to avoid unnecessary * overhead due to function call at every mouse event */ static int special_status = 0; /* turns on when active */ static int did_parse = 0; /* * The actions are described by these strings. The default is: * left: kill -2 init * middle: shutdown -h now * right: shutdown -r now * * such a default can be overridden by the argument of the "-S" command. * This arg is a colon-separated list of commands. An empty command * is used to make gpm kill init */ static char *commandL=NULL; /* kill init */ static char *commandM="shutdown -h now"; static char *commandR="shutdown -r now"; /* * The return value is 0 if the event has been eaten, * 1 if the event is passed on */ int processSpecial(Gpm_Event *event) { char *command=NULL; int i; FILE *consolef; if ((event->type & GPM_TRIPLE) && (event->buttons == (GPM_B_LEFT|GPM_B_RIGHT))) /* trigger */ special_status=time(NULL); if (!special_status) /* not triggered: return */ return 1; /* devfs change */ consolef=fopen(option.consolename,"w"); if (!consolef) consolef=stderr; if (event->type & GPM_TRIPLE) /* just triggered: make noise and return */ { if (!did_parse) { did_parse++; if (opt_special && opt_special[0]) /* not empty */ { commandL = opt_special; commandM = strchr(opt_special, ':'); if (commandM) { *commandM='\0'; commandM++; commandR = strchr(commandM, ':'); if (commandR) { *commandR='\0'; commandR++; } } } } fprintf(consolef,"\n%s: release all the mouse buttons and press " "one of them\n\twithin three seconds in order to invoke " "a special command\a\a\a\n", option.progname); #ifdef DEBUG fprintf(consolef,"gpm special: the commands are \"%s\", \"%s\", \"%s\"\n", commandL, commandM, commandR); #endif if (consolef!=stderr) fclose(consolef); return 0; /* eaten */ } if (time(NULL) > special_status+3) { fprintf(consolef,"\n%s: timeout: no special command taken\n", option.progname); if (consolef!=stderr) fclose(consolef); special_status=0; return 0; /* eaten -- don't paste or such on this event */ } special_status=0; /* run now, prevent running next time */ #ifdef DEBUG fprintf(consolef,"going to run: buttons is %i\n",event->buttons); #endif switch(event->buttons) { case GPM_B_LEFT: command=commandL; break; case GPM_B_MIDDLE: command=commandM; break; case GPM_B_RIGHT: command=commandR; break; default: fprintf(consolef,"\n%s: more than one button: " "special command discarded\n",option.progname); if (consolef!=stderr) fclose(consolef); return 0; /* eaten */ } fprintf(consolef,"\n%s: executing ", option.progname); if (!command || !command[0]) { fprintf(consolef,"hard reboot (by signalling init)\n"); if (consolef!=stderr) fclose(consolef); kill(1,2); /* kill init: shutdown now */ return 0; } fprintf(consolef,"\"%s\"\n",command); if (consolef!=stderr) fclose(consolef); switch(fork()) { case -1: /* error */ fprintf(stderr,"%s: fork(): %s\n", option.progname, strerror(errno)); return 0; /* Hmmm.... error */ case 0: /* child */ close(0); close(1); close(2); open(GPM_NULL_DEV,O_RDONLY); /* stdin */ open(option.consolename,O_WRONLY); /* stdout */ dup(1); /* stderr */ int open_max = sysconf(_SC_OPEN_MAX); if (open_max == -1) open_max = 1024; for (i=3;i * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include "headers/gpmInt.h" #include "headers/message.h" #include "headers/daemon.h" #include /* malloc() */ /* DESCR: when leaving, we should reset mice to their normal state */ /* RETURN: 0 - failed to reset one or more devices 1 - reset was fine */ /* COMMENT: does error handling and exiting itself */ int reset_mice(struct micetab *micelist) { struct micetab *tmp = micelist; struct micetab *end = tmp; while(tmp != NULL) { /* FIXME! I never get NULL, as free()d before */ end = tmp; while(tmp->next != NULL) { /* set end to the last mouse */ end = tmp; tmp = tmp->next; } gpm_report(GPM_PR_DEBUG,"reset: %s with proto %s",end->device,end->protocol); if(tmp->options != NULL) { gpm_report(GPM_PR_DEBUG,"and options %s",end->options); } free(end); /* be clean() */ tmp = micelist; /* reset to the first mice again */ } return 1; } gpm-1.20.4/src/daemon/selection_copy.c010060000017500001750000000040541101736502100164300ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* open */ #include /* close */ #include /* time */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ void selection_copy(int x1, int y1, int x2, int y2, int mode) { /* * The approach in "selection" causes a bus error when run under SunOS 4.1 * due to alignment problems... */ unsigned char buf[6*sizeof(short)]; unsigned short *arg = (unsigned short *)buf + 1; int fd; buf[sizeof(short)-1] = 2; /* set selection */ arg[0]=(unsigned short)x1; arg[1]=(unsigned short)y1; arg[2]=(unsigned short)x2; arg[3]=(unsigned short)y2; arg[4]=(unsigned short)mode; if ((fd=open_console(O_WRONLY))<0) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN_CON); /* FIXME: should be replaced with string constant (headers/message.h) */ gpm_report(GPM_PR_DEBUG,"ctl %i, mode %i",(int)*buf, arg[4]); if (ioctl(fd, TIOCLINUX, buf+sizeof(short)-1) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_TIOCLINUX); close(fd); if (mode < 3) { opt_aged = 0; last_selection_time = time(0); } } gpm-1.20.4/src/daemon/selection_paste.c010060000017500001750000000030551101736502100165720ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* time */ #include /* open */ #include /* close */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ void selection_paste(void) { char c=3; int fd; if (!opt_aged && (0 != opt_age_limit) && (last_selection_time + opt_age_limit < time(0))) { opt_aged = 1; } if (opt_aged) { gpm_report(GPM_PR_DEBUG,GPM_MESS_SKIP_PASTE); return; } fd=open_console(O_WRONLY); if(ioctl(fd, TIOCLINUX, &c) < 0) gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_TIOCLINUX); close(fd); } gpm-1.20.4/src/daemon/startup.c010060000017500001750000000123161101736502100151130ustar00niconico00/* * general purpose mouse support for Linux * * *Startup and Daemon functions* * * Copyright (c) 2002-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include /* atexit() */ #include /* strlen() */ #include /* errno */ #include /* unlink,geteuid */ #include /* geteuid, mknod */ #include /* mknod */ #include /* mknod */ #include "headers/gpmInt.h" #include "headers/message.h" #include "headers/daemon.h" void startup(int argc, char **argv) { int i, opt; static struct { char *in; char *out; } seq[] = { {"123","01234567"}, {"132","02134657"}, {"213","01452367"}, /* warning: these must be readable as integers... */ {"231","02461357"}, {"312","04152637"}, {"321","04261537"}, {NULL,NULL} }; /* log to debug, who we are */ gpm_report(GPM_PR_DEBUG, GPM_MESS_VERSION); /* basic settings */ option.run_status = GPM_RUN_STARTUP; /* 10,9,8,... let's go */ option.autodetect = 0; /* no mouse autodection */ option.progname = argv[0]; /* who we are */ option.consolename = Gpm_get_console(); /* get consolename */ /* basic2: are not necessary for oops()ing, if not root */ option.no_mice = 0; /* counts -m + -t */ option.micelist = NULL; /* no mice found yet */ option.repeater = 0; /* repeat data */ option.repeater_type = NULL; /* type of */ cmdline(argc, argv); /* parse command line */ if (geteuid() != 0) gpm_report(GPM_PR_OOPS,GPM_MESS_ROOT); /* root or exit */ /* Planned for gpm-1.30, but only with devfs */ /* if(option.autodetect) autodetect(); */ /****************** OLD CODE from gpn.c ***********************/ openlog(option.progname, LOG_PID, option.run_status != GPM_RUN_DEBUG ? LOG_DAEMON : LOG_USER); loadlut(opt_lut); if (option.repeater) { if(mkfifo(GPM_NODE_FIFO,0666) && errno!=EEXIST) gpm_report(GPM_PR_OOPS,GPM_MESS_CREATE_FIFO,GPM_NODE_FIFO); if((fifofd=open(GPM_NODE_FIFO, O_RDWR|O_NONBLOCK)) < 0) gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN, GPM_NODE_FIFO); } /* duplicate initialization */ for (i=1; i <= 1+opt_double; i++) { which_mouse=mouse_table+i; /* used to access options */ if ((which_mouse->opt_accel) < 1) exit(usage("acceleration")); if ((which_mouse->opt_delta) < 2) exit(usage("delta")); if (strlen((which_mouse->opt_sequence)) != 3 || atoi((which_mouse->opt_sequence))<100) exit(usage("sequence")); if ((which_mouse->opt_glidepoint_tap) > 3) exit(usage("glidepoint tap button")); if ((which_mouse->opt_glidepoint_tap)) (which_mouse->opt_glidepoint_tap)=GPM_B_LEFT >> ((which_mouse->opt_glidepoint_tap)-1); /* choose the sequence */ for (opt=0; seq[opt].in && strcmp(seq[opt].in,(which_mouse->opt_sequence)); opt++) ; if(!seq[opt].in) exit(usage("button sequence")); (which_mouse->opt_sequence)=strdup(seq[opt].out); /* I can rewrite on it */ /* look for the mouse type */ (which_mouse->m_type) = find_mouse_by_name((which_mouse->opt_type)); if (!(which_mouse->m_type)) /* not found */ exit(M_listTypes()); } /* Check repeater status */ if (option.repeater) { if (strcmp(option.repeater_type,"raw") == 0) opt_rawrep = 1; else { /* look for the type */ repeated_type = find_mouse_by_name(option.repeater_type); if(!repeated_type) exit(M_listTypes()); /* not found */ if (!(repeated_type->repeat_fun)) /* unsupported translation */ gpm_report(GPM_PR_OOPS,GPM_MESS_NO_REPEAT,option.repeater_type); } } if (option.run_status == GPM_RUN_STARTUP ) { /* else is debugging */ if (daemon(0,0)) gpm_report(GPM_PR_OOPS,GPM_MESS_FORK_FAILED); /* error */ option.run_status = GPM_RUN_DAEMON; /* child */ } /* damon init: check whether we run or not, display message */ check_uniqueness(); gpm_report(GPM_PR_INFO,GPM_MESS_STARTED); //return mouse_table[1].fd; /* the second is handled in the main() */ /****************** OLD CODE from gpn.c END ***********************/ init_mice(option.micelist); /* reads option.micelist */ atexit(gpm_exited); /* call gpm_exited at the end */ } gpm-1.20.4/src/daemon/usage.c010060000017500001750000000024141101736502100145130ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ int usage(char *whofailed) { if (whofailed) { gpm_report(GPM_PR_ERR,GPM_MESS_SPEC_ERR,whofailed,option.progname); return 1; } printf(GPM_MESS_USAGE,option.progname, DEF_ACCEL, DEF_BAUD, DEF_SEQUENCE, DEF_DELTA, DEF_TIME, DEF_LUT,DEF_SCALE, DEF_SAMPLE, DEF_TYPE); return 1; } gpm-1.20.4/src/daemon/wait_text.c010060000017500001750000000036271101736502100154260ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include /* sleep() */ #include /* open */ #include /* KDGETMODE */ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include "headers/gpmInt.h" /* evil old headers */ int wait_text(int *fdptr) { int fd; int kd_mode; close(*fdptr); do { sleep(2); fd = open_console(O_RDONLY); if (ioctl(fd, KDGETMODE, &kd_mode)<0) gpm_report(GPM_PR_OOPS,GPM_MESS_IOCTL_KDGETMODE); close(fd); } while (kd_mode != KD_TEXT); /* reopen, reinit (the function is only used if we have one mouse device) */ if ((*fdptr=open((which_mouse->opt_dev),O_RDWR))<0) gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN,(which_mouse->opt_dev)); if ((which_mouse->m_type)->init) (which_mouse->m_type)=((which_mouse->m_type)->init)(*fdptr, (which_mouse->m_type)->flags, (which_mouse->m_type), mouse_argc[1], mouse_argv[1]); return (1); } gpm-1.20.4/src/drivers004070000017500001750000000000001101736502100133775ustar00niconico00gpm-1.20.4/src/drivers/README010060000017500001750000000020441101736502100143350ustar00niconico00This could be the home of the new driver structure in gpm2. Some ideas: - clean seperation: one directory per driver - shared objects: make each driver being a shared object - and put those objects into libexec? - and make etc/gpm2/enabled_drivers a list of drivers to be enabled - each driver has the following functions: * int gpm2_dr__detect(struct gpm2_dr_info *): detect whether a supported mouse is connected returns: -1: cannot detect mice 0: no mouse detected 1: mouse detected * int gpm2_dr__init(struct gpm2_dr_info *): init mouse returns: 0: mouse init failed 1: mouse init success * gpm2_dr__handle(struct gpm2_dr_info *): the main function that handles the mouse --> perhaps need to pass info from gpm2_dr__init to gpm2_dr__handle - gpm2 passes a structure to all functions: struct gpm2_dr_info { char *dev; char *opts; } - gpm2 creates a fork for each mouse connected - gpm2 forks die on sigterm (normally issued by gpm2) gpm-1.20.4/src/generic004070000017500001750000000000001101761662200133435ustar00niconico00gpm-1.20.4/src/generic/getsym.c010060000017500001750000000024711101736502100150730ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * 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. * ********/ extern int isodigit(const unsigned char c); /* routine to convert digits from octal notation (Andries Brouwer) */ int getsym(const unsigned char *p0, unsigned char *res) { const unsigned char *p = p0; char c; c = *p++; if (c == '\\' && *p) { c = *p++; if (isodigit(c)) { c -= '0'; if (isodigit(*p)) c = 8*c + (*p++ - '0'); if (isodigit(*p)) c = 8*c + (*p++ - '0'); } } *res = c; return (p - p0); } gpm-1.20.4/src/generic/isodigit.c010060000017500001750000000016541101736502100154000ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * 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. * ********/ int isodigit(const unsigned char c) { return ((c & ~7) == '0'); } gpm-1.20.4/src/gpm2004070000017500001750000000000001101736502100125665ustar00niconico00gpm-1.20.4/src/gpm2/Makefile010060000017500001750000000040311101736502100143020ustar00niconico00# # cinit # # Nico Schottelius # # Don't edit Makefiles, use conf/* for configuration. # #include Makefile.tests # Build tools / locations CC=./tmp/cc CFLAGS= LD=./tmp/ld LDFLAGS= STRIP=./tmp/strip SBIN=../sbin # directories and files CONFIG_H=include/config.h BIN=cinit # # End user targets # all: out/gpm2-daemon # # All objects depend on headers. # GPM2_DAEMON_HEADERS=$(shell cat deps/gpm2-daemon-headers) # # Objects # GPM2_DAEMON_OBJECTS=$(shell cat deps/gpm2-daemon) $(GPM2_DAEMON_OBJECTS): $(GPM2_DAEMON_HEADERS) GPM2_DAEMON_PROTOCOLS=$(shell cat tmp/protocol-deps) CLIENT= COMMUNICATION= OBJ= # # Programs # out/gpm2-daemon: $(GPM2_DAEMON_OBJECTS) $(GPM2_DAEMON_PROTOCOLS) $(LD) -o $@ $^ # # Generic # %.o: %.c .configured $(CC) -c -o $@ $< # # First do configuration, so we include the right variables # Makefile: .configured .configured: conf/* @./scripts/generate_cbuiltconfig.sh conf $(CINIT_OBJ): $(CONFIG_H) $(CONFIG_H): ../conf/* ../scripts/cinit.mkheader > $(CONFIG_H) cservice: $(SBIN)/cservice $(SBIN)/cservice util/cservice: $(SBIN) $(CSVC_OBJ) $(LD) $(LDFLAGS) $(CSVC_OBJ) -o $@ $(STRIP) $@ ccontrol: $(SBIN)/ccontrol $(SBIN)/ccontrol util/ccontrol: config.h $(SBIN) $(CCO_OBJ) $(LD) $(LDFLAGS) $(CCO_OBJ) -o $@ $(STRIP) $@ install: install-dir cinit cservice ccontrol @echo '*** Installing cinit ***' ./bin/cinit.install.binary install-miniconf: ./bin/cinit.install.miniconf install-dir: ./bin/cinit.install.dir ################################################################################ # # Build targets # cinit: $(CINIT_OBJ) $(LD) $^ -o $@ uml: cinit ../../vm/uml/uml-mount.sh cp cinit ../../vm/uml/root/sbin/cinit ../../vm/uml/uml-umount.sh umlstart: uml ../../vm/uml/uml-start.sh ################################################################################ # # Generic targets # .PHONY: dist dist: distclean .PHONY: distclean distclean: clean rm -f os/current ipc/current .configured .PHONY: clean clean: rm -f ../tmpbin/*.configured rm -f $(BIN) $(CINIT_OBJ) rm -f test/*.o gpm-1.20.4/src/gpm2/TODO010060000017500001750000000001771101736502100133410ustar00niconico00- read cconfig-directory - create mouse structures - use cconfig-protocol-options as base for each protocol char *fullpath? gpm-1.20.4/src/gpm2/client004070000017500001750000000000001101736502100140445ustar00niconico00gpm-1.20.4/src/gpm2/client/README010060000017500001750000000006551101736502100150100ustar00niconico00The files in this directory should built up the client interface. Some ideas: struct gpm2_conn *gpm2_connect(): client connects to gpm2-daemon gpm2_get_mice(struct gpm2_conn *g2c): get list of devices, including protocols and ids struct *mouseinfo gpm2_open_mouse(int mouse_id, int type); returns set of descriptors: - to read mousedata int gpm2_close_mouse(struct *mouseinfo mi); gpm-1.20.4/src/gpm2/conf004070000017500001750000000000001101736502100135135ustar00niconico00gpm-1.20.4/src/gpm2/conf/README010060000017500001750000000007341101736502100144550ustar00niconico00This is the conf/ directory Nico Schottelius uses to configure his software projects. They evolve with every project and the aim is to replace autoconf once. In general, the idea is to create extremly simply configuration files, that are editable by non-interactive programs (distributor friendly). In most cases only the first line is important and the other lines are simply the description. programs/ - contains definitions of programs we need in our built process gpm-1.20.4/src/gpm2/conf/built004070000017500001750000000000001101736502100146325ustar00niconico00gpm-1.20.4/src/gpm2/conf/built/ld010060000017500001750000000000361101736502100152310ustar00niconico00gcc The program used to link gpm-1.20.4/src/gpm2/conf/built-options004070000017500001750000000000001101736502100163235ustar00niconico00gpm-1.20.4/src/gpm2/conf/built-options/protocols010060000017500001750000000001101101736502100203400ustar00niconico00ps2 List of protocols to enable (at built time: not expandable later). gpm-1.20.4/src/gpm2/conf/programs004070000017500001750000000000001101736502100153455ustar00niconico00gpm-1.20.4/src/gpm2/conf/programs/cc010060000017500001750000000000341101736502100157300ustar00niconico00gcc The c-compiler to use. gpm-1.20.4/src/gpm2/conf/programs/cc.params010060000017500001750000000001121101736502100172070ustar00niconico00-pipe -W -Wall -Werror -I. -Iinclude -g flags to pass to the c-compiler. gpm-1.20.4/src/gpm2/conf/programs/ld010060000017500001750000000000301101736502100157360ustar00niconico00gcc The linker to use. gpm-1.20.4/src/gpm2/core004070000017500001750000000000001101736502100135165ustar00niconico00gpm-1.20.4/src/gpm2/core/main.c010060000017500001750000000024071101736502100146670ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * main: Where life of gpm2 begins. ********/ #include "gpm2-daemon.h" int main(int argc, char **argv) { set_defaults(); if(!commandline(argc,argv)) return 1; if(!read_config(opts.cconfig)) return 1; /* creates a fork() */ if(!mice_handler()) return 1; /* listen to messages: exits only on failure or shutdown */ // listen_ipc(); // shutdown_gpm2(); return 0; } gpm-1.20.4/src/gpm2/core/read_config.c010060000017500001750000000021501101736502100161760ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * read cconfig ********/ #include "gpm2-daemon.h" int read_config(char *cconfig) { /* open cconfig-dir (FIXME: write small framework for reuse) */ if(!cconfig) return 0; /* remove, just to make gcc happy */ /* set options */ return 1; } gpm-1.20.4/src/gpm2/core/set_defaults.c010060000017500001750000000017611101736502100164270ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * set the default options ********/ #include "gpm2-daemon.h" void set_defaults() { /* options */ opts.cconfig = GPM2_CCONFIG; } gpm-1.20.4/src/gpm2/deps004070000017500001750000000000001101736502100135215ustar00niconico00gpm-1.20.4/src/gpm2/deps/gpm2-daemon010060000017500001750000000002121101736502100156230ustar00niconico00core/main.o core/read_config.o core/set_defaults.o generic/commandline.o generic/daemon-usage.o generic/mini_printf.o mice/mice_handler.o gpm-1.20.4/src/gpm2/deps/gpm2-daemon-headers010060000017500001750000000000261101736502100172370ustar00niconico00include/gpm2-daemon.h gpm-1.20.4/src/gpm2/doc004070000017500001750000000000001101736502100133335ustar00niconico00gpm-1.20.4/src/gpm2/doc/CONFIGURATION010060000017500001750000000010661101736502100153460ustar00niconico00Configuration: /etc/gpm2/ mice/ default/ mice-userid: userid of person reading/writing mice devices mice-groupid: groupid of person reading/writing mice devices / device: link or device to use protocol: one line, containing protocol userid: overwrites default/mice-userid groupid: overwrites default/mice-groupid options/: options for that protocol clients/ gpm-1.20.4/src/gpm2/doc/DESIGN010060000017500001750000000037361101736502100143160ustar00niconico00Possible design of gpm2: gpm2-starter: - reads configuration - starts daemons * first gpm2-daemon - connects daemons * connects them through stdin and stdout? - perhaps a job of gpm2-daemon? * stderr is relayed to the log console - which can log to syslog gpm2-daemon: - main daemon - starts mice handlers - listens for ipc - relays input data abstracted to clients - does *NOT* draw a cursor or something like that - can be used by x.org (see below) - opens mice devices? - should be portable gpm2-io: - gets list of opened fds or of devices - uses poll() / select() on mice devices - retrieves data packets - forwards raw data packets to gpm2-daemon from devices - either - forwards raw data packets from gpm2-daemon to devices?? - decodes mice packets: does protocol handling and forwards decoded packages to gpm2_daemon - has a mouse - fd_in - fd_out list - has *NO* root priviliges gpm2-decode: - forwards raw data packets from gpm2-daemon - forwards decoded packages to clients (like gpm2-cdisplay) gpm2-raw-relay: - reads data from gpm2-daemon - writes raw data to clients - a client needs to connect n times for n mice gpm2-cdisplay: - Console DISPLAYS: displays mouse cursor on console - reads input from gpm2-daemon - reads mouse information - perhaps os-specific versions gpm2-ccandp: - Console Copy AND Paste daemon - reads input from gpm2-daemon - copies selected text into own buffer - pastes buffer to console - perhaps os-specific versions gpm2-xorg: - interface between gpm2 and x.org - could make mouse support unecessary in x.org - should be portable gpm2-syslog: - connects to the gpm2-daemon logging port - reads messages - relays them to syslog gpm-1.20.4/src/gpm2/generic004070000017500001750000000000001101736502100142025ustar00niconico00gpm-1.20.4/src/gpm2/generic/commandline.c010060000017500001750000000022601101736502100167120ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * handle command line arguments ********/ #include /* getopt() */ #include "gpm2-daemon.h" int commandline(int argc, char **argv) { int opt; while((opt = getopt(argc,argv,GPM2_ARGS)) != -1) { switch(opt) { default: usage(); break; } } return 1; } gpm-1.20.4/src/gpm2/generic/daemon-usage.c010060000017500001750000000022551101736502100167750ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * Print out, how to use gpm2-daemon ********/ #include "gpm2-generic.h" void usage() { mini_printf("gpm2-daemon: written by Nico Schottelius\n",1); mini_printf("\n",1); mini_printf(" -c : specify configuration directory\n",1); mini_printf(" -f: fork into background after startup \n",1); } gpm-1.20.4/src/gpm2/generic/mini_printf.c010060000017500001750000000006431101736502100167450ustar00niconico00/*********************************************************************** * * 2005-2007 Nico Schottelius (nico-cinit at schottelius.org) * * part of cLinux/cinit * * Print the world! * */ #include void mini_printf(char *str,int fd) { char *p; /* don't get fooled by bad pointers */ if(str == NULL) return; p = str; while(*p) p++; write(fd,str,(size_t) (p - str)); } gpm-1.20.4/src/gpm2/generic/read_packet.c010060000017500001750000000025631101736502100166740ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * read one mouse packet and return it ********/ #include /* read() */ #include /* NULL */ #include /* malloc() */ #include /* errno */ char *read_packet(int fd, int len) { char *packet; errno = 0; /* no library function ever sets errno to 0, so we do */ packet = malloc(len); if(packet == NULL) return NULL; if(read(fd,&packet,len) == -1) { free(packet); return NULL; } return packet; } gpm-1.20.4/src/gpm2/include004070000017500001750000000000001101736502100142115ustar00niconico00gpm-1.20.4/src/gpm2/include/gpm2-client.h010060000017500001750000000016341101736502100165650ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * client information ********/ /* functions */ gpm-1.20.4/src/gpm2/include/gpm2-config.h010060000017500001750000000016321101736502100165520ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * values shared by daemon and clients ********/ gpm-1.20.4/src/gpm2/include/gpm2-daemon.h010060000017500001750000000025761101736502100165600ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * daemon specific include file ********/ #ifndef GPM2_DAEMON #define GPM2_DAEMON /* parameters and options */ #define GPM2_ARGS "c:f" #define GPM2_CCONFIG "/etc/gpm2" struct gpm2_options { char *cconfig; /* configuration directory */ } opts; /* functions */ int commandline(int argc, char **argv); int mice_handler(); int read_config(char *cconfig); void set_defaults(); void usage(); /* structs */ struct mouse { /* pointer to init and decode functions */ int (*open)(int fd); }; #endif gpm-1.20.4/src/gpm2/include/gpm2-data.h010060000017500001750000000031051101736502100162130ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * data definitions used by clients and daemon ********/ /* structs */ struct gpm2_mouse { char *name; char *dev; int fd; }; struct gpm2_me { /* mouse element */ struct gpm2_mouse mouse; struct gpm2_me *next; struct gpm2_me *prev; }; struct gpm2_packet_raw() { /* raw mouse packets */ char *data; int len; }; /* must contain everything a mouse can do */ struct gpm2_packet() { /* decoded mouse packets */ int nr_buttons; int *buttons; int pos_type; /* absolute or relativ */ }; /* structure */ struct gpm2_mic /* gpm2-daemon needs a list of mice, containing: * - name of mouse * - device used * - filedescriptor * - mouse configuration as found in cconfig */ gpm-1.20.4/src/gpm2/include/gpm2-generic.h010060000017500001750000000017371101736502100167270ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * generic functions: used by daemon and clients ********/ /* generic functions */ void mini_printf(char *str,int fd); gpm-1.20.4/src/gpm2/include/gpm2-io.h010060000017500001750000000020051101736502100157070ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * data definitions used by clients and daemon ********/ #ifndef GPM2_IO_H #define GPM2_IO_H char *read_packet(int fd, int len); /* needed? */ #endif gpm-1.20.4/src/gpm2/mice004070000017500001750000000000001101736502100135035ustar00niconico00gpm-1.20.4/src/gpm2/mice/README010060000017500001750000000037401101736502100144450ustar00niconico00This directory should contain the mice-protocol implementations. Each file (or if bigger: directory) implements one protocol. You have to create three functions: gpm2_open_(); gpm2_handle_(); gpm2_close_(); It's not yet clear, how to register protocols to gpm2. First idea of inclusion: - create deps/mouse- containging all dependencies - conf/built-options/mice specifies which mice protocols to include - a script generates include/gpm2-daemon-mice.h containg a struct-array that looks like: struct mice_protos { char *name; int (*open)(); int (*handle)(); int (*open)(); }; -------------------------------------------------------------------------------- More design ideas for using mice: - The gpm2_handle function gets a pointer to a char array containing the data packet. - The gpm2_handle function returns what the packet means - gpm2_daemon may then decide what todo with this information -------------------------------------------------------------------------------- It would be nice to have a read_config_ that reads and verifies the protocol specific options. For this, it would be nice to have a libcconfig() like this: struct cconfig_fd *cconfig_open(char *dir); struct cconfig_tree *cconfig_read_tree(struct cconfig_fd *which); struct cconfig_element *cconfig_select_below(char *basepath, struct cconfig_fd *which, ...); The tree, cconfig_read_tree creates could consist of elements of the following definition: struct cconfig_element { char *path; struct stat sbuf; }; -------------------------------------------------------------------------------- gpm2_open_*: - needs fd - needs options -------------------------------------------------------------------------------- struct datapacket *gpm2_read_*(int fd) - reads one packet - returns it -------------------------------------------------------------------------------- gpm-1.20.4/src/gpm2/mice/deps004070000017500001750000000000001101736502100144365ustar00niconico00gpm-1.20.4/src/gpm2/mice/deps/ps2010060000017500001750000000000131101736502100151350ustar00niconico00mice/ps2.o gpm-1.20.4/src/gpm2/mice/init_mice_handler.c010060000017500001750000000022001101736502100173540ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * handle mice ********/ /* unclean headers */ #include #include #include #include /* close */ #include "gpm2-daemon.h" #include "tmp/protocols.h" int init_mice_handler() { /* open connections: pipes */ return 1; } gpm-1.20.4/src/gpm2/mice/mice_handler.c010060000017500001750000000032141101736502100163370ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * handle mice ********/ /* unclean headers */ #include #include #include #include /* close */ #include "gpm2-daemon.h" #include "tmp/protocols.h" int mice_handler() { /* init_mice_handler(); * open connections to gpm2_daemon: * - one for each mouse: * * raw channel (unidirectional) * * decoded channel (unidirectional) * * control channel (bidirectional) */ init_mice_handler(); /* init_mice: * * - open mousedev * - drop priviliges after that */ //init_mice(); //handle_mice(); /* forks and maintains mice */ /* dirty hack */ int ps2test = open("/dev/psaux",O_RDWR); gpm2_open_ps2(ps2test); gpm2_decode_ps2(ps2test); close(ps2test); return 0; } gpm-1.20.4/src/gpm2/mice/ps2.c010060000017500001750000000061261101736502100144360ustar00niconico00/* * gpm2 - mouse driver for the console * * Copyright (c) 2007 Nico Schottelius * * 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. * * * handle standard ps2 ********/ #include /* usleep() */ #include /* tcflush() */ #include #include "gpm2-daemon.h" #include "gpm2-generic.h" /* protocol handler stolen from gpm1/mice.c */ /* ps2 protocol description * * 3 Bytes per packet * * first bit of data[0]: Left Button * second bit of data[0]: Right Button * third bit of data[0]: Middle Button * fourth bit of data[0]: Always 1 * fifth bit of data[0]: X Sign * sixth bit of data[0]: Y Sign * seventh bit of data[0]: X Overflow * eighth bit of data[0]: Y Overflow * * data[1]: X Movement * data[2]: Y Movement */ /* standard ps2 */ /* FIXME: implement error handling and options as described on * http://www.computer-engineering.org/ps2mouse/ */ int gpm2_open_ps2(int fd) { //static unsigned char s[] = { 246, 230, 244, 243, 100, 232, 3, }; // write(fd, s, sizeof (s)); // static unsigned char s[] = { 246, 230, 244, 243, 100, 232, 3, }; char obuf, ibuf; /* FIXME: check return */ obuf = 0xff; /* reset mouse */ write(fd, &obuf, 1); read(fd,&ibuf,1); printf("RX: %#hhx\n",ibuf); // if(ibuf != 0xfa) return 0; // obuf = 0xf6; /* set mouse to default */ // write(fd, &obuf, 1); // read(fd,&ibuf,1); // printf("DF: %#hhx\n",ibuf); obuf = 0xf2; /* device id */ write(fd, &obuf, 1); read(fd,&ibuf,1); printf("ST: %#hhx\n",ibuf); read(fd,&ibuf,1); printf("DI: %#hhx\n",ibuf); /* set resolution: 0xe8 */ //if(scaling = 2) { e7h // // 0xe6 scaling =1 /* do 0xf2, get device id and print it out */ /* do 0xe9 and print out values as status */ /* FIXME: time correct? */ usleep (30000); tcflush (fd, TCIFLUSH); return 0; } /* returs gpm2-readable data */ //int *gpm2_decode_ps2(char *data, struct mousedata *decoded) int gpm2_decode_ps2(int fd) { char data[3]; data[0] = 0; data[1] = 0; data[2] = 0; read(fd,data,3); if(data[0] & 0x01) mini_printf("left!\n",1); if(data[0] & 0x02) mini_printf("right!\n",1); if(data[0] & 0x04) mini_printf("middle!\n",1); /* decoded->button_left = data[0] & 0x01; decoded->button_right = data[0] & 0x02; decoded->button_middle = data[0] & 0x04; decoded-> */ return 1; } gpm-1.20.4/src/gpm2/scripts004070000017500001750000000000001101736502100142555ustar00niconico00gpm-1.20.4/src/gpm2/scripts/generate_cbuiltconfig.sh010070000017500001750000000016301101736502100212120ustar00niconico00#!/bin/sh # Nico Schottelius # 2007-05-11 # First script to generate built environment from # a standard cconfig directory for building. [ "$#" -eq 1 ] || exit 23 set -e # args confdir="$1" # paths below the configuration directory programs="programs" progdir="$confdir/$programs" # paths directly in the srcdir tmpdir="tmp" # # generate built programs # for tmp in "${progdir}"/*; do prog="" params="" baseprog="$(basename "$tmp")" destprog="$tmpdir/$baseprog" # ignore *.params, those are parameters, not programs if [ "${tmp%.params}" != "${tmp}" ]; then continue fi # check for params pfile="${tmp}.params" if [ -f "$pfile" ]; then params="$(head -n1 "$pfile")" fi prog=$(head -n1 "$tmp") echo "Creating $destprog: $prog $params" echo '#!/bin/sh' > "${destprog}" echo "\"${prog}\" $params \"\$@\"" >> "${destprog}" chmod 0700 "${destprog}" done gpm-1.20.4/src/gpm2/scripts/include_protocols.sh010060000017500001750000000010331101736502100204130ustar00niconico00#!/bin/sh # Nico Schottelius # 2007-05-13 # Create protocol related files [ "$#" -eq 1 ] || exit 23 set -e # args confdir="$1" # paths below the configuration directory builtopts="built-options" builtoptsdir="$confdir/$builtopts" # paths directly in the srcdir tmpdir="tmp" # # generate built programs # : > "${tmpdir}/protocols.h" for proto in $(head -n1 ${builtoptsdir}/protocols); do echo "int gpm2_open_${proto}(int fd);" > "${tmpdir}/protocols.h" echo "int gpm2_decode_${proto}(int fd);" >> "${tmpdir}/protocols.h" done gpm-1.20.4/src/gpm2/tmp004070000017500001750000000000001101736502100133665ustar00niconico00gpm-1.20.4/src/gpm2/tmp/README010060000017500001750000000000511101736502100143200ustar00niconico00Directory for temporarily created files. gpm-1.20.4/src/headers004070000017500001750000000000001101761662200133425ustar00niconico00gpm-1.20.4/src/headers/config.h.in010060000017500001750000000062471101502354400154450ustar00niconico00/* src/headers/config.h.in. Generated from configure.in by autoheader. */ /* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP systems. This function is required for `alloca.c' support on those systems. */ #undef CRAY_STACKSEG_END /* Define to 1 if using `alloca.c'. */ #undef C_ALLOCA /* GPM release number as a string */ #undef GPM_RELEASE /* release date as a string */ #undef GPM_RELEASE_DATE /* Define to 1 if you have `alloca', as a function or macro. */ #undef HAVE_ALLOCA /* Define to 1 if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to 1 if you have the header file. */ #undef HAVE_CURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_INPUT_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_JOYSTICK_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_MAJOR_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_TTY_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_CURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `syslog' function. */ #undef HAVE_SYSLOG /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSMACROS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vsyslog' function. */ #undef HAVE_VSYSLOG /* define if the __u32 type exists either in sys/types.h or in linux/types.h */ #undef HAVE___U32 /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at runtime. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS gpm-1.20.4/src/headers/daemon.h010060000017500001750000000166761101736502100150460ustar00niconico00/* * Daemon internals * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GPM_DAEMON_H #define _GPM_DAEMON_H /************************************************************************* * Includes */ #include "gpm.h" /* Gpm_Event */ #include /* fd_set */ /************************************************************************* * Types / structures */ struct micetab { struct micetab *next; char *device; char *protocol; char *options; }; struct options { int autodetect; /* -u [aUtodetect..'A' is unavailable] */ int no_mice; /* number of mice */ int repeater; /* repeat data */ char *repeater_type; /* repeat data as which mouse type */ int run_status; /* startup/daemon/debug */ char *progname; /* hopefully gpm ;) */ struct micetab *micelist; /* mice and their options */ char *consolename; /* /dev/tty0 || /dev/vc/0 */ }; typedef struct Gpm_Cinfo { Gpm_Connect data; int fd; struct Gpm_Cinfo *next; } Gpm_Cinfo; /* and this is the entry in the mouse-type table */ typedef struct Gpm_Type { char *name; char *desc; /* a descriptive line */ char *synonyms; /* extra names (the XFree name etc) as a list */ /* mouse specific event handler: */ int (*fun)(Gpm_Event *state, unsigned char *data); /* mouse specific initialisation function: */ struct Gpm_Type *(*init)(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv); unsigned short flags; unsigned char proto[4]; int packetlen; int howmany; /* how many bytes to read at a time */ int getextra; /* does it get an extra byte? (only mouseman) */ int absolute; /* flag indicating absolute pointing device */ /* repeat this event into fd */ int (*repeat_fun)(Gpm_Event *state, int fd); } Gpm_Type; /* this structure is used to hide the dual-mouse stuff */ struct mouse_features { char *opt_type, *opt_dev, *opt_sequence; int opt_baud, opt_sample, opt_delta, opt_accel, opt_scale, opt_scaley, opt_time, opt_cluster, opt_three, opt_glidepoint_tap; char *opt_options; /* extra textual configuration */ Gpm_Type *m_type; int fd; }; /************************************************************************* * Macros */ /* How many virtual consoles are managed? */ #ifndef MAX_NR_CONSOLES # define MAX_NR_CONSOLES 64 /* this is always sure */ #endif #define MAX_VC MAX_NR_CONSOLES /* doesn't work before 1.3.77 */ /* for adding a mouse; add_mouse */ #define GPM_ADD_DEVICE 0 #define GPM_ADD_TYPE 1 #define GPM_ADD_OPTIONS 2 /* all the default values */ #define DEF_TYPE "ms" #define DEF_DEV NULL /* use the type-related one */ #define DEF_LUT "-a-zA-Z0-9_./\300-\326\330-\366\370-\377" #define DEF_SEQUENCE "123" /* how buttons are reordered */ #define DEF_BAUD 1200 #define DEF_SAMPLE 100 #define DEF_DELTA 25 #define DEF_ACCEL 2 #define DEF_SCALE 10 #define DEF_TIME 250 /* time interval (ms) for multiple clicks */ #define DEF_THREE 0 /* have three buttons? */ #define DEF_KERNEL 0 /* no kernel module, by default */ /* 10 on old computers (<=386), 0 on current machines */ #define DEF_CLUSTER 0 /* maximum number of clustered events */ #define DEF_TEST 0 #define DEF_PTRDRAG 1 /* double or triple click */ #define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */ /************************************************************************* * Global variables */ extern char *opt_lut; extern char *opt_special; extern int opt_resize; /* not really an option */ extern time_t opt_age_limit; extern struct options option; /* one should be enough for us */ extern int mouse_argc[3]; /* 0 for default (unused) */ extern char **mouse_argv[3]; /* and two mice */ extern int opt_aged, opt_ptrdrag, opt_test, opt_double; extern int statusX, statusY, statusB, statusC; /* clicks */ extern int fifofd; extern int opt_rawrep; extern int maxx, maxy; extern fd_set selSet, readySet, connSet; extern int eventFlag; extern struct winsize win; extern Gpm_Cinfo *cinfo[MAX_VC+1]; extern struct mouse_features mouse_table[3], *which_mouse; /*the current one*/ extern Gpm_Type mice[]; extern Gpm_Type *repeated_type; time_t last_selection_time; /************************************************************************* * Functions */ char **build_argv(char *argv0, char *str, int *argcptr, char sep); void disable_paste(int vc); int do_client(Gpm_Cinfo *cinfo, Gpm_Event *event); int do_selection(Gpm_Event *event); void get_console_size(Gpm_Event *ePtr); int get_data(Gpm_Connect *where, int whence); char *getMouseData(int fd, Gpm_Type *type, int kd_mode); int getsym(const unsigned char *p0, unsigned char *res); void gpm_exited(void); void gpm_killed(int signo); int open_console(const int mode); int old_main(); int processConn(int fd); int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode); int processRequest(Gpm_Cinfo *ci, int vc); int processSpecial(Gpm_Event *event); void selection_copy(int x1, int y1, int x2, int y2, int mode); void selection_paste(void); void startup(int argc, char **argv); int wait_text(int *fdptr); /* meta-mouse functions */ void add_mouse (int type, char *value); int init_mice (struct micetab *micelist); int reset_mice(struct micetab *micelist); /* gpn.c */ void cmdline(int argc, char **argv); int giveInfo(int request, int fd); int loadlut(char *charset); int usage(char *whofailed); struct Gpm_Type *find_mouse_by_name(char *name); void check_uniqueness(void); void check_kill(void); /* gpm.c */ int old_main(); #endif gpm-1.20.4/src/headers/gpm-proto.h010060000017500001750000000116771101736502100155230ustar00niconico00 #ifndef __GPMPROTO_H__ #define __GPMPROTO_H__ /* * This is a draft for a protocol to use for a "generic input device" * that can feed packets to gpm. In general, this "generic input * device" will be a program that collects data from whatever source * fits its scope and pushes packet to gpm for handling. The same * protocol may be used to get events into X. My main motivation for * this is exploiting my screenless touchscreen to do handwriting * recognition and other silly stuff. * * While it may look complex, I think it's in fact easy; also, it * fits the fixed-size contraint that simplifies data transfer, features * aligned data items and does not pose any limit on the number of * axis/buttons/keys delivered with each packet. It can be * implemented slowly and each functionality can be verified in real * usage. It should be extensible enough to be pretty long-lived. * * Please note that I don't know of any similar effort, so I may just * be reinventing the wheel or doing some other stupid errors. * * Please note that timestamping is still missing, although it should * fit the design (just forgot about it, and the joystick api reminded * me about that). */ /* * This is the fixed-size packet, multi-byte fields use the network * byte order, so ntohl() and ntohs() are needed, but portability is * ensured. Note that it is 16 bytes, 4 of them are "control" info and * the rest is three 4-bytes data items. */ struct gpm_procotol_packet { __u8 flags; /* 10xxxxFF flags defined later */ __u8 buttons; /* 01BBBBBB button-1 to button-6 */ __u16 key; /* how to read the following data */ union { __u32 l; /* "long" */ __s32 sl; /* "signed long" */ __u16 w[2]; /* "word" */ __s16 sw[2]; /* "signed word" */ __u8 b[4]; /* "byte" */ __s8 sb[4]; /* "signed byte" */ } data[3]; }; /* * these flags can be used to build up longer packets (thus placing no limit * on the number of dimensions, buttons, keypresses per packet). A complete * packet has both flags set, otherwise other packets must be retrieved to * have all the information available. Most "simple" input devices will * just need one chunk of data (it offers three dimensions and 6 buttons) */ #define GPM_PROTOCOL_FLAG_FIRST 0x01 #define GPM_PROTOCOL_FLAG_LAST 0x02 /* * The "key" field is made up of three bitfields, each defines what the * corresponfing "data" item means. There are 15 meanings for each datum, * and the top four bits are currently unused and must be cleared. */ enum gpm_protocol_item { GPM_ITEM_UNUSED = 0, /* the data field is unused */ GPM_ITEM_RAXIS, /* relative X, Y, Z or further (signed long) */ GPM_ITEM_AAXIS, /* absolute axis (unsigned long, full-range) */ GPM_ITEM_BUTTONS, /* 32 buttons (7-38, 39-70, ...) as u32 mask */ GPM_ITEM_8BITKEYS, /* ascii or so, as u8. 0xff == unused */ GPM_ITEM_KEYCODES, /* keycodes as s16: pos/neg, 0x8000 == unused */ GPM_ITEM_KEYSYM, /* X keysym. positive/negative (?) as s32 */ GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED, GPM_ITEM_RESERVED }; /* RAXIS: relative position. First axis is X, then Y, then Z and so on. Use of third-and-further axis is application specific. As for scaling, I think every motion must be rescaled, and a mouse tick may be 1/1024 of the whole screen or so, but I'm not sure about that. If it is not rescaled to match absolute movements, then you can't mix relative and absolute movements, something that I want to be able to do. AAXIS: absolute position on an axis, scaled to the whole 32bit range. BUTTONS: if more than 6 buttons are there, a data field can host 32 extra buttons. If 38 are not enough other data fields can follow. If the complete packet is made up by more than one protocol item, the "buttons" field of trailing items is unused. Use of the buttons is application specific. 8BITKEYS: One to four ascii-or-so keys to push in the keyboard buffer. This is needed by the twiddler, for example. I have to study how the X protocol works before I can use this in X. KEYCODES: Raw keyboard keycodes. I feel these must be discouraged, as users remap their keyboards (although smart use of dumpkeys can unmap the keycodes properly). Positive for press and negative for release; up to two keycodes can fit in one data item KEYSYM: X keysym. (range 0 to 0xFFFFFF). Once again, I have to study X, but I think there is no need for press/release events. Each data item can host a single keysym as they span 24 bits */ #endif /* __GPM_PROTO_H__ */ gpm-1.20.4/src/headers/gpm.h010060000017500001750000000231571101736502100143560ustar00niconico00/* -*-mode:C;tab-width:3-*- * gpm.h - public include file for gpm * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright 1998 Ian Zimmerman * Copyright 2002-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #ifndef _GPM_H_ #define _GPM_H_ #include /* _PATH_VARRUN etc. */ #ifdef __cplusplus extern "C" { #endif /*....................................... Xtermish stuff */ #define GPM_XTERM_ON \ printf("%c[?1001s",27), fflush(stdout), /* save old hilit tracking */ \ printf("%c[?1000h",27), fflush(stdout) /* enable mouse tracking */ #define GPM_XTERM_OFF \ printf("%c[?1000l",27), fflush(stdout), /* disable mouse tracking */ \ printf("%c[?1001r",27), fflush(stdout) /* restore old hilittracking */ /*....................................... Cfg pathnames */ /* Provide trailing slash, since mostly used for building pathnames. */ #ifndef _PATH_VARRUN #define _PATH_VARRUN "/var/run/" #endif #ifndef _PATH_DEV #define _PATH_DEV "/dev/" #endif #define GPM_NODE_DIR _PATH_VARRUN /* itz Wed Jul 1 11:56:46 PDT 1998 this definitely ought not to be world-writable; umask doesn't apply either, as gpm is most often run from init */ #define GPM_NODE_DIR_MODE 0775 #define GPM_NODE_PID GPM_NODE_DIR "gpm.pid" #define GPM_NODE_DEV _PATH_DEV "gpmctl" /* itz Wed Jul 1 12:09:29 PDT 1998 let's simplify this by placing the file always in /dev whether it's a device or socket. It doesn't really belong to /var/run anyway. */ #define GPM_NODE_CTL GPM_NODE_DEV #define GPM_NODE_FIFO _PATH_DEV "gpmdata" /*....................................... Cfg buttons */ /* Each button has one bit in the 16 bit buttons field. * Mouse movement and wheel movement are not associated with a button * i.e. buttons=GPM_B_NONE in these cases * (except for ms3 mouse, for reasons unknown?) * The middle button if pressed down (or clicked) is independent of * the wheel "device" which it happens to be associated with * The use of GPM_B_UP/DOWN with ms3 is unclear. Maybe the wheel * could be rolled forward then backward * and this would generate a 'click' event on 'button 5' GPM_B_UP, * but really the expected behaviour of wheel is movement, typically * used for jump scrolling or for jumping between fields on a form. */ #define GPM_B_DOWN 32 #define GPM_B_UP 16 #define GPM_B_FOURTH 8 #define GPM_B_LEFT 4 #define GPM_B_MIDDLE 2 #define GPM_B_RIGHT 1 #define GPM_B_NONE 0 /*................................... Strange requests (iff conn->pid==0)*/ #define GPM_REQ_SNAPSHOT 0 #define GPM_REQ_BUTTONS 1 #define GPM_REQ_CONFIG 2 #define GPM_REQ_NOPASTE 3 /*....................................... The event types */ enum Gpm_Etype { GPM_MOVE=1, GPM_DRAG=2, /* exactly one of the bare ones is active at a time */ GPM_DOWN=4, GPM_UP= 8, #define GPM_BARE_EVENTS(type) ((type)&(0x0f|GPM_ENTER|GPM_LEAVE)) GPM_SINGLE=16, /* at most one in three is set */ GPM_DOUBLE=32, GPM_TRIPLE=64, /* WARNING: I depend on the values */ GPM_MFLAG=128, /* motion during click? */ GPM_HARD=256, /* if set in the defaultMask, force an already used event to pass over to another handler */ GPM_ENTER=512, /* enter event, user in Roi's */ GPM_LEAVE=1024 /* leave event, used in Roi's */ }; #define Gpm_StrictSingle(type) (((type)&GPM_SINGLE) && !((type)&GPM_MFLAG)) #define Gpm_AnySingle(type) ((type)&GPM_SINGLE) #define Gpm_StrictDouble(type) (((type)&GPM_DOUBLE) && !((type)&GPM_MFLAG)) #define Gpm_AnyDouble(type) ((type)&GPM_DOUBLE) #define Gpm_StrictTriple(type) (((type)&GPM_TRIPLE) && !((type)&GPM_MFLAG)) #define Gpm_AnyTriple(type) ((type)&GPM_TRIPLE) /*....................................... The event data structure */ enum Gpm_Margin {GPM_TOP=1, GPM_BOT=2, GPM_LFT=4, GPM_RGT=8}; /*....................................... The reported event */ typedef struct Gpm_Event { unsigned char buttons, modifiers; /* try to be a multiple of 4 */ unsigned short vc; short dx, dy, x, y; /* displacement x,y for this event, and absolute x,y */ enum Gpm_Etype type; /* clicks e.g. double click are determined by time-based processing */ int clicks; enum Gpm_Margin margin; /* wdx/y: displacement of wheels in this event. Absolute values are not * required, because wheel movement is typically used for scrolling * or selecting fields, not for cursor positioning. The application * can determine when the end of file or form is reached, and not * go any further. * A single mouse will use wdy, "vertical scroll" wheel. */ short wdx, wdy; } Gpm_Event; /*....................................... The handling function */ typedef int Gpm_Handler(Gpm_Event *event, void *clientdata); /*....................................... The connection data structure */ #define GPM_MAGIC 0x47706D4C /* "GpmL" */ typedef struct Gpm_Connect { unsigned short eventMask, defaultMask; unsigned short minMod, maxMod; int pid; int vc; } Gpm_Connect; /*....................................... The region of Interest */ typedef struct Gpm_Roi { short xMin,xMax; short yMin,yMax; unsigned short minMod, maxMod; unsigned short eventMask; unsigned short owned; Gpm_Handler *handler; void *clientdata; struct Gpm_Roi *prev; struct Gpm_Roi *next; } Gpm_Roi; /*....................................... Global variables for the client */ extern int gpm_flag, gpm_ctlfd, gpm_fd, gpm_hflag, gpm_morekeys; extern int gpm_zerobased; extern int gpm_visiblepointer; extern int gpm_mx, gpm_my; /* max x and y to fit margins */ extern struct timeval gpm_timeout; extern unsigned char _gpm_buf[]; extern unsigned short * _gpm_arg; extern Gpm_Handler *gpm_handler; extern void *gpm_data; extern Gpm_Handler *gpm_roi_handler; extern void *gpm_roi_data; extern Gpm_Roi *gpm_roi; extern Gpm_Roi *gpm_current_roi; /*....................................... Prototypes for the client */ /* all of them return 0 or errno */ #include /* needed to get FILE */ #include /* to get the prototype for ioctl() */ /* liblow.c */ extern int Gpm_Open(Gpm_Connect *, int); extern int Gpm_Close(void); extern int Gpm_GetEvent(Gpm_Event *); extern int Gpm_CharsQueued(void); extern int Gpm_Getc(FILE *); #define Gpm_Getchar() Gpm_Getc(stdin) extern int Gpm_Repeat(int millisec); extern int Gpm_FitValuesM(int *x, int *y, int margin); #define Gpm_FitValues(x,y) Gpm_FitValuesM((x),(y),-1); #define Gpm_FitEvent(ePtr) \ do { \ int _x, _y; \ if ((ePtr)->margin && ((ePtr)->type&(GPM_DRAG | GPM_UP))) \ { \ _x = (ePtr)->x; \ _y = (ePtr)->y; \ Gpm_FitValuesM(&_x, &_y, (ePtr)->margin); \ (ePtr)->x = _x; \ (ePtr)->y = _y; \ } \ } while(0) \ /* the following is a (progn ...) form */ #define Gpm_DrawPointer(x, y, fd) \ (_gpm_buf[sizeof(short)-1] = 2, \ _gpm_arg[0] = _gpm_arg[2] = \ (unsigned short)(x)+gpm_zerobased, \ _gpm_arg[1] = _gpm_arg[3] = \ (unsigned short)(y)+gpm_zerobased, \ _gpm_arg[4] = (unsigned short)3, \ ioctl(fd, TIOCLINUX, _gpm_buf+sizeof(short)-1)) /* the following is a heavy thing ... */ extern int gpm_consolefd; /* liblow.c */ /* #define GPM_DRAWPOINTER(event) \ * ((gpm_consolefd=open("/dev/console",O_RDWR))>=0 && \ * Gpm_DrawPointer((event)->x,(event)->y,gpm_consolefd), \ * close(gpm_consolefd)) */ #define GPM_DRAWPOINTER(ePtr) \ (Gpm_DrawPointer((ePtr)->x,(ePtr)->y,gpm_consolefd)) /* libhigh.c */ Gpm_Handler Gpm_HandleRoi; Gpm_Roi *Gpm_PushRoi(int x, int y, int X, int Y, int mask, Gpm_Handler *fun, void *xtradata); Gpm_Roi * Gpm_PopRoi(Gpm_Roi *which); Gpm_Roi * Gpm_RaiseRoi(Gpm_Roi *which, Gpm_Roi *before); Gpm_Roi * Gpm_LowerRoi(Gpm_Roi *which, Gpm_Roi *after); /* libcurses.c */ /* #include Hmm... seems risky */ extern int Gpm_Wgetch(); #define Gpm_Getch() (Gpm_Wgetch(NULL)) /* libxtra.c */ char *Gpm_GetLibVersion(int *where); char *Gpm_GetServerVersion(int *where); int Gpm_GetSnapshot(Gpm_Event *ePtr); /* tools.c: do they really need to be exported? Can't we keep them in gpmInt.h ? */ char *Gpm_get_console( void ); int Gpm_x_high_y(int base, int pot_y); int Gpm_cnt_digits(int number); void gpm_oops(int line, char *file, char *text, ... ); /* report.c / report-lib.c */ void gpm_report(int line, char *file, int stat, char *text, ... ); #ifdef __cplusplus }; #endif #endif /* _GPM_H_ */ gpm-1.20.4/src/headers/gpmCfg.h010060000017500001750000000046011101736502100147670ustar00niconico00/* * gpm-Linux configuration file (server only) * * Copyright 1994-1996 rubini@linux.it * Copyright (C) 1998 Ian Zimmerman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #ifndef _GPMCFG_INCLUDED #define _GPMCFG_INCLUDED #define GPM_NAME "gpm" #define GPM_DATE "May 2002" /* timeout for the select() syscall */ #define SELECT_TIME 86400 /* one day */ #ifdef HAVE_LINUX_TTY_H #include #endif /* FIXME: still needed ?? */ /* How many virtual consoles are managed? */ #ifndef MAX_NR_CONSOLES # define MAX_NR_CONSOLES 64 /* this is always sure */ #endif #define MAX_VC MAX_NR_CONSOLES /* doesn't work before 1.3.77 */ /* How many buttons may the mouse have? */ /* #define MAX_BUTTONS 3 ===> not used, it is hardwired :-( */ /* all the default values */ #define DEF_TYPE "ms" #define DEF_DEV NULL /* use the type-related one */ #define DEF_LUT "-a-zA-Z0-9_./\300-\326\330-\366\370-\377" #define DEF_SEQUENCE "123" /* how buttons are reordered */ #define DEF_BAUD 1200 #define DEF_SAMPLE 100 #define DEF_DELTA 25 #define DEF_ACCEL 2 #define DEF_SCALE 10 #define DEF_TIME 250 /* time interval (ms) for multiple clicks */ #define DEF_THREE 0 /* have three buttons? */ #define DEF_KERNEL 0 /* no kernel module, by default */ /* 10 on old computers (<=386), 0 on current machines */ #define DEF_CLUSTER 0 /* maximum number of clustered events */ #define DEF_TEST 0 #define DEF_PTRDRAG 1 /* double or triple click */ #define DEF_GLIDEPOINT_TAP 0 /* tapping emulates no buttons by default */ #endif /* _GPMCFG_INCLUDED */ gpm-1.20.4/src/headers/gpmInt.h010060000017500001750000000072301101736502100150230ustar00niconico00/* * gpmInt.h - server-only stuff for gpm * * Copyright (C) 1994-1999 Alessandro Rubini * Copyright (C) 1998 Ian Zimmerman * Copyright (C) 2001-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #ifndef _GPMINT_INCLUDED #define _GPMINT_INCLUDED #include /* time_t */ /* for whom ???? FIXME */ #include "gpm.h" #if !defined(__GNUC__) # define inline #endif /*....................................... old gpmCfg.h */ /* timeout for the select() syscall */ #define SELECT_TIME 86400 /* one day */ #ifdef HAVE_LINUX_TTY_H #include #endif /* How many buttons may the mouse have? */ /* #define MAX_BUTTONS 3 ===> not used, it is hardwired :-( */ /* misc :) */ #define GPM_NULL_DEV "/dev/null" #define GPM_SYS_CONSOLE "/dev/console" #define GPM_DEVFS_CONSOLE "/dev/vc/0" #define GPM_OLD_CONSOLE "/dev/tty0" /*** mouse commands ***/ #define GPM_AUX_SEND_ID 0xF2 #define GPM_AUX_ID_ERROR -1 #define GPM_AUX_ID_PS2 0 #define GPM_AUX_ID_IMPS2 3 /* these are shameless stolen from /usr/src/linux/include/linux/pc_keyb.h */ #define GPM_AUX_SET_RES 0xE8 /* Set resolution */ #define GPM_AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */ #define GPM_AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */ #define GPM_AUX_GET_SCALE 0xE9 /* Get scaling factor */ #define GPM_AUX_SET_STREAM 0xEA /* Set stream mode */ #define GPM_AUX_SET_SAMPLE 0xF3 /* Set sample rate */ #define GPM_AUX_ENABLE_DEV 0xF4 /* Enable aux device */ #define GPM_AUX_DISABLE_DEV 0xF5 /* Disable aux device */ #define GPM_AUX_RESET 0xFF /* Reset aux device */ #define GPM_AUX_ACK 0xFA /* Command byte ACK. */ #define GPM_AUX_BUF_SIZE 2048 /* This might be better divisible by three to make overruns stay in sync but then the read function would need a lock etc - ick */ /*....................................... Structures */ #define GPM_EXTRA_MAGIC_1 0xAA #define GPM_EXTRA_MAGIC_2 0x55 // looks unused; delete //typedef struct Opt_struct_type {int a,B,d,i,p,r,V,A;} Opt_struct_type; /* the other variables */ extern int opt_kill; extern int opt_kernel, opt_explicittype; extern int opt_aged; extern time_t opt_age_limit; /*....................................... Prototypes */ /* mice.c */ extern int M_listTypes(void); /* special.c */ int processSpecial(Gpm_Event *event); int twiddler_key(unsigned long message); int twiddler_key_init(void); /*....................................... Dirty hacks */ #undef GPM_USE_MAGIC /* magic token foreach message? */ #define mkfifo(path, mode) (mknod ((path), (mode) | S_IFIFO, 0)) /* startup_daemon */ #ifdef GPM_USE_MAGIC #define MAGIC_P(code) code #else #define MAGIC_P(code) #endif #endif /* _GPMINT_INCLUDED */ gpm-1.20.4/src/headers/message.h010060000017500001750000000275771101753547600152460ustar00niconico00/* * defines used for messaging * * Copyright (c) 2001,2002 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _MESSAGE_H #define _MESSAGE_H /* printing / reporting */ #define FL __LINE__,__FILE__ #define FLS "[%s(%d)]: " #define FLP FLS,file,line /* for switch (intern) */ #define GPM_STAT_DEBUG 2 #define GPM_STAT_INFO 3 #define GPM_STAT_ERR 4 #define GPM_STAT_WARN 5 #define GPM_STAT_OOPS 6 /* for print (extern) */ #define GPM_PR_DEBUG FL,GPM_STAT_DEBUG #define GPM_PR_INFO FL,GPM_STAT_INFO #define GPM_PR_ERR FL,GPM_STAT_ERR #define GPM_PR_WARN FL,GPM_STAT_WARN #define GPM_PR_OOPS FL,GPM_STAT_OOPS /* messages */ #define GPM_TEXT_INFO "*** info " #define GPM_TEXT_WARN "*** warning " #define GPM_TEXT_DEBUG "*** debug " #define GPM_TEXT_ERR "*** err " #define GPM_TEXT_OOPS "O0o.oops(): " /* strings */ #define GPM_STRING_INFO GPM_TEXT_INFO FLP #define GPM_STRING_WARN GPM_TEXT_WARN FLP #define GPM_STRING_DEBUG GPM_TEXT_DEBUG FLP #define GPM_STRING_ERR GPM_TEXT_ERR FLP #define GPM_STRING_OOPS GPM_TEXT_OOPS FLP /* running situations */ #define GPM_RUN_STARTUP 0 #define GPM_RUN_DAEMON 1 #define GPM_RUN_DEBUG 2 /* messages */ /* info */ #define GPM_MESS_VERSION "gpm " GPM_RELEASE " " GPM_RELEASE_DATE #define GPM_MESS_STARTED "Started gpm successfully. Entered daemon mode." #define GPM_MESS_KILLED "Killed gpm(%d)." #define GPM_MESS_SKIP_DATA "Skipping a data packet (?)" #define GPM_MESS_DATA_4 "Data %02x %02x %02x (%02x)" #define GPM_MESS_NO_MAGIC "No magic" #define GPM_MESS_CONECT_AT "Connecting at fd %i" #define GPM_MESS_USAGE "Usage: %s [options]\n" \ " Valid options are (not all of them are implemented)\n" \ " -a accel sets the acceleration (default %d)\n" \ " -A [limit] start with selection disabled (`aged')\n" \ " -b baud-rate sets the baud rate (default %d)\n" \ " -B sequence allows changing the buttons (default '%s')\n" \ " -d delta sets the delta value (default %d) (must be 2 or more)\n" \ " -D debug mode: don't auto-background\n" \ " -g tap-button sets the button (1-3) that is emulated by tapping on\n" \ " a glidepoint mouse, none by default. (mman/ps2 only)\n" \ " -i interval max time interval for multiple clicks (default %i)\n" \ " -k kill a running gpm, to start X with a busmouse\n" \ " -l charset loads the inword() LUT (default '%s')\n" \ " -m mouse-device sets mouse device\n" \ " -M enable multiple mice. Following options refer to\n" \ " the second device. Forces \"-R\"\n" \ " -o options decoder-specific options (e.g.: \"dtr\", \"rts\")\n" \ " -p draw the pointer while striking a selection\n" \ " -q quit after changing mouse behaviour\n" \ " -r number sets the responsiveness (default %i)\n" \ " -R mouse-type enter repeater mode. X should read /dev/gpmdata\n" \ " like it was a mouse-type device. Default is MouseSystems.\n" \ " You can also specify \"raw\" to relay the raw device data.\n" \ " -s sample-rate sets the sample rate (default %d)\n" \ " -S [commands] enable special commands (see man page)\n" \ " -t mouse-type sets mouse type (default '%s')\n" \ " Use a non-existent type (e.g. \"help\") to get a list\n" \ " -T test: read mouse, no clients\n" \ " -v print version and exit\n" \ " -V verbosity increase number of logged messages\n\n\n" \ " Examples:\n\n" \ " gpm -m /dev/misc/psaux -t ps2 to start with a ps2 mouse\n" \ " gpm -m /dev/tts/0 -t mman to use mouse man on COM1\n\n" /* Later ... but first when it's running */ /* " -u autodetect mice [not implemented yet]\n" \ */ #define GPM_MESS_IMPS2_AUTO "imps2: Auto-detected intellimouse PS/2" #define GPM_MESS_IMPS2_PS2 "imps2: Auto-detected standard PS/2" #define GPM_MESS_AVAIL_MYT "Available mouse types are:\n\n" \ "r name synonym description\n\n" #define GPM_MESS_SYNONYM "%c %-8s %s\n Synonyms: %s\n" /* generic messages */ #define GPM_MESS_DOUBLE_S "%s: %s" #define GPM_MESS_DOUBLE_I "%i - %i:" #define GPM_MESS_X_Y_VAL "x %i, y %i" /* mem */ #define GPM_MESS_NO_MEM "I couln't get any memory! I die! :(" #define GPM_MESS_ALLOC_FAILED "allocation failed!" /* files */ #define GPM_MESS_SOCKET "socket(): %s" #define GPM_MESS_TEMPNAM "tempnam(): %s" #define GPM_MESS_OPEN "Could not open %s." #define GPM_MESS_CREATE_FIFO "Creating FIFO %s failed." #define GPM_MESS_STALE_PID "Removing stale pid file %s" #define GPM_MESS_MKSTEMP_FAILED "mkstemp failed with file %s!" #define GPM_MESS_NOTWRITE "Can you write to %s?" #define GPM_MESS_WRITE_ERR "write(): %s" #define GPM_MESS_OPEN_CON "Opening console failed." #define GPM_MESS_OPEN_SERIALCON "We seem to be on a serial console." #define GPM_MESS_READ_FIRST "Error in read()ing first: %s" #define GPM_MESS_READ_REST "Error in read()ing rest: %s" #define GPM_MESS_REMOVE_FILES "Removing files %s and %s" #define GPM_MESS_READ_PROB "Problem reading from %s" #define GPM_MESS_CLOSE "Closing" /* error */ #define GPM_MESS_CANT_KILL "Couldn't kill gpm(%d)!" #define GPM_MESS_FSTAT "fstat()" #define GPM_MESS_SETSID_FAILED "Setsid failed" #define GPM_MESS_CHDIR_FAILED "change directory failed" #define GPM_MESS_FORK_FAILED "Fork failed." #define GPM_MESS_VCCHECK "Failed on virtual console check." #define GPM_MESS_PROT_ERR "Error in protocol" #define GPM_MESS_ROOT "You should be root to run gpm!" #define GPM_MESS_SPEC_ERR "Error in the %s specification. Try \"%s -h\".\n" #define GPM_MESS_ALREADY_RUN "gpm is already running as pid %d" #define GPM_MESS_NO_REPEAT "Repeating into %s protocol not yet implemented :-(" #define GPM_MESS_GET_SHIFT_STATE "get_shift_state" #define GPM_MESS_GET_CONSOLE_STAT "get_console_status" #define GPM_MESS_DISABLE_PASTE "disabling pasting per request from virtual console (%d)" #define GPM_MESS_UNKNOWN_FD "Unknown fd selected" #define GPM_MESS_ACCEPT_FAILED "accept() failed: %s" #define GPM_MESS_ADDRES_NSOCKET "Address %s not a socket in processConn" #define GPM_MESS_SOCKET_OLD "Socket too old in processConn" #define GPM_MESS_GETSOCKOPT "getsockopt(SO_PEERCRED): %s" #define GPM_MESS_STAT_FAILS "stat on %s fails in processConn" #define GPM_MESS_NEED_MDEV "Please use -m /dev/mouse -t protocol" #define GPM_MESS_MOUSE_INIT "mouse initialization failed" #define GPM_MESS_SOCKET_PROB "socket()" #define GPM_MESS_BIND_PROB "Problem binding %s" #define GPM_MESS_SELECT_PROB "Problem with select" #define GPM_MESS_SELECT_STRING "select(): %s" #define GPM_MESS_SELECT_TIMES "selected %i times" #define GPM_MESS_OPTION_NO_ARG "%s: Option \"%s\" takes no argument: ignoring \"%s\"" #define GPM_MESS_INVALID_ARG "%s: Invalid arg. \"%s\" to \"%s\"" #define GPM_MESS_CONT_WITH_ERR "%s: Continuing despite errors in option parsing" #define GPM_MESS_TOO_MANY_OPTS "%s: Too many options for \"-t %s\"" #define GPM_MESS_NETM_NO_ACK "netmouse: No acknowledge (got %d)" #define GPM_MESS_NETM_INV_MAGIC "netmouse: Invalid reply magic (got %d,%d,%d)" #define GPM_MESS_WACOM_MACRO "WACOM Macro: %d" #define GPM_MESS_GUNZE_INV_PACK "gunze: invalid packet \"%s\"" #define GPM_MESS_MMAN_DETECTED "MouseMan detected" #define GPM_MESS_INIT_GENI "initializing genitizer" #define GPM_MESS_WACOM_MOD "WACOM Mode: %c Modell: %s (Answer: %s)" #define GPM_MESS_IMPS2_INIT "imps2: PS/2 mouse failed init" #define GPM_MESS_IMPS2_FAILED "imps2: PS/2 mouse failed (3 button) init" #define GPM_MESS_IMPS2_MID_FAIL "imps2: PS/2 mouse failed to read id, assuming standard PS/2" #define GPM_MESS_IMPS2_SETUP_FAIL "imps2: PS/2 mouse failed setup, continuing..." #define GPM_MESS_IMPS2_BAD_ID "imps2: Auto-detected unknown mouse type %d, assuming standard PS/2" #define GPM_MESS_GUNZE_WRONG_BAUD "%s: %s: wrong baud rate, using 19200" #define GPM_MESS_GUNZE_CALIBRATE "%s: gunze: calibration data absent or invalid,using defaults" #define GPM_MESS_TOO_MANY_SPECIAL "%s: too many special functions (max is %i)" #define GPM_MESS_SYNTAX_1 "%s: %s :%i: Syntax error" #define GPM_MESS_UNKNOWN_MOD_1 "%s: %s :%i: Unknown modifier \"%s\"" #define GPM_MESS_INCORRECT_COORDS "%s: %s :%i: Incorrect chord \"%s\"" #define GPM_MESS_INCORRECT_LINE "%s: %s :%i: Incorrect line:\"%s\"" #define GPM_MESS_FIRST_DEV "Use -m device -t protocol [-o options]!" #define GPM_MESS_ELO_CALIBRATE "%s: etouch: calibration file %s absent or invalid, using defaults" /* warnings */ #define GPM_MESS_REQUEST_ON "Request on vc %i > %i" #define GPM_MESS_FAILED_CONNECT "Failed gpm connect attempt by uid %d for vc %s" #define GPM_MESS_ZERO_SCREEN_DIM "zero screen dimension, assuming 80x25" #define GPM_MESS_STRANGE_DATA "Data on strange file descriptor %d" #define GPM_MESS_RESIZING "%s pid %i is resizing :-)" #define GPM_MESS_KILLED_BY "%s pid %i killed by a new %s" #define GPM_MESS_REDEF_COORDS "%s: %s :%i: Warning: Chord \"%s%s%s\" redefined" /* IOCTL */ #define GPM_MESS_IOCTL_KDGETMODE "ioctl(KDGETMODE)" #define GPM_MESS_IOCTL_TIOCLINUX "ioctl(TIOCLINUX)" #define GPM_MESS_IOCTL_TIOCSTI "%s: ioctl(TIOCSTI): %s" /* debug */ #define GPM_MESS_PEER_SCK_UID "peer socket uid = %d" #define GPM_MESS_LONG_STATUS "Pid %i, vc %i, ev %02X, def %02X, minm %02X, maxm %02X" #define GPM_MESS_SKIP_DATAP "Skipping a data packet: Data %02x %02x %02x %02x" #define GPM_MESS_KILLING "Trying to kill gpm running at pid %d" /* other */ #define GPM_MESS_SKIP_PASTE "Skipping paste; selection has aged" #define GPM_EXTRA_DATA "Extra %02x" #define GPM_MESS_SIGNED "Signed." #define GPM_MESS_CSELECT "is your kernel compiled with CONFIG_SELECTION on?" #define GPM_MESS_NOTHING_MORE "Nothing more" #define GPM_MESS_CON_REQUEST "Request on %i (console %i)" #define GPM_MESS_SCREEN_SIZE "Screen size: %d - %d" /* #define GPM_MESS_ "" */ /* functions */ void gpm_report(int line, char *file, int stat, char *text, ... ); /* rest of wd.h */ #ifdef HAVE_SYSLOG_H #include #else #define LOG_EMERG 0 #define LOG_ALERT 1 #define LOG_CRIT 2 #define LOG_ERR 3 #define LOG_WARNING 4 #define LOG_NOTICE 5 #define LOG_INFO 6 #define LOG_DEBUG 7 #endif #endif /* _MESSAGE_H */ gpm-1.20.4/src/headers/synaptics.h010060000017500001750000000070131101736502100156010ustar00niconico00/* * synaptics.h - support for the synaptics serial and ps2 touchpads * * Copyright 1999 hdavies@ameritech.net (Henry Davies * * 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. ********/ /* ** Design/Goals ** I want to use the Synaptics Serial touchpad as a cursor device under ** Linux (gpm). With this device I want to support operations similar ** to those supported by the Synaptics WinDOS driver, and some others ** of my own devising. ** ** Features: ** Corner Clicks ** This recognizes taps on the touchpad in the corner(s) and ** translates them into specific actions. Initially I am looking ** at actions on the order of alternate button clicks. Other ** alternatives include drags and whatnot. ** Edge Extensions ** This recognizes that the finger has moved from the center region ** of the touchpad and dragged to the edge area. At which point ** I want to be able to extend the motion by automatically moving ** in the direction of the edge. ** Toss n Catch ** This recognizes a quick motion of the finger on the touchpad and ** uses that to define a velocity vector for the cursor. A tap ** on the touchpad at a later time catches (stops) the cursor. ** Tap n Drag ** A quick tap of the touchpad followed by finger motion on the ** touchpad initiates what would be a drag with a normal mouse ** type device. ** Pressure Sensitive Velocity ** The Synaptics touchpad indicates the touch pressure of the finger ** (really an interface area) this is used to accelerate the cursor ** motion. This can be used in the normal motion, Tap n Drag, or ** Edge Extension modes. In normal motion and Tap n Drag this may ** be awkward due to increased friction caused by the pressure. */ #ifndef _SYNAPTICS_H_ #define _SYNAPTICS_H_ /* ** syn_process_serial_data ** ** Process the touchpad 6/7/8 byte data. */ void syn_process_serial_data (Gpm_Event *state, unsigned char *data); /* ** syn_process_ps2_data ** ** Process the touchpad 6 byte data. */ void syn_process_ps2_data (Gpm_Event *state, unsigned char *data); /* ** syn_serial_init ** ** Initialize the synaptics touchpad. Read model and identification. ** Determine the size of the touchpad in "pixels". Select 6/7/8 byte packets, ** select 9600 baud, and select high packet rate. ** Return how many bytes in a packet. */ int syn_serial_init (int fd); /* ** syn_ps2_init ** ** Initialize the synaptics touchpad. Read model and identification. ** Determine the size of the touchpad in "pixels". Select 6 byte packets, ** and select high packet rate. */ void syn_ps2_init (int fd); /* ** syn_ps2_reset ** ** Reset the synaptics touchpad. Touchpad ends in relative mode. */ void syn_ps2_reset (int fd); #endif gpm-1.20.4/src/headers/twiddler.h010060000017500001750000000023511101736502100154020ustar00niconico00/* definition of the twiddler protocol */ /* * 2400,8,n,1 5-bytes * * bit 7 6 5 4 3 2 1 0 * 0 4L 3M 3L 2M 2L 1M 1L * 1 Mo Al Co Fn Nm Sh 4M * 1 V6 V5 V4 V3 V2 V1 V0 * 1 H4 H3 H2 H1 H0 V8 V7 * 1 0 0 0 H8 H7 H6 H5 * H and V are two complement: up and left is positive */ #define TW_L1 0x0001 #define TW_M1 0x0002 #define TW_R1 0x0003 #define TW_ANY1 0x0003 #define TW_L2 0x0004 #define TW_M2 0x0008 #define TW_R2 0x000C #define TW_ANY2 0x000C #define TW_L3 0x0010 #define TW_M3 0x0020 #define TW_R3 0x0030 #define TW_ANY3 0x0030 #define TW_L4 0x0040 #define TW_M4 0x0080 #define TW_R4 0x00C0 #define TW_ANY4 0x00C0 #define TW_MOD_0 0x0000 #define TW_MOD_S 0x0100 #define TW_MOD_N 0x0200 #define TW_MOD_F 0x0400 #define TW_MOD_C 0x0800 #define TW_MOD_A 0x1000 #define TW_MOD_M 0x2000 #define TW_ANY_KEY 0x3fff /* any button or modifier */ #define TW_ANY_MOD 0x3f00 /* any modifier */ #define TW_V_SHIFT 14 #define TW_H_SHIFT 23 #define TW_M_MASK 0x1FF /* mask of movement bits, after shifting */ #define TW_M_BIT 0x100 #define TW_SYSTEM_FILE SYSCONFDIR "/gpm-twiddler.conf" #define TW_CUSTOM_FILE SYSCONFDIR "/gpm-twiddler.user" gpm-1.20.4/src/lib004070000017500001750000000000001101761662200124755ustar00niconico00gpm-1.20.4/src/lib/libcurses.c010060000017500001750000000106341101736502100147100ustar00niconico00/* * libcurses.c - client library - curses level (gpm-Linux) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright 2002 nico@schottelius.org (Nico Schottelius) * * xterm management is mostly by Miguel de Icaza * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include /* select(); */ #include /* timeval */ #include /* socket() */ #include "headers/gpmInt.h" #ifdef HAVE_NCURSES_H #include #else #ifdef HAVE_NCURSES_CURSES_H #include #else #ifdef HAVE_CURSES_H #include #endif /* HAVE_CURSES_H */ #endif /* HAVE_NCURSES_CURSES_H */ #endif /* HAVE_NCURSES_H */ #define GET(win) ((win) ? wgetch(win) : getch()) int Gpm_Wgetch(WINDOW *win) { fd_set selSet; int max, flag, result; int fd=STDIN_FILENO; static Gpm_Event ev; if (!gpm_flag || gpm_fd==-1) return GET(win); if (gpm_morekeys) return (*gpm_handler)(&ev,gpm_data); gpm_hflag=0; max = (gpm_fd>fd) ? gpm_fd : fd; /*...................................................................*/ if (gpm_fd>=0) /* linux */ while(1) { if (gpm_visiblepointer) GPM_DRAWPOINTER(&ev); do { FD_ZERO(&selSet); FD_SET(fd,&selSet); FD_SET(gpm_fd,&selSet); gpm_timeout.tv_sec=SELECT_TIME; flag=select(max+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&gpm_timeout); } while (!flag); if (FD_ISSET(fd,&selSet)) return GET(win); if (flag==-1) continue; if (Gpm_GetEvent(&ev) && gpm_handler && (result=(*gpm_handler)(&ev,gpm_data))) { gpm_hflag=1; return result; } } else /*...................................................................*/ if (gpm_fd==-2) /* xterm */ { #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; /* JD patch 11/08/1998 */ #define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; extern int gpm_convert_event(char *data, Gpm_Event *event); int c; unsigned char mdata[4]; /* JD patch 11/08/1998 */ if (nbprevchar) /* if there are some consumed char ... */ return prevchar[--nbprevchar]; /* if ungetc() didn't suffice... */ /* if ((c=prevchar)!=EOF) { prevchar=EOF; return c; } */ while(1) { do { FD_ZERO(&selSet); FD_SET(fd,&selSet); gpm_timeout.tv_sec=SELECT_TIME; flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&gpm_timeout); } while (!flag); if ((c=GET(win))!=0x1b) return c; /* escape: go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) return c; if ((c=GET(win))!='[') {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ /* {ungetc(c,stdin); return 0x1B;} */ /* '[': go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ /* {ungetc(c,stdin); return 0x1B;} */ if ((c=GET(win))!='M') /* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/ {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;} /* {ungetc(c,stdin);prevchar='['; return 0x1B;} */ /* now, it surely is a mouse event */ for (c=0;c<3;c++) mdata[c]=GET(win); gpm_convert_event(mdata,&ev); if (gpm_handler && (result=(*gpm_handler)(&ev,gpm_data))) { gpm_hflag=1; return result; } } /* while(1) */ } return 0; } gpm-1.20.4/src/lib/libhigh.c010060000017500001750000000125561101736502100143300ustar00niconico00/* * libhigh.c - client library - high level (gpm) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include "headers/gpmInt.h" Gpm_Roi *gpm_roi=NULL; Gpm_Roi *gpm_current_roi=NULL; Gpm_Handler *gpm_roi_handler=NULL; void *gpm_roi_data; /*-------------------------------------------------------------------*/ Gpm_Roi *Gpm_PushRoi(int x, int y, int X, int Y, int mask, Gpm_Handler *fun, void *xtradata) { Gpm_Roi *new; /* create a Roi and push it */ new=(Gpm_Roi *)malloc(sizeof(Gpm_Roi)); if (!new) return NULL; /* use the roi handler, if still null */ if (!gpm_roi && !gpm_handler) gpm_handler=Gpm_HandleRoi; new->xMin=x; new->xMax=X; new->yMin=y; new->yMax=Y; new->minMod=0; new->maxMod=~0; new->prev = new->next=NULL; new->eventMask=mask; new->owned=0; /* use free() */ new->handler=fun; new->clientdata = xtradata ? xtradata : (void *)new; return Gpm_RaiseRoi(new,NULL); } /*-------------------------------------------------------------------*/ Gpm_Roi *Gpm_UseRoi(Gpm_Roi *new) { /* use a Roi by pushing it */ new->prev = new->next=NULL; new->owned=1; /* don't free() */ /* use the roi handler, if still null */ if (!gpm_roi && !gpm_handler) gpm_handler=Gpm_HandleRoi; return Gpm_RaiseRoi(new,NULL); } /*-------------------------------------------------------------------*/ Gpm_Roi *Gpm_PopRoi(Gpm_Roi *which) { /* extract the Roi and remove it */ if (which->prev) which->prev->next = which->next; if (which->next) which->next->prev = which->prev; if (gpm_roi==which) gpm_roi=which->next; if (which->owned==0) free(which); if (gpm_current_roi==which) gpm_current_roi=NULL; return gpm_roi; /* return the new top-of-stack */ } /*-------------------------------------------------------------------*/ Gpm_Roi *Gpm_RaiseRoi(Gpm_Roi *which, Gpm_Roi *before) { /* raise a Roi above another, or to top-of-stack */ if (!gpm_roi) return gpm_roi=which; if (!before) before=gpm_roi; if (before==which) return gpm_roi; if (which->prev) which->prev->next = which->next; if (which->next) which->next->prev = which->prev; if (gpm_roi==which) gpm_roi=which->next; which->prev=before->prev; before->prev=which; which->next=before; if (which->prev) which->prev->next=which; else gpm_roi=which; return gpm_roi; /* return the new top-of-stack */ } /*-------------------------------------------------------------------*/ Gpm_Roi *Gpm_LowerRoi(Gpm_Roi *which, Gpm_Roi *after) { /* lower a Roi below another, or to bottom-of-stack */ if (!after) for (after=gpm_roi; after->next; after=after->next) ; if (after==which) return gpm_roi; if (which->prev) which->prev->next = which->next; if (which->next) which->next->prev = which->prev; if (gpm_roi==which) gpm_roi=which->next; which->next=after->next; after->next=which; which->prev=after; if (which->next) which->next->prev=which; return gpm_roi; /* return the new top-of-stack */ } /*===================================================================* * This function is in care of all event dispatching. * It generates also GPM_ENTER and GPM_LEAVE events. */ int Gpm_HandleRoi(Gpm_Event *ePtr, void *clientdata) { static Gpm_Event backEvent; Gpm_Roi *roi=gpm_current_roi; /* * If motion or press, look for the interested roi. * Drag and release will be reported to the old roi. */ if (ePtr->type&(GPM_MOVE|GPM_DOWN)) for (roi=gpm_roi; roi; roi=roi->next) { if (roi->xMin > ePtr->x || roi->xMax < ePtr->x) continue; if (roi->yMin > ePtr->y || roi->yMax < ePtr->y) continue; if ((roi->minMod & ePtr->modifiers) < roi->minMod) continue; if ((roi->maxMod & ePtr->modifiers) < ePtr->modifiers) continue; break; } /* * Now generate the leave/enter events */ if (roi!=gpm_current_roi) { if (gpm_current_roi && (gpm_current_roi->eventMask & GPM_LEAVE)) { backEvent.type=GPM_LEAVE; (*(gpm_current_roi->handler))(&backEvent,gpm_current_roi->clientdata); } if (roi && (roi->eventMask & GPM_ENTER)) { backEvent.type=GPM_ENTER; (*(roi->handler))(&backEvent,roi->clientdata); } } gpm_current_roi=roi; /* * events not requested are discarded */ if (roi && (GPM_BARE_EVENTS(ePtr->type) & roi->eventMask) == 0) return 0; backEvent=*ePtr; /* copy it, so the main one is unchanged */ if (!roi) { if (gpm_roi_handler) return (*gpm_roi_handler)(&backEvent,gpm_roi_data); return 0; } /* * Ok, now report the event as it is, after modifying x and y */ backEvent.x -= roi->xMin; backEvent.y -= roi->yMin; return (*(roi->handler))(&backEvent,roi->clientdata); } gpm-1.20.4/src/lib/liblow.c010060000017500001750000000461231101736502100142070ustar00niconico00/* * * liblow.c - client library - low level (gpm) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * Copyright 2001-2008 Nico Schottelius (nico-gpm2008 at schottelius.org) * * xterm management is mostly by jtklehto@stekt.oulu.fi (Janne Kukonlehto) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include #include /* strncmp */ #include /* select(); */ #include #include /* timeval */ #include /* socket() */ #include /* socket() */ #include /* struct sockaddr_un */ #include /* O_RDONLY */ #include /* stat() */ #ifdef SIGTSTP /* true if BSD system */ #include #include #endif #include #include /* VT_GETSTATE */ #include /* KDGETMODE */ #include /* winsize */ #include "headers/gpmInt.h" #include "headers/message.h" #ifndef min #define min(a,b) ((a)<(b) ? (a) : (b)) #define max(a,b) ((a)>(b) ? (a) : (b)) #endif /*....................................... Stack struct */ typedef struct Gpm_Stst { Gpm_Connect info; struct Gpm_Stst *next; } Gpm_Stst; /*....................................... Global variables */ int gpm_flag=0; /* almost unuseful now -- where was it used for ? can we remove it now ? FIXME */ int gpm_tried=0; int gpm_fd=-1; int gpm_hflag=0; Gpm_Stst *gpm_stack=NULL; struct timeval gpm_timeout={10,0}; Gpm_Handler *gpm_handler=NULL; void *gpm_data=NULL; int gpm_zerobased=0; int gpm_visiblepointer=0; int gpm_mx, gpm_my; /* max x and y (1-based) to fit margins */ unsigned char _gpm_buf[6*sizeof(short)]; unsigned short * _gpm_arg = (unsigned short *)_gpm_buf +1; int gpm_consolefd=-1; /* used to invoke ioctl() */ int gpm_morekeys=0; int gpm_convert_event(unsigned char *mdata, Gpm_Event *ePtr); /*----------------------------------------------------------------------------* * nice description *----------------------------------------------------------------------------*/ static inline int putdata(int where, Gpm_Connect *what) { #ifdef GPM_USE_MAGIC static int magic=GPM_MAGIC; if (write(where,&magic,sizeof(int))!=sizeof(int)) { gpm_report(GPM_PR_ERR,GPM_MESS_WRITE_ERR,strerror(errno)); return -1; } #endif if (write(where,what,sizeof(Gpm_Connect))!=sizeof(Gpm_Connect)) { gpm_report(GPM_PR_ERR,GPM_MESS_WRITE_ERR,strerror(errno)); return -1; } return 0; } #if (defined(SIGWINCH)) /* itz Wed Mar 18 11:19:52 PST 1998 hook window change as well */ /* Old SIGWINCH handler. */ static struct sigaction gpm_saved_winch_hook; /*----------------------------------------------------------------------------* * nice description *----------------------------------------------------------------------------*/ static void gpm_winch_hook (int signum) { struct winsize win; if (SIG_IGN != gpm_saved_winch_hook.sa_handler && SIG_DFL != gpm_saved_winch_hook.sa_handler) { gpm_saved_winch_hook.sa_handler(signum); } /*if*/ if (ioctl(gpm_consolefd, TIOCGWINSZ, &win) == -1) { return; } /*if*/ if (!win.ws_col || !win.ws_row) { win.ws_col=80; win.ws_row=25; } /*if*/ gpm_mx = win.ws_col - gpm_zerobased; gpm_my = win.ws_row - gpm_zerobased; } #endif /* SIGWINCH */ #if (defined(SIGTSTP)) /* itz: support for SIGTSTP */ /* Old SIGTSTP handler. */ static struct sigaction gpm_saved_suspend_hook; /*----------------------------------------------------------------------------* * nice description *----------------------------------------------------------------------------*/ static void gpm_suspend_hook (int signum) { Gpm_Connect gpm_connect; sigset_t old_sigset; sigset_t new_sigset; struct sigaction sa; int success; sigemptyset (&new_sigset); sigaddset (&new_sigset, SIGTSTP); sigprocmask (SIG_BLOCK, &new_sigset, &old_sigset); /* Open a completely transparent gpm connection */ gpm_connect.eventMask = 0; gpm_connect.defaultMask = ~0; gpm_connect.minMod = ~0; gpm_connect.maxMod = 0; /* cannot do this under xterm, tough */ success = (Gpm_Open (&gpm_connect, 0) >= 0); /* take the default action, whatever it is (probably a stop :) */ sigprocmask (SIG_SETMASK, &old_sigset, 0); sigaction (SIGTSTP, &gpm_saved_suspend_hook, 0); kill (getpid (), SIGTSTP); /* in bardo here */ /* Reincarnation. Prepare for another death early. */ sigemptyset(&sa.sa_mask); sa.sa_handler = gpm_suspend_hook; sa.sa_flags = SA_NOMASK; sigaction (SIGTSTP, &sa, 0); /* Pop the gpm stack by closing the useless connection */ /* but do it only when we know we opened one.. */ if (success) { Gpm_Close (); } /*if*/ } #endif /* SIGTSTP */ /*----------------------------------------------------------------------------* * nice description *----------------------------------------------------------------------------*/ int Gpm_Open(Gpm_Connect *conn, int flag) { char *tty = NULL; char *term = NULL; int i; struct sockaddr_un addr; struct winsize win; Gpm_Stst *new = NULL; char* sock_name = 0; static char *consolename = NULL; /*....................................... First of all, check xterm */ if ((term=(char *)getenv("TERM")) && !strncmp(term,"xterm",5)) { if(gpm_tried) return gpm_fd; /* no stack */ gpm_fd=-2; GPM_XTERM_ON; gpm_flag=1; return gpm_fd; } /*....................................... No xterm, go on */ /* check whether we know what name the console is: what's with the lib??? */ if(!consolename) { consolename = Gpm_get_console(); if(!consolename) { gpm_report(GPM_PR_ERR,"unable to open gpm console, check your /dev filesystem!\n"); goto err; } } /* * So I chose to use the current tty, instead of /dev/console, which * has permission problems. (I am fool, and my console is * readable/writeable by everybody. * * However, making this piece of code work has been a real hassle. */ if (!gpm_flag && gpm_tried) return -1; gpm_tried=1; /* do or die */ if ((new = (Gpm_Stst *) malloc(sizeof(Gpm_Stst))) == NULL) return -1; new->next=gpm_stack; gpm_stack=new; conn->pid=getpid(); /* fill obvious values */ if (new->next) conn->vc=new->next->info.vc; /* inherit */ else { conn->vc=0; /* default handler */ if (flag > 0) { /* forced vc number */ conn->vc=flag; if((tty = malloc(strlen(consolename) + Gpm_cnt_digits(flag))) == NULL) gpm_report(GPM_PR_OOPS,GPM_MESS_NO_MEM); memcpy(tty, consolename, strlen(consolename)-1); sprintf(&tty[strlen(consolename) - 1], "%i", flag); } else if (flag==0) { /* use your current vc */ if (isatty(0)) tty = ttyname(0); /* stdin */ if (!tty && isatty(1)) tty = ttyname(1); /* stdout */ if (!tty && isatty(2)) tty = ttyname(2); /* stderr */ if (tty == NULL) { gpm_report(GPM_PR_ERR,"checking tty name failed"); goto err; } conn->vc=atoi(&tty[strlen(consolename)-1]); } else /* a default handler -- use console */ tty=strdup(consolename); if (gpm_consolefd == -1) if ((gpm_consolefd=open(tty,O_WRONLY)) < 0) { gpm_report(GPM_PR_ERR,GPM_MESS_DOUBLE_S,tty,strerror(errno)); goto err; } } new->info=*conn; /*....................................... Get screen dimensions */ ioctl(gpm_consolefd, TIOCGWINSZ, &win); if (!win.ws_col || !win.ws_row) { fprintf(stderr, "libgpm: zero screen dimension, assuming 80x25.\n"); win.ws_col=80; win.ws_row=25; } gpm_mx = win.ws_col - gpm_zerobased; gpm_my = win.ws_row - gpm_zerobased; /*....................................... Connect to the control socket */ if (!(gpm_flag++)) { if ( (gpm_fd=socket(AF_UNIX,SOCK_STREAM,0))<0 ) { gpm_report(GPM_PR_ERR,GPM_MESS_SOCKET,strerror(errno)); goto err; } #ifndef SO_PEERCRED bzero((char *)&addr,sizeof(addr)); addr.sun_family=AF_UNIX; if (!(sock_name = tempnam (0, "gpm"))) { gpm_report(GPM_PR_ERR,GPM_MESS_TEMPNAM,strerror(errno)); goto err; } strncpy (addr.sun_path, sock_name, sizeof (addr.sun_path)); if (bind (gpm_fd, (struct sockaddr*)&addr, sizeof (addr.sun_family) + strlen (addr.sun_path))==-1) { gpm_report(GPM_PR_ERR,GPM_MESS_DOUBLE_S, sock_name, strerror(errno)); goto err; } #endif bzero((char *)&addr,sizeof(addr)); addr.sun_family=AF_UNIX; strcpy(addr.sun_path, GPM_NODE_CTL); i=sizeof(addr.sun_family)+strlen(GPM_NODE_CTL); if(connect(gpm_fd,(struct sockaddr *)(&addr),i)<0 ) { struct stat stbuf; gpm_report(GPM_PR_INFO,GPM_MESS_DOUBLE_S,GPM_NODE_CTL,strerror(errno)); /* * Well, try to open a chr device called /dev/gpmctl. This should * be forward-compatible with a kernel server */ close(gpm_fd); /* the socket */ if ((gpm_fd=open(GPM_NODE_DEV,O_RDWR))==-1) { gpm_report(GPM_PR_ERR,GPM_MESS_DOUBLE_S,GPM_NODE_DEV ,strerror(errno)); goto err; } if (fstat(gpm_fd,&stbuf)==-1 || (stbuf.st_mode&S_IFMT)!=S_IFCHR) { goto err; } } } /*....................................... Put your data */ if (putdata(gpm_fd,conn)!=-1) { /* itz Wed Dec 16 23:22:16 PST 1998 use sigaction, the old code caused a signal loop under XEmacs */ struct sigaction sa; sigemptyset(&sa.sa_mask); #if (defined(SIGWINCH)) /* And the winch hook .. */ sa.sa_handler = gpm_winch_hook; sa.sa_flags = 0; sigaction(SIGWINCH, &sa, &gpm_saved_winch_hook); #endif #if (defined(SIGTSTP)) if (gpm_flag == 1) { /* Install suspend hook */ sa.sa_handler = SIG_IGN; sigaction(SIGTSTP, &sa, &gpm_saved_suspend_hook); /* if signal was originally ignored, job control is not supported */ if (gpm_saved_suspend_hook.sa_handler != SIG_IGN) { sa.sa_flags = SA_NOMASK; sa.sa_handler = gpm_suspend_hook; sigaction(SIGTSTP, &sa, 0); } } #endif } return gpm_fd; /*....................................... Error: free all memory */ err: gpm_report(GPM_PR_ERR,"Oh, oh, it's an error! possibly I die! "); while(gpm_stack) { new=gpm_stack->next; free(gpm_stack); gpm_stack=new; } if (gpm_fd>=0) close(gpm_fd); if (sock_name) { unlink(sock_name); free(sock_name); sock_name = 0; } gpm_flag=0; return -1; } /*-------------------------------------------------------------------*/ int Gpm_Close(void) { Gpm_Stst *next; gpm_tried=0; /* reset the error flag for next time */ if (gpm_fd==-2) /* xterm */ GPM_XTERM_OFF; else /* linux */ { if (!gpm_flag) return 0; next=gpm_stack->next; free(gpm_stack); gpm_stack=next; if (next) putdata(gpm_fd,&(next->info)); if (--gpm_flag) return -1; } if (gpm_fd>=0) close(gpm_fd); gpm_fd=-1; #ifdef SIGTSTP sigaction(SIGTSTP, &gpm_saved_suspend_hook, 0); #endif #ifdef SIGWINCH sigaction(SIGWINCH, &gpm_saved_winch_hook, 0); #endif close(gpm_consolefd); gpm_consolefd=-1; return 0; } /*-------------------------------------------------------------------*/ int Gpm_GetEvent(Gpm_Event *event) { int count; MAGIC_P((int magic)); if (!gpm_flag) return 0; #ifdef GPM_USE_MAGIC if ((count=read(gpm_fd,&magic,sizeof(int)))!=sizeof(int)) { if (count==0) { gpm_report(GPM_PR_INFO,"Warning: closing connection"); Gpm_Close(); return 0; } gpm_report(GPM_PR_INFO,"Read too few bytes (%i) at %s:%d",count,__FILE__,__LINE__); return -1; } #endif if ((count=read(gpm_fd,event,sizeof(Gpm_Event)))!=sizeof(Gpm_Event)) { #ifndef GPM_USE_MAGIC if (count==0) { gpm_report(GPM_PR_INFO,"Warning: closing connection"); Gpm_Close(); return 0; } #endif /* * avoid to send the message if there is no data; sometimes it makes * sense to poll the mouse descriptor any now an then using a * non-blocking descriptor */ if (count != -1 || errno != EAGAIN) gpm_report(GPM_PR_INFO,"Read too few bytes (%i) at %s:%d", count,__FILE__,__LINE__); return -1; } event->x -= gpm_zerobased; event->y -= gpm_zerobased; return 1; } #define MAXNBPREVCHAR 4 /* I don't think more is usefull, JD */ static int nbprevchar=0, prevchar[MAXNBPREVCHAR]; /*-------------------------------------------------------------------*/ int Gpm_CharsQueued () { return nbprevchar; } /*-------------------------------------------------------------------*/ int Gpm_Getc(FILE *f) { fd_set selSet; int max, flag, result; static Gpm_Event ev; int fd=fileno(f); static int count; /* Hmm... I must be sure it is unbuffered */ if (!(count++)) setvbuf(f,NULL,_IONBF,0); if (!gpm_flag) return getc(f); /* If the handler asked to provide more keys, give them back */ if (gpm_morekeys) return (*gpm_handler)(&ev,gpm_data); gpm_hflag=0; max = (gpm_fd>fd) ? gpm_fd : fd; /*...................................................................*/ if (gpm_fd>=0) /* linux */ while(1) { if (gpm_visiblepointer) GPM_DRAWPOINTER(&ev); do { FD_ZERO(&selSet); FD_SET(fd,&selSet); if (gpm_fd>-1) FD_SET(gpm_fd,&selSet); gpm_timeout.tv_sec=SELECT_TIME; flag=select(max+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&gpm_timeout); } while (!flag); if (flag==-1) continue; if (FD_ISSET(fd,&selSet)) return fgetc(f); if (Gpm_GetEvent(&ev) && gpm_handler && (result=(*gpm_handler)(&ev,gpm_data))) { gpm_hflag=1; return result; } } else /*...................................................................*/ if (gpm_fd==-2) /* xterm */ { #define DELAY_MS 100 static struct timeval to={0,DELAY_MS*1000}; static fd_set selSet; extern int gpm_convert_event(unsigned char *data, Gpm_Event *event); int c; unsigned char mdata[4]; if (nbprevchar) /* if there are some consumed char ... */ return prevchar[--nbprevchar]; while(1) { do { FD_ZERO(&selSet); FD_SET(fd,&selSet); gpm_timeout.tv_sec=SELECT_TIME; flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&gpm_timeout); } while (!flag); if ((c=fgetc(f))!=0x1b) return c; /* escape: go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) return c; if ((c=fgetc(f))!='[') {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ /* '[': go on */ FD_ZERO(&selSet); FD_SET(fd,&selSet); to.tv_usec=DELAY_MS*1000; if ((flag=select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to))==0) {prevchar[nbprevchar++]=c; return 0x1B;} /* patche par JD 11/08/1998 */ if ((c=fgetc(f))!='M') /* patche par JD 11/08/1998 NOTICE: prevchar is a lifo !*/ {prevchar[nbprevchar++]=c; prevchar[nbprevchar++]='['; return 0x1B;} /* now, it surely is a mouse event */ for (c=0;c<3;c++) mdata[c]=fgetc(f); gpm_convert_event(mdata,&ev); if (gpm_handler && (result=(*gpm_handler)(&ev,gpm_data))) { gpm_hflag=1; return result; } } /* while(1) */ } /*...................................................................*/ else return fgetc(f); /* no mouse available */ } /*-------------------------------------------------------------------*/ int Gpm_Repeat(int msec) { struct timeval to={0,1000*msec}; int fd; fd_set selSet; fd=gpm_fd>=0 ? gpm_fd : 0; /* either the socket or stdin */ FD_ZERO(&selSet); FD_SET(fd,&selSet); return (select(fd+1,&selSet,(fd_set *)NULL,(fd_set *)NULL,&to)==0); } /*-------------------------------------------------------------------*/ int Gpm_FitValuesM(int *x, int *y, int margin) { if (margin==-1) { *x = min( max(*x,!gpm_zerobased), gpm_mx); *y = min( max(*y,!gpm_zerobased), gpm_my); return 0; } switch(margin) { case GPM_TOP: (*y)++; break; case GPM_BOT: (*y)--; break; case GPM_RGT: (*x)--; break; case GPM_LFT: (*x)++; break; } return 0; } /*-------------------------------------------------------------------*/ int gpm_convert_event(unsigned char *mdata, Gpm_Event *ePtr) { static struct timeval tv1={0,0}, tv2; static int clicks=0; int c; #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ (t2.tv_usec-t1.tv_usec)/1000) /* Variable btn has following meaning: */ c = mdata[0]-32; /* 0="1-down", 1="2-down", 2="3-down", 3="up" */ if (c==3) { ePtr->type = GPM_UP | (GPM_SINGLE<buttons = 0; */ /* no, keep info from press event */ GET_TIME (tv1); clicks = 0; } else { ePtr->type = GPM_DOWN; GET_TIME (tv2); if (tv1.tv_sec && (DIF_TIME(tv1,tv2)<250)) /* 250ms for double click */ {clicks++; clicks%=3;} else clicks = 0; switch (c) { case 0: ePtr->buttons=GPM_B_LEFT; break; case 1: ePtr->buttons=GPM_B_MIDDLE; break; case 2: ePtr->buttons=GPM_B_RIGHT; break; default: /* Nothing */ break; } } /* Coordinates are 33-based */ /* Transform them to 1-based */ ePtr->x = mdata[1]-32-gpm_zerobased; ePtr->y = mdata[2]-32-gpm_zerobased; return 0; } /* Local Variables: */ /* c-indent-level: 3 */ /* End: */ gpm-1.20.4/src/lib/libxtra.c010060000017500001750000000070401101736502100143570ustar00niconico00/* * libxtra.c - client library - extra functions (gpm-Linux) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * * xterm management is mostly by Miguel de Icaza * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include #include #include #include #include "headers/gpmInt.h" #include "headers/message.h" /*-------------------------------------------------------------------*/ /* * these two functions return version information */ static char *gpml_ver_s=GPM_RELEASE; static int gpml_ver_i = 0; char *Gpm_GetLibVersion(int *where) { int i,j,k=0; if (!gpml_ver_i) { sscanf(gpml_ver_s,"%d.%d.%d",&i,&j,&k); gpml_ver_i=i*10000+j*100+k; } if (where) *where=gpml_ver_i; return gpml_ver_s; } static char gpm_ver_s[16]; static int gpm_ver_i = 0; char *Gpm_GetServerVersion(int *where) { char line[128]; FILE *f; int i,j,k=0; if (!gpm_ver_s[0]) { f=popen(SBINDIR "/gpm -v","r"); if (!f) return NULL; fgets(line,128,f); if (pclose(f)) return 0; sscanf(line,"%*s %s",gpm_ver_s); /* "gpm-Linux 0.98, March 1995" */ gpm_ver_s[strlen(gpm_ver_s)-1]='\0'; /* cut the ',' */ sscanf(gpm_ver_s,"%d.%d.%d",&i,&j,&k); gpm_ver_i=i*10000+j*100+k; } if (where) *where=gpm_ver_i; return gpm_ver_s; } /*-------------------------------------------------------------------*/ /* * This returns all the available information about the current situation: * The return value is the number of buttons, as known to the server, * the ePtr, if any, is filled with information on the current state. */ int Gpm_GetSnapshot(Gpm_Event *ePtr) { Gpm_Connect conn; Gpm_Event event; fd_set sillySet; struct timeval to={0,0}; int i; if (!gpm_ver_i) { if (0 == Gpm_GetServerVersion(NULL)) { gpm_report(GPM_PR_WARN,"can't get gpm server version"); } /*if*/ gpm_report(GPM_PR_INFO,"libgpm: got server version as %i",gpm_ver_i); } if (gpm_ver_i<9802) { gpm_report(GPM_PR_INFO,"gpm server version too old to obtain status info"); return -1; /* error */ } if (gpm_fd <=0) { gpm_report(GPM_PR_INFO,"gpm connection must be open to obtain status info"); return -1; /* error */ } conn.pid=0; /* this signals a request */ if (ePtr) conn.vc=GPM_REQ_SNAPSHOT; else { conn.vc=GPM_REQ_BUTTONS; ePtr=&event; } if (gpm_fd==-1) return -1; FD_ZERO(&sillySet); FD_SET(gpm_fd,&sillySet); if (select(gpm_fd+1,&sillySet,NULL,NULL,&to)==1) return 0; write(gpm_fd,&conn,sizeof(Gpm_Connect)); if ((i=Gpm_GetEvent(ePtr))!=1) return -1; i=ePtr->type; ePtr->type=0; return i; /* number of buttons */ } /* Local Variables: */ /* c-indent-level: 2 */ /* End: */ gpm-1.20.4/src/lib/report-lib.c010060000017500001750000000037741101736502100150030ustar00niconico00/* * report-lib.c: the exported version of gpm_report. used in Gpm_Open and co. * * Copyright (c) 2001 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include /* NULL */ #include /* va_arg/start/... */ #include /* exit() */ #include "headers/message.h" void gpm_report(int line, char *file, int stat, char *text, ... ) { char *string = NULL; int log_level; va_list ap; va_start(ap,text); switch(stat) { case GPM_STAT_INFO : string = GPM_TEXT_INFO ; log_level = LOG_INFO; break; case GPM_STAT_WARN : string = GPM_TEXT_WARN ; log_level = LOG_WARNING; break; case GPM_STAT_ERR : string = GPM_TEXT_ERR ; log_level = LOG_ERR; break; case GPM_STAT_DEBUG: string = GPM_TEXT_DEBUG; log_level = LOG_DEBUG; break; case GPM_STAT_OOPS : string = GPM_TEXT_OOPS; log_level = LOG_CRIT; break; } #ifdef HAVE_VSYSLOG syslog(log_level, string); vsyslog(log_level, text, ap); #else fprintf(stderr,"%s[%s(%d)]:\n",string,file,line); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); #endif if(stat == GPM_STAT_OOPS) exit(1); /* may a lib function call exit ???? */ } gpm-1.20.4/src/mice.c010060000017500001750000002434231101736502100130700ustar00niconico00/* * mice.c - mouse definitions for gpm-Linux * * Copyright (C) 1993 Andrew Haylett * Copyright (C) 1994-2000 Alessandro Rubini * Copyright (C) 1998,1999 Ian Zimmerman * Copyright (C) 2001-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ /* * This file is part of the mouse server. The information herein * is kept aside from the rest of the server to ease fixing mouse-type * issues. Each mouse type is expected to fill the `buttons', `dx' and `dy' * fields of the Gpm_Event structure and nothing more. * * Absolute-pointing devices (support by Marc Meis), are expecting to * fit `x' and `y' as well. Unfortunately, to do it the window size must * be accessed. The global variable "win" is available for that use. * * The `data' parameter points to a byte-array with event data, as read * by the mouse device. The mouse device should return a fixed number of * bytes to signal an event, and that exact number is read by the server * before calling one of these functions. * * The conversion function defined here should return 0 on success and -1 * on failure. * * Refer to the definition of Gpm_Type to probe further. */ #include #include #include #include #include #include #include #include #include #include #include /* stat() */ #include /* select() */ #include /* MAJOR */ #include /* JOYSTICK */ #ifdef HAVE_LINUX_JOYSTICK_H #include #endif /* EV DEVICE */ #ifdef HAVE_LINUX_INPUT_H #include #endif /* HAVE_LINUX_INPUT_H */ #include "headers/gpmInt.h" #include "headers/daemon.h" #include "headers/twiddler.h" #include "headers/synaptics.h" #include "headers/message.h" /*========================================================================*/ /* Parsing argv: helper dats struct function (should they get elsewhere?) */ /*========================================================================*/ enum argv_type { ARGV_BOOL = 1, ARGV_INT, /* "%i" */ ARGV_DEC, /* "%d" */ ARGV_STRING, /* other types must be added */ ARGV_END = 0 }; typedef struct argv_helper { char *name; enum argv_type type; union u { int *iptr; /* used for int and bool arguments */ char **sptr; /* used for string arguments, by strdup()ing the value */ } u; int value; /* used for boolean arguments */ } argv_helper; static int parse_argv(argv_helper *info, int argc, char **argv) { int i, j = 0, errors = 0; long l; argv_helper *p; char *s, *t; int base = 0; /* for strtol */ for (i=1; itype != ARGV_END; p++) { j = strlen(p->name); if (strncmp(p->name, argv[i], j)) continue; if (isalnum(argv[i][j])) continue; break; } if (p->type == ARGV_END) { /* not found */ fprintf(stderr, "%s: Uknown option \"%s\" for pointer \"%s\"\n", option.progname, argv[i], argv[0]); errors++; continue; } /* Found. Look for trailing stuff, if any */ s = argv[i]+j; while (*s && isspace(*s)) s++; /* skip spaces */ if (*s == '=') s++; /* skip equal */ while (*s && isspace(*s)) s++; /* skip other spaces */ /* Now parse what s is */ switch(p->type) { case ARGV_BOOL: if (*s) { gpm_report(GPM_PR_ERR,GPM_MESS_OPTION_NO_ARG, option.progname,p->name,s); errors++; } *(p->u.iptr) = p->value; break; case ARGV_DEC: base = 10; /* and fall through */ case ARGV_INT: l = strtol(s, &t, base); if (*t) { gpm_report(GPM_PR_ERR,GPM_MESS_INVALID_ARG, option.progname, s, p->name); errors++; break; } *(p->u.iptr) = (int)l; break; case ARGV_STRING: *(p->u.sptr) = strdup(s); break; case ARGV_END: /* let's please "-Wall" */ break; } } /* for i in argc */ if (errors) gpm_report(GPM_PR_ERR,GPM_MESS_CONT_WITH_ERR, option.progname); return errors; } /*========================================================================*/ /* Provide a common error engine by parsing with an empty option-set */ /*========================================================================*/ static volatile int check_no_argv(int argc, char **argv) { static argv_helper optioninfo[] = { {"", ARGV_END} }; return parse_argv(optioninfo, argc, argv); } /*========================================================================*/ /* Parse the "old" -o options */ /*========================================================================*/ static int option_modem_lines(int fd, int argc, char **argv) { static unsigned int err, lines, reallines; static argv_helper optioninfo[] = { {"dtr", ARGV_BOOL, u: {iptr: &lines}, value: TIOCM_DTR}, {"rts", ARGV_BOOL, u: {iptr: &lines}, value: TIOCM_RTS}, {"both", ARGV_BOOL, u: {iptr: &lines}, value: TIOCM_DTR | TIOCM_RTS}, {"", ARGV_END} }; if (argc<2) return 0; if (argc > 2) { gpm_report(GPM_PR_ERR,GPM_MESS_TOO_MANY_OPTS,option.progname, argv[0]); errno = EINVAL; /* used by gpm_oops(), if the caller reports failure */ return -1; } err = parse_argv(optioninfo, argc, argv); if(err) return 0; /* a message has been printed, but go on as good */ /* ok, move the lines */ ioctl(fd, TIOCMGET, &reallines); reallines &= ~lines; ioctl(fd, TIOCMSET, &reallines); return 0; } /*========================================================================*/ /* real absolute coordinates for absolute devices, not very clean */ /*========================================================================*/ #define REALPOS_MAX 16383 /* min 0 max=16383, but due to change. */ int realposx=-1, realposy=-1; /*========================================================================*/ /* * When repeating, it is important not to try to repeat more bits of dx and * dy than the protocol can handle. Otherwise, you may end up repeating the * low bits of a large value, which causes erratic motion. */ /*========================================================================*/ static int limit_delta(int delta, int min, int max) { return delta > max ? max : delta < min ? min : delta; } /*========================================================================*/ /* * Ok, here we are: first, provide the functions; initialization is later. * The return value is the number of unprocessed bytes */ /*========================================================================*/ #ifdef HAVE_LINUX_INPUT_H static int M_evdev (Gpm_Event * state, unsigned char *data) { struct input_event thisevent; (void) memcpy (&thisevent, data, sizeof (struct input_event)); if (thisevent.type == EV_REL) { if (thisevent.code == REL_X) state->dx = (signed char) thisevent.value; else if (thisevent.code == REL_Y) state->dy = (signed char) thisevent.value; } else if (thisevent.type == EV_KEY) { switch(thisevent.code) { case BTN_LEFT: state->buttons ^= GPM_B_LEFT; break; case BTN_MIDDLE: state->buttons ^= GPM_B_MIDDLE; break; case BTN_RIGHT: state->buttons ^= GPM_B_RIGHT; break; case BTN_SIDE: state->buttons ^= GPM_B_MIDDLE; break; } } return 0; } #endif /* HAVE_LINUX_INPUT_H */ static int M_ms(Gpm_Event *state, unsigned char *data) { /* * some devices report a change of middle-button state by * repeating the current button state (patch by Mark Lord) */ static unsigned char prev=0; if (data[0] == 0x40 && !(prev|data[1]|data[2])) state->buttons = GPM_B_MIDDLE; /* third button on MS compatible mouse */ else state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); prev = state->buttons; state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); return 0; } static int M_ms_plus(Gpm_Event *state, unsigned char *data) { static unsigned char prev=0; state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); /* Allow motion *and* button change (Michael Plass) */ if((state->dx==0) &&(state->dy==0) && (state->buttons==(prev&~GPM_B_MIDDLE))) state->buttons = prev^GPM_B_MIDDLE; /* no move or change: toggle middle */ else state->buttons |= prev&GPM_B_MIDDLE; /* change: preserve middle */ prev=state->buttons; return 0; } static int M_ms_plus_lr(Gpm_Event *state, unsigned char *data) { /* * Same as M_ms_plus but with an addition by Edmund GRIMLEY EVANS */ static unsigned char prev=0; state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); /* Allow motion *and* button change (Michael Plass) */ if((state->dx==0)&& (state->dy==0) && (state->buttons==(prev&~GPM_B_MIDDLE))) state->buttons = prev^GPM_B_MIDDLE; /* no move or change: toggle middle */ else state->buttons |= prev&GPM_B_MIDDLE;/* change: preserve middle */ /* Allow the user to reset state of middle button by pressing the other two buttons at once (Edmund GRIMLEY EVANS) */ if (!((~state->buttons)&(GPM_B_LEFT|GPM_B_RIGHT)) && ((~prev)&(GPM_B_LEFT|GPM_B_RIGHT))) state->buttons &= ~GPM_B_MIDDLE; prev=state->buttons; return 0; } /* Summagraphics/Genius/Acecad tablet support absolute mode*/ /* Summagraphics MM-Series format*/ /* (Frank Holtz) hof@bigfoot.de Tue Feb 23 21:04:09 MET 1999 */ int SUMMA_BORDER=100; int summamaxx,summamaxy; char summaid=-1; static int M_summa(Gpm_Event *state, unsigned char *data) { int x, y; x = ((data[2]<<7) | data[1])-SUMMA_BORDER; if (x<0) x=0; if (x>summamaxx) x=summamaxx; state->x = (x * win.ws_col / summamaxx); realposx = (x * 16383 / summamaxx); y = ((data[4]<<7) | data[3])-SUMMA_BORDER; if (y<0) y=0; if (y>summamaxy) y=summamaxy; state->y = 1 + y * (win.ws_row-1)/summamaxy; realposy = y * 16383 / summamaxy; state->buttons= !!(data[0]&1) * GPM_B_LEFT + !!(data[0]&2) * GPM_B_RIGHT + !!(data[0]&4) * GPM_B_MIDDLE; return 0; } /* ps2 */ static int R_ps2(Gpm_Event *state, int fd) { signed char buffer[3]; buffer[0]=((state->buttons & GPM_B_LEFT ) > 0)*1 + ((state->buttons & GPM_B_RIGHT ) > 0)*2 + ((state->buttons & GPM_B_MIDDLE) > 0)*4; buffer[0] |= 8 + ((state->dx < 0) ? 0x10 : 0) + ((state->dy > 0) ? 0x20 : 0); buffer[1] = limit_delta(state->dx, -128, 127); buffer[2] = limit_delta(-state->dy, -128, 127); return write(fd,buffer,3); } /* Thu Jan 28 20:54:47 MET 1999 hof@hof-berlin.de SummaSketch reportformat */ static int R_summa(Gpm_Event *state, int fd) { signed char buffer[5]; static int x,y; if (realposx==-1) { /* real absolute device? */ x=x+(state->dx*25); if (x<0) x=0; if (x>16383) x=16383; y=y+(state->dy*25); if (y<0) y=0; if (y>16383) y=16383; } else { /* yes */ x=realposx; y=realposy; } buffer[0]=0x98+((state->buttons&GPM_B_LEFT)>0?1:0)+ ((state->buttons&GPM_B_MIDDLE)>0?2:0)+ ((state->buttons&GPM_B_RIGHT)>0?3:0); buffer[1]=x & 0x7f; /* X0-6*/ buffer[2]=(x >> 7) & 0x7f; /* X7-12*/ buffer[3]=y & 0x7f; /* Y0-6*/ buffer[4]=(y >> 7) & 0x7f; /* Y7-12*/ return write(fd,buffer,5); } /* 'Genitizer' (kw@dtek.chalmers.se 11/12/97) */ static int M_geni(Gpm_Event *state, unsigned char *data) { /* this is a little confusing. If we use the stylus, we * have three buttons (tip, lower, upper), and if * we use the puck we have four buttons. (And the * protocol is a little mangled if several of the buttons * on the puck are pressed simultaneously. * I don't use the puck, hence I try to decode three buttons * only. tip = left, lower = middle, upper = right */ state->buttons = (data[0] & 0x01)<<2 | (data[0] & 0x02) | (data[0] & 0x04)>>2; state->dx = ((data[1] & 0x3f) ) * ((data[0] & 0x10)?1:-1); state->dy = ((data[2] & 0x3f) ) * ((data[0] & 0x8)?-1:1); return 0; } /* m$ 'Intellimouse' (steveb 20/7/97) */ static int M_ms3(Gpm_Event *state, unsigned char *data) { state->wdx = state->wdy = 0; state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x10) >> 3) /* middle */ | ((data[0] & 0x10) >> 4) /* right */ | (((data[3] & 0x0f) == 0x0f) * GPM_B_UP) /* wheel up */ | (((data[3] & 0x0f) == 0x01) * GPM_B_DOWN); /* wheel down */ state->dx = (signed char) (((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy = (signed char) (((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); switch (data[3] & 0x0f) { case 0x0e: state->wdx = +1; break; case 0x02: state->wdx = -1; break; case 0x0f: state->wdy = +1; break; case 0x01: state->wdy = -1; break; } return 0; } static int R_ms3(Gpm_Event *state, int fd) { int dx, dy; char buf[4] = {0, 0, 0, 0}; buf[0] |= 0x40; if (state->buttons & GPM_B_LEFT) buf[0] |= 0x20; if (state->buttons & GPM_B_MIDDLE) buf[3] |= 0x10; if (state->buttons & GPM_B_RIGHT) buf[0] |= 0x10; if (state->buttons & GPM_B_UP) buf[3] |= 0x0f; if (state->buttons & GPM_B_DOWN) buf[3] |= 0x01; dx = limit_delta(state->dx, -128, 127); buf[1] = dx & ~0xC0; buf[0] |= (dx & 0xC0) >> 6; dy = limit_delta(state->dy, -128, 127); buf[2] = dy & ~0xC0; buf[0] |= (dy & 0xC0) >> 4; /* wheel */ if (state->wdy > 0) buf[3] |= 0x0f; else if (state->wdy < 0) buf[3] |= 0x01; return write(fd,buf,4); } /* M_brw is a variant of m$ 'Intellimouse' the middle button is different */ static int M_brw(Gpm_Event *state, unsigned char *data) { state->buttons= ((data[0] & 0x20) >> 3) /* left */ | ((data[3] & 0x20) >> 4) /* middle */ | ((data[0] & 0x10) >> 4); /* right */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); if (((data[0]&0xC0) != 0x40)|| ((data[1]&0xC0) != 0x00)|| ((data[2]&0xC0) != 0x00)|| ((data[3]&0xC0) != 0x00)) { gpm_report(GPM_PR_DEBUG,GPM_MESS_SKIP_DATAP,data[0],data[1],data[2],data[3]); return -1; } /* wheel (dz) is (data[3] & 0x0f) */ /* where is the side button? I can sort of detect it at 9600 baud */ /* Note this mouse is very noisy */ return 0; } static int M_bare(Gpm_Event *state, unsigned char *data) { /* a bare ms protocol */ state->buttons= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); return 0; } static int M_sun(Gpm_Event *state, unsigned char *data) { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]); state->dy= -(signed char)(data[2]); return 0; } static int R_sun(Gpm_Event *state, int fd) { signed char buffer[3]; buffer[0]= (state->buttons ^ 0x07) | 0x80; buffer[1]= state->dx; buffer[2]= -(state->dy); return write(fd,buffer,3); } static int M_msc(Gpm_Event *state, unsigned char *data) { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]) + (signed char)(data[3]); state->dy= -((signed char)(data[2]) + (signed char)(data[4])); return 0; } /* itz Mon Jan 11 23:51:38 PST 1999 this code moved here from gpm.c */ /* (processMouse) */ static int R_msc(Gpm_Event *state, int fd) { signed char buffer[5]; int dx, dy; /* sluggish... */ buffer[0]=(state->buttons ^ 0x07) | 0x80; dx = limit_delta(state->dx, -256, 254); buffer[3] = state->dx - (buffer[1] = state->dx/2); /* Markus */ dy = limit_delta(state->dy, -256, 254); buffer[4] = -state->dy - (buffer[2] = -state->dy/2); return write(fd,buffer,5); } static int R_imps2(Gpm_Event *state, int fd) { signed char buffer[4]; int dx, dy; dx = limit_delta(state->dx, -256, 255); dy = limit_delta(state->dy, -256, 255); buffer[0] = 8 | (state->buttons & GPM_B_LEFT ? 1 : 0) | (state->buttons & GPM_B_MIDDLE ? 4 : 0) | (state->buttons & GPM_B_RIGHT ? 2 : 0) | (dx < 0 ? 0x10 : 0) | (dy > 0 ? 0x20 : 0); buffer[1] = dx & 0xFF; buffer[2] = (-dy) & 0xFF; if (state->wdy > 0) buffer[3] = 0xff; if (state->wdy < 0) buffer[3] = 0x01; if (state->wdx > 0) buffer[3] = 0xfe; if (state->wdx < 0) buffer[3] = 0x02; return write(fd,buffer,4); } static int M_logimsc(Gpm_Event *state, unsigned char *data) /* same as msc */ { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)(data[1]) + (signed char)(data[3]); state->dy= -((signed char)(data[2]) + (signed char)(data[4])); return 0; } static int M_mm(Gpm_Event *state, unsigned char *data) { state->buttons= data[0] & 0x07; state->dx= (data[0] & 0x10) ? data[1] : - data[1]; state->dy= (data[0] & 0x08) ? - data[2] : data[2]; return 0; } static int M_logi(Gpm_Event *state, unsigned char *data) /* equal to mm */ { state->buttons= data[0] & 0x07; state->dx= (data[0] & 0x10) ? data[1] : - data[1]; state->dy= (data[0] & 0x08) ? - data[2] : data[2]; return 0; } static int M_bm(Gpm_Event *state, unsigned char *data) /* equal to sun */ { state->buttons= (~data[0]) & 0x07; state->dx= (signed char)data[1]; state->dy= -(signed char)data[2]; return 0; } static int M_ps2(Gpm_Event *state, unsigned char *data) { static int tap_active=0; /* there exist glidepoint ps2 mice */ state->buttons= !!(data[0]&1) * GPM_B_LEFT + !!(data[0]&2) * GPM_B_RIGHT + !!(data[0]&4) * GPM_B_MIDDLE; if (data[0]==0 && (which_mouse->opt_glidepoint_tap)) /* by default this is false */ state->buttons = tap_active = (which_mouse->opt_glidepoint_tap); else if (tap_active) { if (data[0]==8) state->buttons = tap_active = 0; else state->buttons = tap_active; } /* Some PS/2 mice send reports with negative bit set in data[0] * and zero for movement. I think this is a bug in the mouse, but * working around it only causes artifacts when the actual report is -256; * they'll be treated as zero. This should be rare if the mouse sampling * rate is set to a reasonable value; the default of 100 Hz is plenty. * (Stephen Tell) */ if(data[1] != 0) state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; else state->dx = 0; if(data[2] != 0) state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; return 0; } static int M_imps2(Gpm_Event *state, unsigned char *data) { static int tap_active=0; /* there exist glidepoint ps2 mice */ state->wdx = state->wdy = 0; /* Clear them.. */ state->dx = state->dy = state->wdx = state->wdy = 0; state->buttons= ((data[0] & 1) << 2) /* left */ | ((data[0] & 6) >> 1); /* middle and right */ if (data[0]==0 && (which_mouse->opt_glidepoint_tap)) // by default this is false state->buttons = tap_active = (which_mouse->opt_glidepoint_tap); else if (tap_active) { if (data[0]==8) state->buttons = tap_active = 0; else state->buttons = tap_active; } /* Standard movement.. */ state->dx = (data[0] & 0x10) ? data[1] - 256 : data[1]; state->dy = (data[0] & 0x20) ? -(data[2] - 256) : -data[2]; /* The wheels.. */ unsigned char wheel = data[3] & 0x0f; if (wheel > 0) { // use the event type GPM_MOVE rather than GPM_DOWN for wheel movement // to avoid single/double/triple click processing: switch (wheel) { /* rodney 13/mar/2008 * The use of GPM_B_UP / GPM_B_DOWN is very unclear; * only mouse type ms3 uses these * For this mouse, we only support the relative movement * i.e. no button is set (same as mouse movement), wdy changes +/- * according to wheel movement (+ for rolling away from user) * wdx (horizontal scroll) is for a second wheel. They do exist! */ case 0x0f: state->wdy = +1; break; case 0x01: state->wdy = -1; break; case 0x0e: state->wdx = +1; break; case 0x02: state->wdx = -1; break; } } return 0; } static int M_netmouse(Gpm_Event *state, unsigned char *data) { /* Avoid these beasts if you can. They connect to normal PS/2 port, * but their protocol is one byte longer... So if you have notebook * (like me) with internal PS/2 mouse, it will not work * together. They have four buttons, but two middle buttons can not * be pressed simultaneously, and two middle buttons do not send * 'up' events (however, they autorepeat...) * Still, you might want to run this mouse in plain PS/2 mode - * where it behaves correctly except that middle 2 buttons do * nothing. * Protocol is * 3 bytes like normal PS/2 * 4th byte: 0xff button 'down', 0x01 button 'up' * [this is so braindamaged that it *must* be some kind of * compatibility glue...] * Pavel Machek */ state->buttons= !!(data[0]&1) * GPM_B_LEFT + !!(data[0]&2) * GPM_B_RIGHT + !!(data[3]) * GPM_B_MIDDLE; if(data[1] != 0) state->dx= (data[0] & 0x10) ? data[1]-256 : data[1]; else state->dx = 0; if(data[2] != 0) state->dy= -((data[0] & 0x20) ? data[2]-256 : data[2]); else state->dy = 0; return 0; } /* standard ps2 */ static Gpm_Type *I_ps2(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { static unsigned char s[] = { 246, 230, 244, 243, 100, 232, 3, }; write (fd, s, sizeof (s)); usleep (30000); tcflush (fd, TCIFLUSH); return type; } static Gpm_Type *I_netmouse(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { unsigned char magic[6] = { 0xe8, 0x03, 0xe6, 0xe6, 0xe6, 0xe9 }; int i; if (check_no_argv(argc, argv)) return NULL; for (i=0; i<6; i++) { unsigned char c = 0; write( fd, magic+i, 1 ); read( fd, &c, 1 ); if (c != 0xfa) { gpm_report(GPM_PR_ERR,GPM_MESS_NETM_NO_ACK,c); return NULL; } } { unsigned char rep[3] = { 0, 0, 0 }; read( fd, rep, 1 ); read( fd, rep+1, 1 ); read( fd, rep+2, 1 ); if (rep[0] || (rep[1] != 0x33) || (rep[2] != 0x55)) { gpm_report(GPM_PR_ERR,GPM_MESS_NETM_INV_MAGIC, rep[0], rep[1], rep[2]); return NULL; } } return type; } #define GPM_B_BOTH (GPM_B_LEFT|GPM_B_RIGHT) static int M_mman(Gpm_Event *state, unsigned char *data) { /* * the damned MouseMan has 3/4 bytes packets. The extra byte * is only there if the middle button is active. * I get the extra byte as a packet with magic numbers in it. * and then switch to 4-byte mode. */ static unsigned char prev=0; static Gpm_Type *mytype=mice; /* it is the first */ unsigned char b = (*data>>4); if(data[1]==GPM_EXTRA_MAGIC_1 && data[2]==GPM_EXTRA_MAGIC_2) { /* got unexpected fourth byte */ if (b > 0x3) return -1; /* just a sanity check */ //if ((b=(*data>>4)) > 0x3) return -1; /* just a sanity check */ state->dx=state->dy=0; mytype->packetlen=4; mytype->getextra=0; } else { /* got 3/4, as expected */ /* motion is independent of packetlen... */ state->dx= (signed char)(((data[0] & 0x03) << 6) | (data[1] & 0x3F)); state->dy= (signed char)(((data[0] & 0x0C) << 4) | (data[2] & 0x3F)); prev= ((data[0] & 0x20) >> 3) | ((data[0] & 0x10) >> 4); if (mytype->packetlen==4) b=data[3]>>4; } if(mytype->packetlen==4) { if(b == 0) { mytype->packetlen=3; mytype->getextra=1; } else { if (b & 0x2) prev |= GPM_B_MIDDLE; if (b & 0x1) prev |= (which_mouse->opt_glidepoint_tap); } } state->buttons=prev; /* This "chord-middle" behaviour was reported by David A. van Leeuwen */ if (((prev^state->buttons) & GPM_B_BOTH)==GPM_B_BOTH ) state->buttons = state->buttons ? GPM_B_MIDDLE : 0; prev=state->buttons; return 0; } /* * Wacom Tablets with pen and mouse: * Relative-Mode And Absolute-Mode; * Stefan Runkel 01/2000 , * Mike Pioskowik 01/2000 */ /* for relative and absolute : */ int WacomModell =-1; /* -1 means "dont know" */ int WacomAbsoluteWanted=0; /* Tell Driver if Relative or Absolute */ int wmaxx, wmaxy; char upmbuf[25]; /* needed only for macro buttons of ultrapad */ /* Data for Wacom Modell Identification */ /* (MaxX, MaxY are for Modells which do not answer resolution requests */ struct WC_MODELL{ char name[15]; char magic[3]; int maxX; int maxY; int border; int treshold; } wcmodell[] = { /* ModellName Magic MaxX MaxY Border Tresh */ { "UltraPad" , "UD", 0, 0, 250, 20 }, /* { "Intuos" , "GD", 0, 0, 0, 20 }, not supported */ { "PenPartner", "CT", 0, 0, 0, 20 }, { "Graphire" , "ET", 5103, 3711, 0, 20 } }; #define IsA(m) ((WacomModell==(-1))? 0:!strcmp(#m,wcmodell[WacomModell].name)) static int M_wacom(Gpm_Event *state, unsigned char *data) { static int ox=-1, oy; int x, y; int macro=0; /* macro buttons from tablet */ /* Bit [0]&64 seems to have different meanings - * graphire: inside of active area; * Ultrapad: Pen in proximity (means: pen detected) * Penpartner: no idea... * this may be of worth sometimes, but for now, we can say, that * if the graphire tells us that we are in the active area, we can tell * also that the graphire has the pen in proximity. */ if (!(data[0]&64)) { /* Tool not in proximity or out of active area */ /* handle Ultrapad macro buttons, if we get a packet without * proximity bit but with the buttonflag set, we know that we have * a macro event */ if (IsA(UltraPad)) { if (data[0]&8) { /* here: macro button has been pressed */ if (data[3]&8) macro=(data[6]); if (data[3]&16) macro=(data[6])+12; if (data[3]&32) macro=(data[6])+24; /* rom-version >= 1.3 */ state->modifiers=macro; /* Here we simulate the middle mousebutton */ /* with ultrapad Eprom Version 1.2 */ /* WHY IS THE FOLLOWING CODE DISABLE ? FIXME gpm_report(GPM_PR_INFO,GPM_MESS_WACOM_MACRO, macro); if (macro==12) state->buttons = GPM_B_MIDDLE; */ } /* end if macrobutton pressed */ } /* end if ultrapad */ if (!IsA(UltraPad)){ /* Tool out of active area */ ox=-1; state->buttons=0; state->dx=state->dy=0; } return 0; /* nothing more to do so leave */ } /* end if Tool out of active area*/ x = (((data[0] & 0x3) << 14) + (data[1] << 7) + data[2]); y = (((data[3] & 0x3) << 14) + (data[4] << 7) + data[5]); if (WacomAbsoluteWanted) { /* Absolute Mode */ if (x>wmaxx) x=wmaxx; if (x<0) x=0; if (y>wmaxy) y=wmaxy; if (y<0) y=0; state->x = (x * win.ws_col / wmaxx); state->y = (y * win.ws_row / wmaxy); realposx = (x / wmaxx); /* this two lines come from the summa driver. */ realposy = (y / wmaxy); /* they seem to be buggy (always give zero). */ } else { /* Relative Mode */ /* Treshold; if greather then treat tool as first time in proximity */ if( abs(x-ox)>(wmaxx/wcmodell[WacomModell].treshold) || abs(y-oy)>(wmaxy/wcmodell[WacomModell].treshold) ) ox=x; oy=y; state->dx= (x-ox) / (wmaxx / win.ws_col / wcmodell[WacomModell].treshold); state->dy= (y-oy) / (wmaxy / win.ws_row / wcmodell[WacomModell].treshold); } ox=x; oy=y; state->buttons= /* for Ultra-Pad and graphire */ !!(data[3]&8) * GPM_B_LEFT + !!(data[3]&16) * GPM_B_RIGHT + !!(data[3]&32) * GPM_B_MIDDLE; /* UD: rom-version >=1.3 */ return 0; } /* Calcomp UltraSlate tablet (John Anderson) * modeled after Wacom and NCR drivers (thanks, guys) * Note: I don't know how to get the tablet size from the tablet yet, so * these defines will have to do for now. */ #define CAL_LIMIT_BRK 255 #define CAL_X_MIN 0x40 #define CAL_X_MAX 0x1340 #define CAL_X_SIZE (CAL_X_MAX - CAL_X_MIN) #define CAL_Y_MIN 0x40 #define CAL_Y_MAX 0xF40 #define CAL_Y_SIZE (CAL_Y_MAX - CAL_Y_MIN) static int M_calus(Gpm_Event *state, unsigned char *data) { int x, y; x = ((data[1] & 0x3F)<<7) | (data[2] & 0x7F); y = ((data[4] & 0x1F)<<7) | (data[5] & 0x7F); state->buttons = GPM_B_LEFT * ((data[0]>>2) & 1) + GPM_B_MIDDLE * ((data[0]>>3) & 1) + GPM_B_RIGHT * ((data[0]>>4) & 1); state->dx = 0; state->dy = 0; state->x = x < CAL_X_MIN ? 0 : x > CAL_X_MAX ? win.ws_col+1 : (long)(x-CAL_X_MIN) * (long)(win.ws_col-1) / CAL_X_SIZE+2; state->y = y < CAL_Y_MIN ? win.ws_row + 1 : y > CAL_Y_MAX ? 0 : (long)(CAL_Y_MAX-y) * (long)win.ws_row / CAL_Y_SIZE + 1; realposx = x < CAL_X_MIN ? 0 : x > CAL_X_MAX ? 16384 : (long)(x-CAL_X_MIN) * (long)(16382) / CAL_X_SIZE+2; realposy = y < CAL_Y_MIN ? 16384 : y > CAL_Y_MAX ? 0 : (long)(CAL_Y_MAX-y) * (long)16383 / CAL_Y_SIZE + 1; return 0; } static int M_calus_rel(Gpm_Event *state, unsigned char *data) { static int ox=-1, oy; int x, y; x = ((data[1] & 0x3F)<<7) | (data[2] & 0x7F); y = ((data[4] & 0x1F)<<7) | (data[5] & 0x7F); if (ox==-1 || abs(x-ox)>CAL_LIMIT_BRK || abs(y-oy)>CAL_LIMIT_BRK) { ox=x; oy=y; } state->buttons = GPM_B_LEFT * ((data[0]>>2) & 1) + GPM_B_MIDDLE * ((data[0]>>3) & 1) + GPM_B_RIGHT * ((data[0]>>4) & 1); state->dx = (x-ox)/5; state->dy = (oy-y)/5; ox=x; oy=y; return 0; } /* ncr pen support (Marc Meis) */ #define NCR_LEFT_X 40 #define NCR_RIGHT_X 2000 #define NCR_BOTTOM_Y 25 #define NCR_TOP_Y 1490 #define NCR_DELTA_X (NCR_RIGHT_X - NCR_LEFT_X) #define NCR_DELTA_Y (NCR_TOP_Y - NCR_BOTTOM_Y) static int M_ncr(Gpm_Event *state, unsigned char *data) { int x,y; state->buttons= (data[0]&1)*GPM_B_LEFT + !!(data[0]&2)*GPM_B_RIGHT; state->dx = (signed char)data[1]; /* currently unused */ state->dy = (signed char)data[2]; x = ((int)data[3] << 8) + (int)data[4]; y = ((int)data[5] << 8) + (int)data[6]; /* these formulaes may look curious, but this is the way it works!!! */ state->x = x < NCR_LEFT_X ? 0 : x > NCR_RIGHT_X ? win.ws_col+1 : (long)(x-NCR_LEFT_X) * (long)(win.ws_col-1) / NCR_DELTA_X+2; state->y = y < NCR_BOTTOM_Y ? win.ws_row + 1 : y > NCR_TOP_Y ? 0 : (long)(NCR_TOP_Y-y) * (long)win.ws_row / NCR_DELTA_Y + 1; realposx = x < NCR_LEFT_X ? 0 : x > NCR_RIGHT_X ? 16384 : (long)(x-NCR_LEFT_X) * (long)(16382) / NCR_DELTA_X+2; realposy = y < NCR_BOTTOM_Y ? 16384 : y > NCR_TOP_Y ? 0 : (long)(NCR_TOP_Y-y) * (long)16383 / NCR_DELTA_Y + 1; return 0; } static int M_twid(Gpm_Event *state, unsigned char *data) { unsigned long message=0UL; int i,h,v; static int lasth, lastv, lastkey, key, lock=0, autorepeat=0; /* build the message as a single number */ for (i=0; i<5; i++) message |= (data[i]&0x7f)<<(i*7); key = message & TW_ANY_KEY; if ((message & TW_MOD_M) == 0) { /* manage keyboard */ if (((message & TW_ANY_KEY) != lastkey) || autorepeat) autorepeat = twiddler_key(message); lastkey = key; lock = 0; return -1; /* no useful mouse data */ } switch (message & TW_ANY1) { case TW_L1: state->buttons = GPM_B_RIGHT; break; case TW_M1: state->buttons = GPM_B_MIDDLE; break; case TW_R1: state->buttons = GPM_B_LEFT; break; case 0: state->buttons = 0; break; } /* also, allow R1 R2 R3 (or L1 L2 L3) to be used as mouse buttons */ if (message & TW_ANY2) state->buttons |= GPM_B_MIDDLE; if (message & TW_L3) state->buttons |= GPM_B_LEFT; if (message & TW_R3) state->buttons |= GPM_B_RIGHT; /* put in modifiers information */ { struct {unsigned long in, out;} *ptr, list[] = { { TW_MOD_S, 1<in; ptr++) if(message & ptr->in) state->modifiers |= ptr->out; } /* now extraxt H/V */ h = (message >> TW_H_SHIFT) & TW_M_MASK; v = (message >> TW_V_SHIFT) & TW_M_MASK; if (h & TW_M_BIT) h = -(TW_M_MASK + 1 - h); if (v & TW_M_BIT) v = -(TW_M_MASK + 1 - v); #ifdef TWIDDLER_STATIC /* static implementation: return movement */ if (!lock) { lasth = h; lastv = v; lock = 1; } state->dx = -(h-lasth); lasth = h; state->dy = -(v-lastv); lastv = v; #elif defined(TWIDDLER_BALLISTIC) { /* in case I'll change the resolution */ static int tw_threshold = 5; /* above this it moves */ static int tw_scale = 5; /* every 5 report one */ if (h > -tw_threshold && h < tw_threshold) state->dx=0; else { h = h - (h<0)*tw_threshold +lasth; lasth = h%tw_scale; state->dx = -(h/tw_scale); } if (v > -tw_threshold && v < tw_threshold) state->dy=0; else { v = v - (v<0)*tw_threshold +lastv; lastv = v%tw_scale; state->dy = -(v/tw_scale); } } #else /* none defined: use mixed approach */ { /* in case I'll change the resolution */ static int tw_threshold = 60; /* above this, movement is ballistic */ static int tw_scale = 10; /* ball: every 6 units move one unit */ static int tw_static_scale = 3; /* stat: every 3 units move one unit */ static int lasthrest, lastvrest; /* integral of small motions uses rest */ if (!lock) { lasth = h; lasthrest = 0; lastv = v; lastvrest = 0; lock = 1; } if (h > -tw_threshold && h < tw_threshold) { state->dx = -(h-lasth+lasthrest)/tw_static_scale; lasthrest = (h-lasth+lasthrest)%tw_static_scale; } else /* ballistic */ { h = h - (h<0)*tw_threshold + lasthrest; lasthrest = h%tw_scale; state->dx = -(h/tw_scale); } lasth = h; if (v > -tw_threshold && v < tw_threshold) { state->dy = -(v-lastv+lastvrest)/tw_static_scale; lastvrest = (v-lastv+lastvrest)%tw_static_scale; } else /* ballistic */ { v = v - (v<0)*tw_threshold + lastvrest; lastvrest = v%tw_scale; state->dy = -(v/tw_scale); } lastv = v; } #endif /* fprintf(stderr,"%4i %4i -> %3i %3i\n",h,v,state->dx,state->dy); */ return 0; } #ifdef HAVE_LINUX_JOYSTICK_H /* Joystick mouse emulation (David Given) */ static int M_js(Gpm_Event *state, unsigned char *data) { struct JS_DATA_TYPE *jdata = (void*)data; static int centerx = 0; static int centery = 0; static int oldbuttons = 0; static int count = 0; int dx; int dy; count++; if (count < 200) { state->buttons = oldbuttons; state->dx = 0; state->dy = 0; return 0; } count = 0; if (centerx == 0) { centerx = jdata->x; centery = jdata->y; } state->buttons = ((jdata->buttons & 1) * GPM_B_LEFT) | ((jdata->buttons & 2) * GPM_B_RIGHT); oldbuttons = state->buttons; dx = (jdata->x - centerx) >> 6; dy = (jdata->y - centery) >> 6; if (dx > 0) state->dx = dx * dx; else state->dx = -(dx * dx); state->dx >>= 2; if (dy > 0) state->dy = dy * dy; else state->dy = -(dy * dy); state->dy >>= 2; /* Prevent pointer drift. (PC joysticks are notoriously inaccurate.) */ if ((state->dx >= -1) && (state->dx <= 1)) state->dx = 0; if ((state->dy >= -1) && (state->dy <= 1)) state->dy = 0; return 0; } #endif /* have joystick.h */ /* Synaptics TouchPad mouse emulation (Henry Davies) */ static int M_synaptics_serial(Gpm_Event *state, unsigned char *data) { syn_process_serial_data (state, data); return 0; } /* Synaptics TouchPad mouse emulation (Henry Davies) */ static int M_synaptics_ps2(Gpm_Event *state, unsigned char *data) { syn_process_ps2_data(state, data); return 0; } static int M_mtouch(Gpm_Event *state, unsigned char *data) { /* * This is a simple decoder for the MicroTouch touch screen * devices. It uses the "tablet" format and only generates button-1 * events. Check README.microtouch for additional information. */ int x, y; static int avgx=-1, avgy; /* average over time, for smooth feeling */ static int upx, upy; /* keep track of last finger-up place */ static struct timeval uptv, tv; /* time of last up, and down events */ #define REAL_TO_XCELL(x) (x * win.ws_col / 0x3FFF) #define REAL_TO_YCELL(y) (y * win.ws_row / 0x3FFF) #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ (t2.tv_usec-t1.tv_usec)/1000) if (!(data[0]&0x40)) { /* * finger-up event: this is usually offset a few pixels, * so ignore this x and y values. And invalidate avg. */ upx = avgx; upy = avgy; GET_TIME(uptv); /* ready for the next finger-down */ tv.tv_sec = 0; state->buttons = 0; avgx=-1; /* invalidate avg */ return 0; } x = data[1] | (data[2]<<7); y = 0x3FFF - (data[3] | (data[4]<<7)); if (avgx < 0) { /* press event */ GET_TIME(tv); if (DIF_TIME(uptv, tv) < (which_mouse->opt_time)) { /* count as button press placed at finger-up pixel */ state->buttons = GPM_B_LEFT; realposx = avgx = upx; state->x = REAL_TO_XCELL(realposx); realposy = avgy = upy; state->y = REAL_TO_YCELL(realposy); upx = (upx - x); /* upx and upy become offsets to use for this drag */ upy = (upy - y); return 0; } /* else, count as a new motion event */ tv.tv_sec = 0; /* invalidate */ realposx = avgx = x; state->x = REAL_TO_XCELL(realposx); realposy = avgy = y; state->y = REAL_TO_YCELL(realposy); } state->buttons = 0; if (tv.tv_sec) { /* a drag event: use position relative to press */ x += upx; y += upy; state->buttons = GPM_B_LEFT; } realposx = avgx = (9*avgx + x)/10; state->x = REAL_TO_XCELL(realposx); realposy = avgy = (9*avgy + y)/10; state->y = REAL_TO_YCELL(realposy); return 0; #undef REAL_TO_XCELL #undef REAL_TO_YCELL #undef GET_TIME #undef DIF_TIME } /* * This decoder is copied and adapted from the above mtouch. * However, this one uses argv, which should be ported above as well. * These variables are used for option passing */ static int gunze_avg = 9; /* the bigger the smoother */ static int gunze_calib[4]; /* x0,y0 x1,y1 (measured at 1/8 and 7/8) */ static int gunze_debounce = 100; /* milliseconds: ignore shorter taps */ static int M_gunze(Gpm_Event *state, unsigned char *data) { /* * This generates button-1 events, by now. * Check README.gunze for additional information. */ int x, y; static int avgx, avgy; /* average over time, for smooth feeling */ static int upx, upy; /* keep track of last finger-up place */ static int released = 0, dragging = 0; static struct timeval uptv, tv; /* time of last up, and down events */ int timediff; #define REAL_TO_XCELL(x) (x * win.ws_col / 0x3FFF) #define REAL_TO_YCELL(y) (y * win.ws_row / 0x3FFF) #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ (t2.tv_usec-t1.tv_usec)/1000) if (data[0] == 'R') { /* * finger-up event: this is usually offset a few pixels, * so ignore this x and y values. And invalidate avg. */ upx = avgx; upy = avgy; GET_TIME(uptv); /* ready for the next finger-down */ state->buttons = 0; released=1; return 0; } if(sscanf(data+1, "%d,%d", &x, &y)!= 2) { gpm_report(GPM_PR_INFO,GPM_MESS_GUNZE_INV_PACK,data); return 10; /* eat one byte only, leave ten of them */ } /* * First of all, calibrate decoded data; * the four numbers are 1/8X 1/8Y, 7/8X, 7/8Y */ x = 128 + 768 * (x - gunze_calib[0])/(gunze_calib[2]-gunze_calib[0]); y = 128 + 768 * (y - gunze_calib[1])/(gunze_calib[3]-gunze_calib[1]); /* range is 0-1023, rescale it upwards (0-REALPOS_MAX) */ x = x * REALPOS_MAX / 1023; y = REALPOS_MAX - y * REALPOS_MAX / 1023; if (x<0) x = 0; if (x > REALPOS_MAX) x = REALPOS_MAX; if (y<0) y = 0; if (y > REALPOS_MAX) y = REALPOS_MAX; /* * there are some issues wrt press events: since the device needs a * non-negligible pressure to detect stuff, it sometimes reports * quick up-down sequences, that actually are just the result of a * little bouncing of the finger. Therefore, we should discard any * release-press pair. This can be accomplished at press time. */ if (released) { /* press event -- or just bounce*/ GET_TIME(tv); timediff = DIF_TIME(uptv, tv); released = 0; if (timediff > gunze_debounce && timediff < (which_mouse->opt_time)) { /* count as button press placed at finger-up pixel */ dragging = 1; state->buttons = GPM_B_LEFT; realposx = avgx = upx; state->x = REAL_TO_XCELL(realposx); realposy = avgy = upy; state->y = REAL_TO_YCELL(realposy); upx = (upx - x); /* upx-upy become offsets to use for this drag */ upy = (upy - y); return 0; } if (timediff <= gunze_debounce) { /* just a bounce, invalidate offset, leave dragging alone */ upx = upy = 0; } else { /* else, count as a new motion event, reset avg */ dragging = 0; realposx = avgx = x; realposy = avgy = y; } } state->buttons = 0; if (dragging) { /* a drag event: use position relative to press */ x += upx; y += upy; state->buttons = GPM_B_LEFT; } realposx = avgx = (gunze_avg * avgx + x)/(gunze_avg+1); state->x = REAL_TO_XCELL(realposx); realposy = avgy = (gunze_avg * avgy + y)/(gunze_avg+1); state->y = REAL_TO_YCELL(realposy); return 0; #undef REAL_TO_XCELL #undef REAL_TO_YCELL #undef GET_TIME #undef DIF_TIME } /* * This decoder is copied and adapted from the above mtouch. */ static int elo_click_ontouch = 0; /* the bigger the smoother */ static int M_etouch(Gpm_Event *state, unsigned char *data) { /* * This is a simple decoder for the EloTouch touch screen devices. * ELO format SmartSet UTsXXYYZZc 9600,N,8,1 * c=checksum = 0xAA+'T'+'U'+s+X+X+Y+Y+Z+Z (XXmax=YYmax=0x0FFF=4095) * s=status bit 0=init touch 1=stream touch 2=release */ #define ELO_CLICK_ONTOUCH /* ifdef then ButtonPress on first Touch else first Move then Touch*/ int x, y; static int avgx=-1, avgy; /* average over time, for smooth feeling */ static int upx, upy; /* keep track of last finger-up place */ static struct timeval uptv, tv; /* time of last up, and down events */ #define REAL_TO_XCELL(x) (x * win.ws_col / 0x3FFF) #define REAL_TO_YCELL(y) (y * win.ws_row / 0x3FFF) #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ (t2.tv_usec-t1.tv_usec)/1000) if (data[2]&0x04) /* FINGER UP - Release */ { upx = avgx; /* ignore this x, y */ upy = avgy; /* store Finger UP possition */ GET_TIME(uptv); /* set time for the next finger-down */ tv.tv_sec = 0; /* NO DRAG */ avgx=-1; /* FINGER IS UP */ state->buttons = 0; return 0; } /* NOW WE HAVe FINGER DOWN */ x = data[3] | (data[4]<<8); x&=0xfff; y = data[5] | (data[6]<<8); x&=0xfff; x = REALPOS_MAX * (x - gunze_calib[0])/(gunze_calib[2]-gunze_calib[0]); y = REALPOS_MAX * (y - gunze_calib[1])/(gunze_calib[3]-gunze_calib[1]); if (x<0) x = 0; if (x > REALPOS_MAX) x = REALPOS_MAX; if (y<0) y = 0; if (y > REALPOS_MAX) y = REALPOS_MAX; if (avgx < 0) /* INITIAL TOUCH, FINGER WAS UP */ { GET_TIME(tv); state->buttons = 0; if (DIF_TIME(uptv, tv) < (which_mouse->opt_time)) { /* if Initial Touch immediate after finger UP then start DRAG */ x=upx; y=upy; /* A:start DRAG at finger-UP position */ if (elo_click_ontouch==0) state->buttons = GPM_B_LEFT; } else /* 1:MOVE to Initial Touch position */ { upx=x; upy=y; /* store position of Initial Touch into upx, upy */ if (elo_click_ontouch==0) tv.tv_sec=0; /* no DRAG */ } realposx = avgx = x; state->x = REAL_TO_XCELL(realposx); realposy = avgy = y; state->y = REAL_TO_YCELL(realposy); return 0; } /* endof INITIAL TOUCH */ state->buttons = 0; /* Motion event */ if (tv.tv_sec) /* draging or elo_click_ontouch */ { state->buttons = GPM_B_LEFT; if (elo_click_ontouch) { x=avgx=upx; /* 2:BUTTON PRESS at Initial Touch position */ y=avgy=upy; tv.tv_sec=0; /* so next time 3:MOVE again until Finger UP*/ } /* else B:continue DRAG to current possition */ } realposx = avgx = (9*avgx + x)/10; state->x = REAL_TO_XCELL(realposx); realposy = avgy = (9*avgy + y)/10; state->y = REAL_TO_YCELL(realposy); return 0; #undef REAL_TO_XCELL #undef REAL_TO_YCELL #undef GET_TIME #undef DIF_TIME } /* Support for DEC VSXXX-AA and VSXXX-GA serial mice used on */ /* DECstation 5000/xxx, DEC 3000 AXP and VAXstation 4000 */ /* workstations */ /* written 2001/07/11 by Karsten Merker (merker@linuxtag.org) */ /* modified (completion of the protocol specification and */ /* corresponding correction of the protocol identification */ /* mask) 2001/07/12 by Maciej W. Rozycki (macro@ds2.pg.gda.pl) */ static int M_vsxxx_aa(Gpm_Event *state, unsigned char *data) { /* The mouse protocol is as follows: * 4800 bits per second, 8 data bits, 1 stop bit, odd parity * 3 data bytes per data packet: * 7 6 5 4 3 2 1 0 * First Byte: 1 0 0 SignX SignY LMB MMB RMB * Second Byte 0 DX DX DX DX DX DX DX * Third Byte 0 DY DY DY DY DY DY DY * * SignX: sign bit for X-movement * SignY: sign bit for Y-movement * DX and DY: 7-bit-absolute values for delta-X and delta-Y, sign extensions * are in SignX resp. SignY. * * There are a few commands the mouse accepts: * "D" selects the prompt mode, * "P" requests a mouse's position (also selects the prompt mode), * "R" selects the incremental stream mode, * "T" performs a self test and identification (power-up-like), * "Z" performs undocumented test functions (a byte follows). * Parity as well as bit #7 of commands are ignored by the mouse. * * 4 data bytes per self test packet (useful for hot-plug): * 7 6 5 4 3 2 1 0 * First Byte: 1 0 1 0 R3 R2 R1 R0 * Second Byte 0 M2 M1 M0 0 0 1 0 * Third Byte 0 E6 E5 E4 E3 E2 E1 E0 * Fourth Byte 0 0 0 0 0 LMB MMB RMB * * R3-R0: revision, * M2-M0: manufacturer location code, * E6-E0: error code: * 0x00-0x1f: no error (fourth byte is button state), * 0x3d: button error (fourth byte specifies which), * else: other error. * * The mouse powers up in the prompt mode but we use the stream mode. */ state->buttons = data[0]&0x07; state->dx = (data[0]&0x10) ? data[1] : -data[1]; state->dy = (data[0]&0x08) ? -data[2] : data[2]; return 0; } /* Genius Wizardpad tablet -- Matt Kimball (mkimball@xmission.com) */ static int wizardpad_width = -1; static int wizardpad_height = -1; static int M_wp(Gpm_Event *state, unsigned char *data) { int x, y, pressure; x = ((data[4] & 0x1f) << 12) | ((data[3] & 0x3f) << 6) | (data[2] & 0x3f); state->x = x * win.ws_col / (wizardpad_width * 40); realposx = x * 16383 / (wizardpad_width * 40); y = ((data[7] & 0x1f) << 12) | ((data[6] & 0x3f) << 6) | (data[5] & 0x3f); state->y = win.ws_row - y * win.ws_row / (wizardpad_height * 40) - 1; realposy = 16383 - y * 16383 / (wizardpad_height * 40) - 1; pressure = ((data[9] & 0x0f) << 4) | (data[8] & 0x0f); state->buttons= (pressure >= 0x20) * GPM_B_LEFT + !!(data[1] & 0x02) * GPM_B_RIGHT + /* the 0x08 bit seems to catch either of the extra buttons... */ !!(data[1] & 0x08) * GPM_B_MIDDLE; return 0; } /*========================================================================*/ /* Then, mice should be initialized */ static Gpm_Type* I_empty(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { if (check_no_argv(argc, argv)) return NULL; return type; } static int setspeed(int fd,int old,int new,int needtowrite,unsigned short flags) { struct termios tty; char *c; tcgetattr(fd, &tty); tty.c_iflag = IGNBRK | IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; tty.c_line = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; switch (old) { case 19200: tty.c_cflag = flags | B19200; break; case 9600: tty.c_cflag = flags | B9600; break; case 4800: tty.c_cflag = flags | B4800; break; case 2400: tty.c_cflag = flags | B2400; break; case 1200: default: tty.c_cflag = flags | B1200; break; } tcsetattr(fd, TCSAFLUSH, &tty); switch (new) { case 19200: c = "*r"; tty.c_cflag = flags | B19200; break; case 9600: c = "*q"; tty.c_cflag = flags | B9600; break; case 4800: c = "*p"; tty.c_cflag = flags | B4800; break; case 2400: c = "*o"; tty.c_cflag = flags | B2400; break; case 1200: default: c = "*n"; tty.c_cflag = flags | B1200; break; } if (needtowrite) write(fd, c, 2); usleep(100000); tcsetattr(fd, TCSAFLUSH, &tty); return 0; } static struct { int sample; char code[2]; } sampletab[]={ { 0,"O"}, { 15,"J"}, { 27,"K"}, { 42,"L"}, { 60,"R"}, { 85,"M"}, {125,"Q"}, {1E9,"N"}, }; static Gpm_Type* I_serial(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { int i; unsigned char c; fd_set set; struct timeval timeout={0,0}; /* used when not debugging */ /* accept "-o dtr", "-o rts" and "-o both" */ if (option_modem_lines(fd, argc, argv)) return NULL; #ifndef DEBUG /* flush any pending input (thanks, Miguel) */ FD_ZERO(&set); for(i=0; /* always */ ; i++) { FD_SET(fd,&set); switch(select(fd+1,&set,(fd_set *)NULL,(fd_set *)NULL,&timeout/*zero*/)){ case 1: if (read(fd,&c,1)==0) break; case -1: continue; } break; } if (type->fun==M_logimsc) write(fd, "QU", 2 ); #if 0 /* Did this ever work? -- I don't know, but should we not remove it, * if it doesn't work ??? -- Nico */ if (type->fun==M_ms && i==2 && c==0x33) { /* Aha.. a mouseman... */ gpm_report(GPM_PR_INFO,GPM_MESS_MMAN_DETECTED); return mice; /* it is the first */ } #endif #endif /* Non mman: change from any available speed to the chosen one */ for (i=9600; i>=1200; i/=2) setspeed(fd, i, (which_mouse->opt_baud), (type->fun != M_mman) /* write */, flags); /* * reset the MouseMan/TrackMan to use the 3/4 byte protocol * (Stephen Lee, sl14@crux1.cit.cornell.edu) * Changed after 1.14; why not having "I_mman" now? */ if (type->fun==M_mman) { setspeed(fd, 1200, 1200, 0, flags); /* no write */ write(fd, "*X", 2); setspeed(fd, 1200, (which_mouse->opt_baud), 0, flags); /* no write */ return type; } if(type->fun==M_geni) { gpm_report(GPM_PR_INFO,GPM_MESS_INIT_GENI); setspeed(fd, 1200, 9600, 1, flags); /* write */ write(fd, ":" ,1); write(fd, "E" ,1); /* setup tablet. relative mode, resolution... */ write(fd, "@" ,1); /* setup tablet. relative mode, resolution... */ } if (type->fun==M_synaptics_serial) { int packet_length; setspeed (fd, 1200, 1200, 1, flags); packet_length = syn_serial_init (fd); setspeed (fd, 1200, 9600, 1, flags); type->packetlen = packet_length; type->howmany = packet_length; } if (type->fun==M_vsxxx_aa) { setspeed (fd, 4800, 4800, 0, flags); /* no write */ write(fd, "R", 1); /* initialize a mouse; without getting an "R" */ /* a mouse does not send a bytestream */ } return type; } static Gpm_Type* I_logi(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { int i; struct stat buf; int busmouse; if (check_no_argv(argc, argv)) return NULL; /* is this a serial- or a bus- mouse? */ if(fstat(fd,&buf)==-1) gpm_report(GPM_PR_OOPS,GPM_MESS_FSTAT); i=MAJOR(buf.st_rdev); /* I don't know why this is herein, but I remove it. I don't think a * hardcoded ttyname in a C file is senseful. I think if the device * exists must be clear before. Not here. */ /********* if (stat("/dev/ttyS0",&buf)==-1) gpm_oops("stat()"); *****/ busmouse=(i != MAJOR(buf.st_rdev)); /* fix the howmany field, so that serial mice have 1, while busmice have 3 */ type->howmany = busmouse ? 3 : 1; /* change from any available speed to the chosen one */ for (i=9600; i>=1200; i/=2) setspeed(fd, i, (which_mouse->opt_baud), 1 /* write */, flags); /* this stuff is peculiar of logitech mice, also for the serial ones */ write(fd, "S", 1); setspeed(fd, (which_mouse->opt_baud), (which_mouse->opt_baud), 1 /* write */, CS8 |PARENB |PARODD |CREAD |CLOCAL |HUPCL); /* configure the sample rate */ for (i=0;(which_mouse->opt_sample)<=sampletab[i].sample;i++) ; write(fd,sampletab[i].code,1); return type; } static Gpm_Type *I_wacom(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { /* wacom graphire tablet */ #define UD_RESETBAUD "\r$" /* reset baud rate to default (wacom V) */ /* or switch to wacom IIs (wacomIV) */ #define UD_RESET "#\r" /* Reset tablet and enable WACOM IV */ #define UD_SENDCOORDS "ST\r" /* Start sending coordinates */ #define UD_FIRMID "~#\r" /* Request firmware ID string */ #define UD_COORD "~C\r" /* Request max coordinates */ #define UD_STOP "\nSP\r" /* stop sending coordinates */ void reset_wacom() { /* Init Wacom communication; this is modified from xf86Wacom.so module */ /* Set speed to 19200 */ setspeed (fd, 1200, 19200, 0, B19200|CS8|CREAD|CLOCAL|HUPCL); /* Send Reset Baudrate Command */ write(fd, UD_RESETBAUD, strlen(UD_RESETBAUD)); usleep(250000); /* Send Reset Command */ write(fd, UD_RESET, strlen(UD_RESET)); usleep(75000); /* Set speed to 9600bps */ setspeed (fd, 1200, 9600, 0, B9600|CS8|CREAD|CLOCAL|HUPCL); /* Send Reset Command */ write(fd, UD_RESET, strlen(UD_RESET)); usleep(250000); write(fd, UD_STOP, strlen(UD_STOP)); usleep(100000); } int wait_wacom() { /* * Wait up to 200 ms for Data from Tablet. * Do not read that data. * Give back 0 on timeout condition, -1 on error and 1 for DataPresent */ struct timeval timeout; fd_set readfds; int err; FD_ZERO(&readfds); FD_SET(fd, &readfds); timeout.tv_sec = 0; timeout.tv_usec = 200000; err = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout); return((err>0)?1:err); } char buffer[50], *p; int RequestData(char *cmd) { int err; /* * Send cmd if not null, and get back answer from tablet. * Get Data to buffer until full or timeout. * Give back 0 for timeout and !0 for buffer full */ if (cmd) write(fd,cmd,strlen(cmd)); memset(buffer,0,sizeof(buffer)); p=buffer; err=wait_wacom(); while (err != -1 && err && (p-buffer)<(sizeof(buffer)-1)) { p+= read(fd,p,(sizeof(buffer)-1)-(p-buffer)); err=wait_wacom(); } /* return 1 for buffer full */ return ((strlen(buffer) >= (sizeof(buffer)-1))? !0 :0); } /* * We do both modes, relative and absolute, with the same function. * If WacomAbsoluteWanted is !0 then that function calculates * absolute values, else relative ones. * We set this by the -o switch: * gpm -t wacom -o absolute # does absolute mode * gpm -t wacom # does relative mode * gpm -t wacom -o relative # does relative mode */ /* accept boolean options absolute and relative */ static argv_helper optioninfo[] = { {"absolute", ARGV_BOOL, u: {iptr: &WacomAbsoluteWanted}, value: !0}, {"relative", ARGV_BOOL, u: {iptr: &WacomAbsoluteWanted}, value: 0}, {"", ARGV_END} }; parse_argv(optioninfo, argc, argv); type->absolute = WacomAbsoluteWanted; reset_wacom(); /* "Flush" input queque */ while(RequestData(NULL)) ; /* read WACOM-ID */ RequestData(UD_FIRMID); /* Search for matching modell */ for(WacomModell=0; WacomModell< (sizeof(wcmodell) / sizeof(struct WC_MODELL)); WacomModell++ ) { if (!strncmp(buffer+2,wcmodell[WacomModell].magic, 2)) { /* Magic matches, modell found */ wmaxx=wcmodell[WacomModell].maxX; wmaxy=wcmodell[WacomModell].maxY; break; } } if(WacomModell >= (sizeof(wcmodell) / sizeof(struct WC_MODELL))) WacomModell=-1; gpm_report(GPM_PR_INFO,GPM_MESS_WACOM_MOD, type->absolute? 'A':'R', (WacomModell==(-1))? "Unknown" : wcmodell[WacomModell].name, buffer+2); /* read Wacom max size */ if(WacomModell!=(-1) && (!wcmodell[WacomModell].maxX)) { RequestData(UD_COORD); sscanf(buffer+2, "%d,%d", &wmaxx, &wmaxy); wmaxx = (wmaxx-wcmodell[WacomModell].border); wmaxy = (wmaxy-wcmodell[WacomModell].border); } write(fd,UD_SENDCOORDS,4); return type; } static Gpm_Type *I_pnp(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { struct termios tty; /* accept "-o dtr", "-o rts" and "-o both" */ if (option_modem_lines(fd, argc, argv)) return NULL; /* * Just put the device to 1200 baud. Thanks to Francois Chastrette * for his great help and debugging with his own pnp device. */ tcgetattr(fd, &tty); tty.c_iflag = IGNBRK | IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; tty.c_line = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; tty.c_cflag = flags | B1200; tcsetattr(fd, TCSAFLUSH, &tty); /* set parameters */ /* * Don't read the silly initialization string. I don't want to see * the vendor name: it is only propaganda, with no information. */ return type; } /* * Sends the SEND_ID command to the ps2-type mouse. * Return one of GPM_AUX_ID_... */ static int read_mouse_id(int fd) { unsigned char c = GPM_AUX_SEND_ID; unsigned char id; write(fd, &c, 1); read(fd, &c, 1); if (c != GPM_AUX_ACK) { return(GPM_AUX_ID_ERROR); } read(fd, &id, 1); return(id); } /** * Writes the given data to the ps2-type mouse. * Checks for an ACK from each byte. * * Returns 0 if OK, or >0 if 1 or more errors occurred. */ static int write_to_mouse(int fd, unsigned char *data, size_t len) { int i; int error = 0; for (i = 0; i < len; i++) { unsigned char c; write(fd, &data[i], 1); read(fd, &c, 1); if (c != GPM_AUX_ACK) error++; } /* flush any left-over input */ usleep (30000); tcflush (fd, TCIFLUSH); return(error); } /* intellimouse, ps2 version: Ben Pfaff and Colin Plumb */ /* Autodetect: Steve Bennett */ static Gpm_Type *I_imps2(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { int id; static unsigned char basic_init[] = { GPM_AUX_ENABLE_DEV, GPM_AUX_SET_SAMPLE, 100 }; static unsigned char imps2_init[] = { GPM_AUX_SET_SAMPLE, 200, GPM_AUX_SET_SAMPLE, 100, GPM_AUX_SET_SAMPLE, 80, }; static unsigned char ps2_init[] = { GPM_AUX_SET_SCALE11, GPM_AUX_ENABLE_DEV, GPM_AUX_SET_SAMPLE, 100, GPM_AUX_SET_RES, 3, }; /* Do a basic init in case the mouse is confused */ write_to_mouse(fd, basic_init, sizeof (basic_init)); /* Now try again and make sure we have a PS/2 mouse */ if (write_to_mouse(fd, basic_init, sizeof (basic_init)) != 0) { gpm_report(GPM_PR_ERR,GPM_MESS_IMPS2_INIT); return(NULL); } /* Try to switch to 3 button mode */ if (write_to_mouse(fd, imps2_init, sizeof (imps2_init)) != 0) { gpm_report(GPM_PR_ERR,GPM_MESS_IMPS2_FAILED); return(NULL); } /* Read the mouse id */ id = read_mouse_id(fd); if (id == GPM_AUX_ID_ERROR) { gpm_report(GPM_PR_ERR,GPM_MESS_IMPS2_MID_FAIL); id = GPM_AUX_ID_PS2; } /* And do the real initialisation */ if (write_to_mouse(fd, ps2_init, sizeof (ps2_init)) != 0) { gpm_report(GPM_PR_ERR,GPM_MESS_IMPS2_SETUP_FAIL); } if (id == GPM_AUX_ID_IMPS2) { /* Really an intellipoint, so initialise 3 button mode (4 byte packets) */ gpm_report(GPM_PR_INFO,GPM_MESS_IMPS2_AUTO); return type; } if (id != GPM_AUX_ID_PS2) { gpm_report(GPM_PR_ERR,GPM_MESS_IMPS2_BAD_ID, id); } else gpm_report(GPM_PR_INFO,GPM_MESS_IMPS2_PS2); for (type=mice; type->fun; type++) if (strcmp(type->name, "ps2") == 0) return(type); /* ps2 was not found!!! */ return(NULL); } /* * This works with Dexxa Optical Mouse, but because in X same initstring * is named ExplorerPS/2 so I named it in the same way. */ static Gpm_Type *I_exps2(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { static unsigned char s1[] = { 243, 200, 243, 200, 243, 80, }; if (check_no_argv(argc, argv)) return NULL; write (fd, s1, sizeof (s1)); usleep (30000); tcflush (fd, TCIFLUSH); return type; } static Gpm_Type *I_twid(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { if (check_no_argv(argc, argv)) return NULL; if (twiddler_key_init() != 0) return NULL; /* * the twiddler is a serial mouse: just drop dtr * and run at 2400 (unless specified differently) */ if((which_mouse->opt_baud)==DEF_BAUD) (which_mouse->opt_baud) = 2400; argv[1] = "dtr"; /* argv[1] is guaranteed to be NULL (this is dirty) */ return I_serial(fd, flags, type, argc, argv); } static Gpm_Type *I_calus(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { if (check_no_argv(argc, argv)) return NULL; if ((which_mouse->opt_baud) == 1200) (which_mouse->opt_baud)=9600; /* default to 9600 */ return I_serial(fd, flags, type, argc, argv); } /* synaptics touchpad, ps2 version: Henry Davies */ static Gpm_Type *I_synps2(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { syn_ps2_init (fd); return type; } static Gpm_Type *I_summa(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { void resetsumma() { write(fd,0,1); /* Reset */ usleep(400000); /* wait */ } int waitsumma() { struct timeval timeout; fd_set readfds; int err; FD_ZERO(&readfds); FD_SET(fd, &readfds); timeout.tv_sec = 0; timeout.tv_usec = 200000; err = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout); return(err); } int err; char buffer[255]; char config[5]; /* Summasketchtablet (from xf86summa.o: thanks to Steven Lang )*/ #define SS_PROMPT_MODE "B" /* Prompt mode */ #define SS_FIRMID "z?" /* Request firmware ID string */ #define SS_500LPI "h" /* 500 lines per inch */ #define SS_READCONFIG "a" #define SS_ABSOLUTE "F" /* Absolute Mode */ #define SS_TABID0 "0" /* Tablet ID 0 */ #define SS_UPPER_ORIGIN "b" /* Origin upper left */ #define SS_BINARY_FMT "zb" /* Binary reporting */ #define SS_STREAM_MODE "@" /* Stream mode */ /* Geniustablet (hisketch.txt)*/ #define GEN_MMSERIES ":" char GEN_MODELL=0x7f; /* Set speed to 9600bps */ setspeed (fd, 1200, 9600, 1, B9600|CS8|CREAD|CLOCAL|HUPCL|PARENB|PARODD); resetsumma(); write(fd, SS_PROMPT_MODE, strlen(SS_PROMPT_MODE)); if (strstr(type->name,"acecad")!=NULL) summaid=11; if (summaid<0) { /* Summagraphics test */ /* read the Summa Firm-ID */ write(fd, SS_FIRMID, strlen(SS_FIRMID)); err=waitsumma(); if (!((err == -1) || (!err))) { summaid=10; /* Original Summagraphics */ read(fd, buffer, 255); /* Read Firm-ID */ } } if (summaid<0) { /* Genius-test */ resetsumma(); write(fd,GEN_MMSERIES,1); write(fd,&GEN_MODELL,1); /* Read modell */ err=waitsumma(); if (!((err == -1) || (!err))) { /* read Genius-ID */ err=waitsumma(); if (!((err == -1) || (!err))) { err=waitsumma(); if (!((err == -1) || (!err))) { read(fd,&config,1); summaid=(config[0] & 224) >> 5; /* genius tablet-id (0-7)*/ } } } } /* end of Geniustablet-test */ /* unknown tablet ?*/ if ((summaid<0) || (summaid==11)) { resetsumma(); write(fd, SS_BINARY_FMT SS_PROMPT_MODE, 3); } /* read tablet size */ err=waitsumma(); if (!((err == -1) || (!err))) read(fd,buffer,sizeof(buffer)); write(fd,SS_READCONFIG,1); read(fd,&config,5); summamaxx=(config[2]<<7 | config[1])-(SUMMA_BORDER*2); summamaxy=(config[4]<<7 | config[3])-(SUMMA_BORDER*2); write(fd,SS_ABSOLUTE SS_STREAM_MODE SS_UPPER_ORIGIN,3); if (summaid<0) write(fd,SS_500LPI SS_TABID0 SS_BINARY_FMT,4); return type; } static Gpm_Type *I_mtouch(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { struct termios tty; /* Set speed to 9600bps (copied from I_summa, above :) */ tcgetattr(fd, &tty); tty.c_iflag = IGNBRK | IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; tty.c_line = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; tty.c_cflag = B9600|CS8|CREAD|CLOCAL|HUPCL; tcsetattr(fd, TCSAFLUSH, &tty); /* Turn it to "format tablet" and "mode stream" */ write(fd,"\001MS\r\n\001FT\r\n",10); return type; } /* simple initialization for the gunze touchscreen */ static Gpm_Type *I_gunze(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { struct termios tty; FILE *f; char s[80]; int i, calibok = 0; #define GUNZE_CALIBRATION_FILE SYSCONFDIR "/gpm-calibration" /* accept a few options */ static argv_helper optioninfo[] = { {"smooth", ARGV_INT, u: {iptr: &gunze_avg}}, {"debounce", ARGV_INT, u: {iptr: &gunze_debounce}}, /* FIXME: add corner tapping */ {"", ARGV_END} }; parse_argv(optioninfo, argc, argv); /* check that the baud rate is valid */ if ((which_mouse->opt_baud) == DEF_BAUD) (which_mouse->opt_baud) = 19200; /* force 19200 as default */ if ((which_mouse->opt_baud) != 9600 && (which_mouse->opt_baud) != 19200) { gpm_report(GPM_PR_ERR,GPM_MESS_GUNZE_WRONG_BAUD,option.progname, argv[0]); (which_mouse->opt_baud) = 19200; } tcgetattr(fd, &tty); tty.c_iflag = IGNBRK | IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; tty.c_line = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; tty.c_cflag = ((which_mouse->opt_baud) == 9600 ? B9600 : B19200) |CS8|CREAD|CLOCAL|HUPCL; tcsetattr(fd, TCSAFLUSH, &tty); /* FIXME: try to find some information about the device */ /* retrieve calibration, if not existent, use defaults (uncalib) */ f = fopen(GUNZE_CALIBRATION_FILE, "r"); if (f) { fgets(s, 80, f); /* discard the comment */ if (fscanf(f, "%d %d %d %d", gunze_calib, gunze_calib+1, gunze_calib+2, gunze_calib+3) == 4) calibok = 1; /* Hmm... check */ for (i=0; i<4; i++) if (gunze_calib[i] & ~1023) calibok = 0; if (gunze_calib[0] == gunze_calib[2]) calibok = 0; if (gunze_calib[1] == gunze_calib[3]) calibok = 0; fclose(f); } if (!calibok) { gpm_report(GPM_PR_ERR,GPM_MESS_GUNZE_CALIBRATE, option.progname); gunze_calib[0] = gunze_calib[1] = 128; /* 1/8 */ gunze_calib[2] = gunze_calib[3] = 896; /* 7/8 */ } return type; } /* simple initialization for the elo touchscreen */ static Gpm_Type *I_etouch(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { struct termios tty; FILE *f; char s[80]; int i, calibok = 0; /* Calibration config file (copied from I_gunze, below :) */ #define ELO_CALIBRATION_FILE SYSCONFDIR "/gpm-calibration" /* accept a few options */ static argv_helper optioninfo[] = { {"clickontouch", ARGV_BOOL, u: {iptr: &elo_click_ontouch}, value: !0}, {"", ARGV_END} }; parse_argv(optioninfo, argc, argv); /* Set speed to 9600bps (copied from I_summa, above :) */ tcgetattr(fd, &tty); tty.c_iflag = IGNBRK | IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; tty.c_line = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; tty.c_cflag = B9600|CS8|CREAD|CLOCAL|HUPCL; tcsetattr(fd, TCSAFLUSH, &tty); /* retrieve calibration, if not existent, use defaults (uncalib) */ f = fopen(ELO_CALIBRATION_FILE, "r"); if (f) { fgets(s, 80, f); /* discard the comment */ if (fscanf(f, "%d %d %d %d", gunze_calib, gunze_calib+1, gunze_calib+2, gunze_calib+3) == 4) calibok = 1; /* Hmm... check */ for (i=0; i<4; i++) if ((gunze_calib[i] & 0xfff) != gunze_calib[i]) calibok = 0; if (gunze_calib[0] == gunze_calib[2]) calibok = 0; if (gunze_calib[1] == gunze_calib[3]) calibok = 0; fclose(f); } if (!calibok) { gpm_report(GPM_PR_ERR,GPM_MESS_ELO_CALIBRATE, option.progname, ELO_CALIBRATION_FILE); /* "%s: etouch: calibration file %s absent or invalid, using defaults" */ gunze_calib[0] = gunze_calib[1] = 0x010; /* 1/16 */ gunze_calib[2] = gunze_calib[3] = 0xff0; /* 15/16 */ } return type; } /* Genius Wizardpad tablet -- Matt Kimball (mkimball@xmission.com) */ static Gpm_Type *I_wp(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv) { struct termios tty; char tablet_info[256]; int count, pos, size; /* Set speed to 9600bps (copied from I_summa, above :) */ tcgetattr(fd, &tty); tty.c_iflag = IGNBRK | IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; tty.c_line = 0; tty.c_cc[VTIME] = 0; tty.c_cc[VMIN] = 1; tty.c_cflag = B9600|CS8|CREAD|CLOCAL|HUPCL; tcsetattr(fd, TCSAFLUSH, &tty); /* Reset the tablet (':') and put it in remote mode ('S') so that it isn't sending anything to us. */ write(fd, ":S", 2); tcsetattr(fd, TCSAFLUSH, &tty); /* Query the model of the tablet */ write(fd, "T", 1); sleep(1); count = read(fd, tablet_info, 255); /* The tablet information should start with "KW" followed by the rest of the model number. If it isn't there, it probably isn't a WizardPad. */ if(count < 2) return NULL; if(tablet_info[0] != 'K' || tablet_info[1] != 'W') return NULL; /* Now, we want the width and height of the tablet. They should be of the form "X###" and "Y###" where ### is the number of units of the tablet. The model I've got is "X130" and "Y095", but I guess there might be other ones sometime. */ for(pos = 0; pos < count; pos++) { if(tablet_info[pos] == 'X' || tablet_info[pos] == 'Y') { if(pos + 3 < count) { size = (tablet_info[pos + 1] - '0') * 100 + (tablet_info[pos + 2] - '0') * 10 + (tablet_info[pos + 3] - '0'); if(tablet_info[pos] == 'X') { wizardpad_width = size; } else { wizardpad_height = size; } } } } /* Set the tablet to stream mode with 180 updates per sec. ('O') */ write(fd, "O", 1); return type; } /*========================================================================*/ /* Finally, the table */ #define STD_FLG (CREAD|CLOCAL|HUPCL) /* * Note that mman must be the first, and ms the second (I use this info * in mouse-test.c, as a quick and dirty hack * * We should clean up mouse-test and sort the table alphabeticly! --nico */ /* * For those who are trying to add a new type, here a brief * description of the structure. Please refer to gpmInt.h and gpm.c * for more information: * * The first three strings are the name, an help line, a long name (if any) * Then come the functions: the decoder and the initializazion function * (called I_* and M_*) * Follows an array of four bytes: it is the protocol-identification, based * on the first two bytes of a packet: if * "((byte0 & proto[0]) == proto[1]) && ((byte1 & proto[2]) == proto[3])" * then we are at the beginning of a packet. * The following numbers are: * bytes-per-packet, * bytes-to-read (use 1, bus mice are pathological) * has-extra-byte (boolean, for mman pathological protocol) * is-absolute-coordinates (boolean) * Finally, a pointer to a repeater function, if any. */ Gpm_Type mice[]={ {"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).", "Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */ {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0}, {"ms", "The original ms protocol, with a middle-button extension.", "", M_ms, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)", "", M_summa, I_summa, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0}, {"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.", "Microsoft", M_bare, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"bm", "Micro$oft busmice and compatible devices.", "BusMouse", M_bm, I_empty, STD_FLG, /* bm is sun */ {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0}, {"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)", "", M_brw, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0}, {"cal", "Calcomp UltraSlate", "", M_calus, I_calus, CS8 | CSTOPB | STD_FLG, {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0}, {"calr", "Calcomp UltraSlate - relative mode", "", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG, {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0}, {"etouch", "EloTouch touch-screens (only button-1 events, by now)", "", M_etouch, I_etouch, STD_FLG, {0xFF, 0x55, 0xFF, 0x54}, 7, 1, 0, 1, NULL}, #ifdef HAVE_LINUX_INPUT_H {"evdev", "Linux Event Device", "", M_evdev, I_empty, STD_FLG, {0x00, 0x00, 0x00, 0x00} , 16, 16, 0, 0, NULL}, #endif /* HAVE_LINUX_INPUT_H */ {"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused", "ExplorerPS/2", M_imps2, I_exps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, #ifdef HAVE_LINUX_JOYSTICK_H {"js", "Joystick mouse emulation", "Joystick", M_js, NULL, 0, {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0}, #endif {"genitizer", "\"Genitizer\" tablet, in relative mode.", "", M_geni, I_serial, CS8|PARENB|PARODD, {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0}, {"gunze", "Gunze touch-screens (only button-1 events, by now)", "", M_gunze, I_gunze, STD_FLG, {0xF9, 0x50, 0xF0, 0x30}, 11, 1, 0, 1, NULL}, {"imps2","Microsoft Intellimouse (ps2)-autodetect 2/3 buttons,wheel unused", "", M_imps2, I_imps2, STD_FLG, {0xC0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, R_imps2}, {"logi", "Used in some Logitech devices (only serial).", "Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG, {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0}, {"logim", "Turn logitech into Mouse-Systems-Compatible.", "", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG, {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0}, {"mm", "MM series. Probably an old protocol...", "MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG, {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, {"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused", "", M_ms3, I_pnp, CS7 | STD_FLG, {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3}, {"ms+", "Like 'ms', but allows dragging with the middle button.", "", M_ms_plus, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).", "", M_ms_plus_lr, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.", "MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG, {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc}, {"mtouch", "MicroTouch touch-screens (only button-1 events, by now)", "", M_mtouch, I_mtouch, STD_FLG, {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL}, {"ncr", "Ncr3125pen, found on some laptops", "", M_ncr, NULL, STD_FLG, {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0}, {"netmouse","Genius NetMouse (ps2) - 2 buttons and 2 buttons 'up'/'down'.", "", M_netmouse, I_netmouse, CS7 | STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0}, {"pnp", "Plug and pray. New mice may not run with '-t ms'.", "", M_bare, I_pnp, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0}, {"ps2", "Busmice of the ps/2 series. Most busmice, actually.", "PS/2", M_ps2, I_ps2, STD_FLG, {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, R_ps2}, {"sun", "'msc' protocol, but only 3 bytes per packet.", "", M_sun, I_serial, CS8 | CSTOPB | STD_FLG, {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, R_sun}, {"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)", "", M_summa, I_summa, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_summa}, {"syn", "The \"Synaptics\" serial TouchPad.", "synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG, {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0}, {"synps2", "The \"Synaptics\" PS/2 TouchPad", "synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG, {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0}, {"twid", "Twidddler keyboard", "", M_twid, I_twid, CS8 | STD_FLG, {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0}, {"vsxxxaa", "The DEC VSXXX-AA/GA serial mouse on DEC workstations.", "", M_vsxxx_aa, I_serial, CS8 | PARENB | PARODD | STD_FLG, {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0}, {"wacom","Wacom Protocol IV Tablets: Pen+Mouse, relative+absolute mode", "", M_wacom, I_wacom, STD_FLG, {0x80, 0x80, 0x80, 0x00}, 7, 1, 0, 0, 0}, {"wp", "Genius WizardPad tablet", "wizardpad", M_wp, I_wp, STD_FLG, {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0}, {"", "", "", NULL, NULL, 0, {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0} }; /*------------------------------------------------------------------------*/ /* and the help */ int M_listTypes(void) { Gpm_Type *type; printf(GPM_MESS_VERSION "\n"); printf(GPM_MESS_AVAIL_MYT); for (type=mice; type->fun; type++) printf(GPM_MESS_SYNONYM, type->repeat_fun?'*':' ', type->name, type->desc, type->synonyms); putchar('\n'); return 1; /* to exit() */ } /* indent: use three spaces. no tab. not two or four. three */ /* Local Variables: */ /* c-indent-level: 3 */ /* End: */ gpm-1.20.4/src/prog004070000017500001750000000000001101761662200126765ustar00niconico00gpm-1.20.4/src/prog/disable-paste.c010060000017500001750000000033671101736502100156400ustar00niconico00/* * disable-paste.c - trivial program to stop gpm from pasting the * current selection until the next user action * * Copyright (C) 1998 Ian Zimmerman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include #include #include #include #include #include #include #include #include #include #include "headers/gpm.h" #include "headers/gpmInt.h" int main(int argc, char** argv) { Gpm_Connect conn; const int len = sizeof(Gpm_Connect); int exit_status = 0; conn.eventMask = (unsigned short)(-1); conn.defaultMask = 0; conn.minMod = 0; conn.maxMod = (unsigned short)(-1); if (0 > Gpm_Open(&conn,0)) { fprintf(stderr,"disable-paste: cannot open mouse connection\n"); exit(1); } conn.vc = GPM_REQ_NOPASTE; conn.pid = 0; if (len > write(gpm_fd, &conn, len)) { fprintf(stderr,"disable-paste: cannot write request\n"); exit_status = 2; } Gpm_Close(); exit(exit_status); } gpm-1.20.4/src/prog/display-buttons.c010060000017500001750000000066331101736502100162630ustar00niconico00/* * display-coords.c - a very simple gpm client * * Copyright 2007-2008 Nico Schottelius * * 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. * * Compile and link with: gcc -o display-buttons -lgpm display-buttons.c * ********/ /* * This client is connects to gpm and displays the following values until * it is killed by control+c: * * left/middle/right button * time: when packet was recievesd * dtime: delta to the last packet * */ #include /* write, read, open */ #include /* strtol() */ #include /* printf() */ #include /* time() */ #include /* errno */ #include /* gpm information */ /* display resulting data */ int display_data(Gpm_Event *event, void *data) { static time_t last = 0; time_t now = time(NULL); int delta; delta = now - last; last = now; /* display time, delta time */ printf("[%d] delta: %ds",now,delta); /* display mouse information */ printf(": p=%d, l=%1d, m=%1d, r=%1d, clicks=%d\n", event->type & GPM_DOWN, event->buttons & GPM_B_LEFT, event->buttons & GPM_B_MIDDLE, event->buttons & GPM_B_RIGHT, event->clicks); return 0; } int main(int argc, char **argv) { int vc; /* argv: console number */ Gpm_Connect conn; /* connection to gpm */ fd_set fds; /* select virtual console, 0 if not set */ vc = (argc == 2) ? strtol(argv[1],NULL,10) : 0; conn.eventMask = GPM_DRAG | GPM_DOWN | GPM_UP; conn.defaultMask = ~GPM_HARD; /* inverted GPM_HARD mask */ conn.minMod = 0; conn.maxMod = ~0; if(Gpm_Open(&conn,vc) == -1) { printf("Cannot connect to gpm!\n"); return 1; } if(gpm_fd == -2) { printf("I must be run on the console\n"); return 1; } printf("\tp=pressed (0=release)\n\tl=left\n\tm=middle\n\tr=right\n"); while(1) { /* read data */ FD_ZERO(&fds); FD_SET(gpm_fd, &fds); if (select(gpm_fd+1, &fds, 0, 0, 0) < 0 && errno == EINTR) continue; if (FD_ISSET(gpm_fd, &fds)) { Gpm_Event evt; if (Gpm_GetEvent(&evt) > 0) { display_data(&evt, NULL); } else { printf("Gpm_GetEvent failed\n"); } } } Gpm_Close(); /* close connection */ return 0; } gpm-1.20.4/src/prog/display-coords.c010060000017500001750000000060361101736502100160530ustar00niconico00/* * display-coords.c - a very simple gpm client * * Copyright 2007-2008 Nico Schottelius * * 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. * * Compile and link with: gcc -o display-coords -lgpm display-coords.c * ********/ /* * This client is connects to gpm and displays the following values until * it is killed by control+c: * * x/y coords on the screen * dx, dy: deltas * time: when packet was recievesd * dtime: delta to the last packet * */ #include /* write, read, open */ #include /* strtol() */ #include /* printf() */ #include /* time() */ #include /* errno */ #include /* gpm information */ /* display resulting data */ int display_data(Gpm_Event *event, void *data) { static time_t last = 0; time_t now = time(NULL); int delta; delta = now - last; last = now; /* display time, delta time */ printf("[%d] delta: %ds",now,delta); /* display mouse information */ printf(": x=%2i, y=%2i, dx=%2i, dy=%2i\n", event->x, event->y, event->dx, event->dy); return 0; } int main(int argc, char **argv) { int vc; /* argv: console number */ Gpm_Connect conn; /* connection to gpm */ fd_set fds; /* select virtual console, 0 if not set */ vc = (argc == 2) ? strtol(argv[1],NULL,10) : 0; conn.eventMask = GPM_MOVE; /* read only moves */ conn.defaultMask = ~GPM_HARD; /* inverted GPM_HARD mask */ conn.minMod = 0; conn.maxMod = ~0; if(Gpm_Open(&conn,vc) == -1) { printf("Cannot connect to gpm!\n"); return 1; } if(gpm_fd == -2) { printf("I must be run on the console\n"); return 1; } while(1) { /* read data */ FD_ZERO(&fds); FD_SET(gpm_fd, &fds); if (select(gpm_fd+1, &fds, 0, 0, 0) < 0 && errno == EINTR) continue; if (FD_ISSET(gpm_fd, &fds)) { Gpm_Event evt; if (Gpm_GetEvent(&evt) > 0) { display_data(&evt, NULL); } else { printf("Gpm_GetEvent failed\n"); } } } Gpm_Close(); /* close connection */ return 0; } gpm-1.20.4/src/prog/gpm-root.y010060000017500001750000001150711101736502100147110ustar00niconico00/* * gpm-root.y - a default-handler for mouse events (gpm-Linux) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * * Tue, 5 Jan 1999 23:16:45 +0000, modified by James Troup : * (get_winsize): use /dev/tty0 not /dev/console. * gpm-root.y (f.debug): disable undocumented f.debug function because it uses a * file in /tmp in a fashion which invites symlink abuse. * * 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. ********/ %{ #include #include #include #include #include #include #include #include #include #include #include #include /* sigaction() */ #include /* pwd entries */ #include /* initgroups() */ #include /* KDGETMODE */ #include /* fstat() */ #include /* uname() */ #include /* winsize */ #include /* OPEN_MAX */ #include /* VT_ACTIVATE */ #include /* K_SHIFT */ #include #include #ifdef HAVE_SYS_SYSMACROS_H #include #else #define major(dev) (((unsigned) (dev))>>8) #define minor(dev) ((dev)&0xff) #endif #define GPM_NULL_DEV "/dev/null" #ifdef HAVE_LINUX_MAJOR_H #include #else #define VCS_MAJOR 7 #endif #define MAX_NR_USER_CONSOLES 63 /* needs __KERNEL__ */ #include "headers/message.h" #include "headers/gpm.h" #ifdef DEBUG #define YYDEBUG 1 #else #undef YYDEBUG #endif #define USER_CFG ".gpm-root" #define SYSTEM_CFG SYSCONFDIR "/gpm-root.conf" #define DEFAULT_FORE 7 #define DEFAULT_BACK 0 #define DEFAULT_BORD 7 #define DEFAULT_HEAD 7 /* These macros are useful to avoid curses. The program is unportable anyway */ #define GOTOXY(f,x,y) fprintf(f,"\x1B[%03i;%03iH",y,x) #define FORECOLOR(f,c) fprintf(f,"\x1B[%i;3%cm",(c)&8?1:22,colLut[(c)&7]+'0') #define BACKCOLOR(f,c) fprintf(f,"\x1B[4%cm",colLut[(c)&7]+'0') /* These defines are ugly hacks but work */ #define ULCORNER 0xc9 #define URCORNER 0xbb #define LLCORNER 0xc8 #define LRCORNER 0xbc #define HORLINE 0xcd #define VERLINE 0xba int colLut[]={0,4,2,6,1,5,3,7}; char *prgname; char *consolename; int run_status = GPM_RUN_STARTUP; struct winsize win; int disallocFlag=0; struct node {char *name; int flag;}; struct node tableMod[]= { {"shift", 1< T_STRING %token T_BACK T_FORE T_BORD T_HEAD %token T_BRIGHT T_COLOR T_NAME %token T_BUTTON %token T_FUNC T_FUN2 %type bright button %type menu file %type item items itemlist %% /* begin grammar #########################################################*/ file: /* empty */ {$$=cfgall=NULL;} | file button menu {$3->buttons=$2; $3->next=$1; $$=cfgall=$3;} ; button: T_BUTTON '1' {$$=GPM_B_LEFT;} | T_BUTTON '2' {$$=GPM_B_MIDDLE;} | T_BUTTON '3' {$$=GPM_B_RIGHT;} ; menu: '{' {$$=cfgcurrent=cfg_alloc();} configs itemlist '}' {$$=$2; $$->menu=$4;} ; configs: /* empty */ | configs cfgpair ; cfgpair: T_NAME T_STRING {cfgcurrent->title=$2;} | T_BACK T_COLOR {cfgcurrent->back=$2;} | T_FORE bright T_COLOR {cfgcurrent->fore=$3|$2;} | T_BORD bright T_COLOR {cfgcurrent->bord=$3|$2;} | T_HEAD bright T_COLOR {cfgcurrent->head=$3|$2;} ; bright: /* empty */ {$$=0;} | T_BRIGHT {$$=8;} ; itemlist: item items {$$=cfg_cat($1,$2);} ; items: /* empty */ {$$=NULL;} | items item {$$= $1 ? cfg_cat($1,$2) : $2;} ; item: T_STRING T_FUNC {$$=cfg_makeitem('F',$1,$2, NULL);} | T_STRING T_FUN2 T_STRING {$$=cfg_makeitem('2',$1,$2, $3);} | T_STRING menu {$$=cfg_makeitem('M',$1,NULL,$2);} ; %% /* end grammar ###########################################################*/ int yyerror(char *s) { fprintf(stderr,"%s:%s(%i): %s\n",prgname,cfgname,cfglineno,s); return 1; } int yywrap() { return 1; } struct tokenName { char *name; int token; int value; }; struct tokenName tokenList[] = { {"foreground",T_FORE,0}, {"background",T_BACK,0}, {"border", T_BORD,0}, {"head", T_HEAD,0}, {"name", T_NAME,0}, {"button", T_BUTTON,0}, {"black", T_COLOR,0}, {"blue", T_COLOR,1}, {"green", T_COLOR,2}, {"cyan", T_COLOR,3}, {"red", T_COLOR,4}, {"magenta", T_COLOR,5}, {"yellow", T_COLOR,6}, {"white", T_COLOR,7}, {"bright", T_BRIGHT,0}, {NULL,0,0} }; struct funcName { char *name; int token; int (*fun)(); }; struct funcName funcList[] = { {"f.debug",T_FUNC,f_debug}, {"f.fgcmd",T_FUN2,f_fgcmd}, {"f.bgcmd",T_FUN2,f_bgcmd}, {"f.jptty",T_FUN2,f_jptty}, {"f.mktty",T_FUNC,f_mktty}, {"f.menu",T_FUNC,f_menu}, {"f.lock",T_FUN2,f_lock}, /* "lock one", "lock all" */ {"f.load",T_FUNC,f_load}, {"f.free",T_FUNC,f_free}, {"f.time",T_FUNC,f_time}, {"f.pipe",T_FUN2,f_pipe}, {"f.nop",T_FUNC,NULL}, {NULL,0,NULL} }; /*---------------------------------------------------------------------*/ int yylex(void) { int c,i; char s[80]; struct tokenName *tn; struct funcName *fn; while(1) { i=0; switch(c=getc(cfgfile)) { case EOF: fclose(cfgfile); return 0; case '\"': do { s[i]=getc(cfgfile); if ((s[i])=='\n') { yyerror("unterminated string"); cfglineno++; } if (s[i]=='\\') s[i]=getc(cfgfile); } /* get '"' as '\"' */ while (s[i++]!='\"' && s[i-2] !='\\') ; s[i-1]=0; yylval.string=(char *)strdup(s); return T_STRING; case '#': while ( (c=getc(cfgfile)!='\n') && c!=EOF) ; case '\n': cfglineno++; case ' ': /* fall through */ case '\t': continue; default: if (!isalpha(c)) return(c); } /* get a single word and convert it */ do { s[i++]=c; } while (isalnum(c=getc(cfgfile)) || c=='.'); ungetc(c,cfgfile); s[i]=0; for (tn=tokenList; tn->name; tn++) if (tn->name[0]==s[0] && !strcmp(tn->name,s)) { yylval.silly=tn->value; return tn->token; } for (fn=funcList; fn->name; fn++) if (fn->name[0]==s[0] && !strcmp(fn->name,s)) { yylval.fun=fn->fun; return fn->token; } yylval.string=(char *)strdup(s); return T_STRING; } } /*---------------------------------------------------------------------*/ void cfg_free(Draw *what) { Draw *ptr; DrawItem *item; for (ptr=what; ptr; ptr=ptr->next) { if (ptr->title) free(ptr->title); for (item=ptr->menu; item; item=item->next) { if (item->name) free(item->name); if (item->arg) free(item->arg); if (item->type=='M' && item->clientdata) { ((Draw *)(item->clientdata))->next=NULL; /* redundant */ cfg_free(item->clientdata); } if (item->clientdata) free(item->clientdata); } } } /*---------------------------------------------------------------------*/ /* malloc an empty Draw */ Draw *cfg_alloc(void) { Draw *new=calloc(1,sizeof(Draw)); if (!new) return NULL; new->back=DEFAULT_BACK; new->fore=DEFAULT_FORE; new->bord=DEFAULT_BORD; new->head=DEFAULT_HEAD; return new; } /*---------------------------------------------------------------------*/ /* malloc an empty DrawItem and fill it */ DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail) { DrawItem *new=calloc(1,sizeof(DrawItem)); if (!new) return NULL; new->name=(char *)strdup(msg); new->type=mode; switch(mode) { case '2': /* a function with one arg */ new->arg=(char *)strdup(detail); /* fall through */ case 'F': /* a function without args */ new->fun=fun; if (fun) fun(F_CREATE,new); break; case 'M': new->clientdata=detail; new->fun=f_menu; break; default: fprintf(stderr,"%s: unknown item type (can't happen)\n",prgname); } return new; } /*---------------------------------------------------------------------*/ /* concatenate two item lists */ DrawItem *cfg_cat(DrawItem *d1, DrawItem *d2) { DrawItem *tmp; for (tmp=d1; tmp->next; tmp=tmp->next) ; tmp->next=d2; return d1; } /*====================================================================*/ void f__fix(struct passwd *pass) { if (setgid(pass->pw_gid) < 0 || initgroups(pass->pw_name, pass->pw_gid) < 0 || setuid(pass->pw_uid) < 0) exit(1); setenv("HOME", pass->pw_dir, 1); setenv("LOGNAME", pass->pw_name,1); setenv("USER", pass->pw_name,1); } /*---------------------------------------------------------------------*/ static int f_debug_one(FILE *f, Draw *draw) { DrawItem *ip; static int tc=0; int i; #define LINE(args) for(i=0;ibuttons,draw->width,draw->height)); LINE((f,"UID %i\n",draw->uid)); LINE((f,"fore %i - back %i\n",draw->fore,draw->back)); LINE((f,"bord %i - head %i\n",draw->bord,draw->head)); LINE((f,"---> \"%s\" %li\n",draw->title,(long)(draw->mtime))); for (ip=draw->menu; ip; ip=ip->next) { LINE((f," %i \"%s\" (%p)\n",ip->type,ip->name,ip->fun)); if (ip->fun == f_menu) { tc++; f_debug_one(f,(Draw *)ip->clientdata); tc--; } } #undef LINE return 0; } int f_debug(int mode, DrawItem *self, int uid) { #if 0 /* Disabled on account of security concerns; the way * "/tmp/root-debug" is used is gratuitously * open to symlink abuse */ FILE *f; Draw *dp; switch (mode) { case F_POST: if (!(f=fopen("/tmp/root-debug","a"))) return 1; for(dp=drawList; dp; dp=dp->next) f_debug_one(f,dp); fprintf(f,"\n\n"); fclose(f); case F_CREATE: case F_INVOKE: break; } #endif /* 0 */ return 0; } /*---------------------------------------------------------------------*/ int f_fgcmd(int mode, DrawItem *self, int uid) { switch (mode) { case F_CREATE: case F_POST: break; case F_INVOKE: ; /* MISS */ } return 0; } /*---------------------------------------------------------------------*/ int f_bgcmd(int mode, DrawItem *self, int uid) { int i; struct passwd *pass; switch (mode) { case F_CREATE: case F_POST: break; case F_INVOKE: switch(fork()) { case -1: gpm_report(GPM_PR_ERR, "fork(): %s", strerror(errno)); return 1; case 0: pass=getpwuid(uid); if (!pass) exit(1); f__fix(pass); /* setgid(), setuid(), setenv(), ... */ close(0); close(1); close(2); open("/dev/null",O_RDONLY); /* stdin */ open(consolename,O_WRONLY); /* stdout */ dup(1); /* stderr */ int open_max = sysconf(_SC_OPEN_MAX); if (open_max == -1) open_max = 1024; for (i=3;iarg,(char *)NULL); exit(1); /* shouldn't happen */ default: return 0; } } return 0; } /*---------------------------------------------------------------------*/ int f_jptty(int mode, DrawItem *self, int uid) { int i,fd; switch (mode) { case F_CREATE: case F_POST: break; case F_INVOKE: i=atoi(self->arg); fd=open(consolename,O_RDWR); if (fd<0) { gpm_report(GPM_PR_ERR, "%s: %s",consolename, strerror(errno)); return 1; } /*if*/ if (ioctl(fd, VT_ACTIVATE, i)<0) { gpm_report(GPM_PR_ERR, "%s: %s", consolename,strerror(errno)); return 1; } /*if*/ if (ioctl(fd, VT_WAITACTIVE, i)<0) { gpm_report(GPM_PR_ERR, "%s: %s", consolename,strerror(errno)); return 1; } default: return 0; } return 0; /* silly gcc -Wall */ } /*---------------------------------------------------------------------*/ /* This array registers spawned consoles */ static int consolepids[1+MAX_NR_USER_CONSOLES]; int f_mktty(int mode, DrawItem *self, int uid) { int fd, pid; int vc; char name[10]; switch (mode) { case F_CREATE: self->arg=malloc(8); case F_POST: break; case F_INVOKE: fd=open(consolename,O_RDWR); if (fd<0) { gpm_report(GPM_PR_ERR,"%s: %s",consolename, strerror(errno)); return 1; } /*if*/ if (ioctl(fd, VT_OPENQRY, &vc)<0) { gpm_report(GPM_PR_ERR, "%s: %s",consolename, strerror(errno)); return 1; } /*if*/ switch(pid=fork()) { case -1: gpm_report(GPM_PR_ERR, "fork(): %s", strerror(errno)); return 1; case 0: /* child: exec getty */ sprintf(name,"tty%i",vc); execl("/sbin/mingetty","mingetty",name,(char *)NULL); exit(1); /* shouldn't happen */ default: /* father: jump to the tty */ gpm_report(GPM_PR_INFO,"Registering child %i on console %i" ,pid,vc); consolepids[vc]=pid; sprintf(self->arg,"%i",vc); return f_jptty(mode,self,uid); } default: return 0; } return 0; } /*---------------------------------------------------------------------*/ int f_menu(int mode, DrawItem *self, int uid) { return 0; /* just a placeholder, recursion is performed in main() */ } /*---------------------------------------------------------------------*/ int f_lock(int mode, DrawItem *self, int uid) { #if 0 /* some kind of interesting ...: if never */ int all; static DrawItem msg = { 0, 10, "Enter your password to unlock", NULL, NULL, NULL, NULL }; static Draw switch (mode) { case F_CREATE: /* either "one" or anything else */ if (strcmp(self->arg,"one")) self->arg[0]='a'; case F_POST: break; case F_INVOKE: /* the biggest of all... */ } #endif return 0; } /*---------------------------------------------------------------------*/ int f_load(int mode, DrawItem *self, int uid) { FILE *f; double l1,l2,l3; l1=l2=l3=0.0; switch (mode) { case F_CREATE: /* modify name, just to fake its length */ self->clientdata=malloc(strlen(self->name)+20); self->name=realloc(self->name,strlen(self->name)+20); strcpy(self->clientdata,self->name); strcat(self->clientdata," %5.2f %5.2f %5.2f"); sprintf(self->name,self->clientdata,l1,l2,l3); break; case F_POST: if (!(f=fopen("/proc/loadavg","r"))) return 1; fscanf(f,"%lf %lf %lf",&l1,&l2,&l3); sprintf(self->name,self->clientdata,l1,l2,l3); fclose(f); case F_INVOKE: break; } return 0; } /*---------------------------------------------------------------------*/ int f_free(int mode, DrawItem *self, int uid) { FILE *f; long l1,l2; char s[80]; l1=l2=0; switch (mode) { case F_CREATE: /* modify name, just to fake its length */ self->clientdata=malloc(strlen(self->name)+30); self->name=realloc(self->name,strlen(self->name)+30); strcpy(self->clientdata,self->name); strcat(self->clientdata," %5.2fM mem + %5.2fM swap"); sprintf(self->name,self->clientdata,(double)l1,(double)l2); break; case F_POST: if (!(f=fopen("/proc/meminfo","r"))) return 1; fgets(s,80,f); fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l1); fgets(s,80,f); sscanf(s,"%*s %*s %*s %li",&l2); sprintf(self->name,self->clientdata, (double)l1/1024/1024,(double)l2/1024/1024); fclose(f); case F_INVOKE: break; } return 0; } /*---------------------------------------------------------------------*/ int f_time(int mode, DrawItem *self, int uid) { char s[128]; struct tm *broken; time_t t; time(&t); broken=localtime(&t); switch (mode) { case F_CREATE: /* modify name, just to fake its length */ self->clientdata=self->name; strftime(s,110,self->clientdata,broken); strcat(s,"1234567890"); /* names can change length */ self->name=(char *)strdup(s); /* rewrite the right string */ strftime(self->name,110,self->clientdata,broken); break; case F_POST: strftime(self->name,120,self->clientdata,broken); case F_INVOKE: break; } return 0; } /*---------------------------------------------------------------------*/ int f_pipe(int mode, DrawItem *self, int uid) { return 0; } /*====================================================================*/ int fixone(Draw *ptr, int uid) { int hei,wid; DrawItem *item; ptr->uid=uid; hei=0; wid= ptr->title? strlen(ptr->title)+2 : 0; /* calculate width and height */ for (item=ptr->menu; item; item=item->next) { hei++; wid= wid > strlen(item->name) ? wid : strlen(item->name); } ptr->height=hei+2; ptr->width=wid+2; /* fix paddings and recurse */ for (item=ptr->menu; item; item=item->next) { item->pad=(ptr->width-strlen(item->name ? item->name : ""))/2; if (item->fun==f_menu) fixone((Draw *)item->clientdata,uid); } return 0; } /* read menus from a file, and return a list or NULL */ Draw *cfg_read(int uid) { Draw *ptr; if (!(cfgfile=fopen(cfgname,"r"))) { gpm_report(GPM_PR_ERR, "%s: %s", cfgname, strerror(errno)); return NULL; } gpm_report(GPM_PR_INFO,"Reading file %s",cfgname); cfglineno=1; if (yyparse()) { cfg_free(cfgall); cfgall=NULL; return NULL; } /* handle recursion */ for (ptr=cfgall; ptr; ptr=ptr->next) { fixone(ptr,uid); } return cfgall; } /*---------------------------------------------------------------------*/ /* the return value tells whether it has been newly loaded or not */ int getdraw(int uid, int buttons, time_t mtime1, time_t mtime2) { struct passwd *pass; struct stat buf; Draw *new, *np, *op, *pp; int retval=0; time_t mtime; gpm_report(GPM_PR_DEBUG,"getdraw: %i %i %li %li",uid,buttons,mtime1,mtime2); pass=getpwuid(uid); /* deny personal cfg to root for security reasons */ if (pass==NULL || !uid || !opt_user) { mtime=mtime2; uid=-1; strcpy(cfgname,SYSTEM_CFG); } else { mtime=mtime1; strcpy(cfgname,pass->pw_dir); strcat(cfgname,"/" USER_CFG); } if (stat(cfgname,&buf)==-1) { gpm_report(GPM_PR_DEBUG,"stat (%s) failed",cfgname); /* try the system wide */ mtime=mtime2; uid = -1; strcpy(cfgname,SYSTEM_CFG); if (stat(cfgname,&buf)==-1) { gpm_report(GPM_PR_ERR,"stat (%s) failed",cfgname); return 0; } } if (buf.st_mtime <= mtime) return 0; /* else, read the new drawing tree */ new=cfg_read(uid); if (!new) return 0; /* scan old data to remove duplicates */ for (np=pp=new; np; pp=np, np=np->next) { np->mtime=buf.st_mtime; if (np->buttons==buttons) retval++; for (op=drawList; op; op=op->next) if (op->uid==np->uid && op->buttons==np->buttons) op->buttons=0; /* mark for deletion */ } /* chain in */ pp->next=drawList; drawList=new; /* actually remove fake entries */ for (np=drawList; np; pp=np, np=np->next) if (!np->buttons) { pp->next=np->next; np->next=NULL; cfg_free(np); np=pp; } return retval; /* found or not */ } /*---------------------------------------------------------------------*/ Draw *retrievedraw(int uid, int buttons) { Draw *drawPtr, *genericPtr=NULL; /* retrieve a drawing by scanning the list */ do { for (drawPtr=drawList; drawPtr; drawPtr=drawPtr->next) { if (drawPtr->uid==uid && drawPtr->buttons==buttons) break; if (drawPtr->uid==-1 && drawPtr->buttons==buttons) genericPtr=drawPtr; } } while (getdraw(uid,buttons, drawPtr ? drawPtr->mtime : 0, genericPtr ? genericPtr->mtime :0)); return drawPtr ? drawPtr : genericPtr; } /*=====================================================================*/ int usage(void) { printf( GPM_MESS_VERSION "\n" "Usage: %s [options]\n",prgname); printf(" Valid options are\n" " -m modifier to use\n" " -u inhibit user configuration files\n" " -D don't auto-background and run as daemon\n" " -V increase amount of logged messages\n" ); return 1; } /*------------*/ int getmask(char *arg, struct node *table) { int last=0, value=0; char *cur; struct node *n; if (isdigit(arg[0])) return atoi(arg); while (1) { while (*arg && !isalnum(*arg)) arg++; /* skip delimiters */ cur=arg; while(isalnum(*cur)) cur++; /* scan the word */ if (!*cur) last++; *cur=0; for (n=table;n->name;n++) if (!strcmp(n->name,arg)) { value |= n->flag; break; } if(!n->name) fprintf(stderr,"%s: Incorrect flag \"%s\"\n",prgname,arg); if (last) break; cur++; arg=cur; } return value; } /*------------*/ int cmdline(int argc, char **argv) { int opt; run_status = GPM_RUN_STARTUP; while ((opt = getopt(argc, argv,"m:uDV::")) != -1) { switch (opt) { case 'm': opt_mod=getmask(optarg, tableMod); break; case 'u': opt_user=0; break; case 'D': run_status = GPM_RUN_DEBUG; break; case 'V': /*gpm_debug_level += (0==optarg ? 1 : strtol(optarg,0,0)); */ break; default: return 1; } } return 0; } /*------------* * This buffer is passed to set_selection, and the only meaningful value * is the last one, which is the mode: 4 means "clear_selection". * however, the byte just before the 1th short must be 2 which denotes * the selection-related stuff in ioctl(TIOCLINUX). */ static unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4}; static unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1; /*------------*/ static inline void scr_dump(int fd, FILE *f, unsigned char *buffer, int vc) { int dumpfd; char dumpname[20]; sprintf(dumpname,"/dev/vcsa%i",vc); dumpfd=open(dumpname,O_RDONLY); if (dumpfd<0) { gpm_report(GPM_PR_ERR,"%s: %s", dumpname, strerror(errno)); return; } /*if*/ clear_sel_arg[0]=2; /* clear_selection */ ioctl(fd,TIOCLINUX,clear_sel_arg); read(dumpfd,buffer,4); read(dumpfd,buffer+4,2*buffer[0]*buffer[1]); close(dumpfd); } /*------------*/ static inline void scr_restore(int fd, FILE *f, unsigned char *buffer, int vc) { int x,y, dumpfd; char dumpname[20]; x=buffer[2]; y=buffer[3]; /* WILL NOT WORK WITH DEVFS! FIXME! */ sprintf(dumpname,"/dev/vcsa%i",vc); dumpfd=open(dumpname,O_WRONLY); if (dumpfd<0) { gpm_report(GPM_PR_ERR,"%s: %s", dumpname, strerror(errno)); return; } /*if*/ clear_sel_arg[0]=2; /* clear_selection */ ioctl(fd,TIOCLINUX,clear_sel_arg); write(dumpfd,buffer,4+2*buffer[0]*buffer[1]); close(dumpfd); } /*===================================================================*/ /* post and unpost menus from the screen */ static int postcount; static Posted *activemenu; #if __BYTE_ORDER == __BIG_ENDIAN #define bigendian 1 #else #define bigendian 0 #endif Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int y, int console) { Posted *new; DrawItem *item; unsigned char *dump; unsigned char *curr, *curr2; int i; short lines,columns; new=calloc(1,sizeof(Posted)); if (!new) return NULL; new->draw=draw; new->dump=dump=malloc(opt_buf); scr_dump(fd,f,dump,console); lines=dump[0]; columns=dump[1]; i=(columns*dump[3]+dump[2])*2+1; /* where to get it */ if (i<0) i=1; new->colorcell=dump[4+i-bigendian]; gpm_report(GPM_PR_DEBUG,"Colorcell=%02x (at %i,%i = %i)", new->colorcell,dump[2],dump[3],i-bigendian); /* place the box relative to the mouse */ if (!postcount) x -= draw->width/2; else x+=2; y++; /* fit inside the screen */ if (x<1) x=1; if (x+draw->width >= columns) x=columns-1-draw->width; if (y+draw->height > lines+1) y=lines+1-draw->height; new->x=x; new->X=x+draw->width-1; new->y=y; new->Y=y+draw->height-1; /* these definitions are dirty hacks, but they help in writing to the screen */ #if __BYTE_ORDER == __BIG_ENDIAN #define PUTC(c,f,b) (*(curr++)=((b)<<4)+(f),*(curr++)=(c)) #else #define PUTC(c,f,b) (*(curr++)=(c),*(curr++)=((b)<<4)+(f)) #endif #define PUTS(s,f,b) for(curr2=s;*curr2;PUTC(*(curr2++),f,b)) #define GOTO(x,y) (curr=dump+4+2*((y)*columns+(x))) x--; y--; /* /dev/vcs is zero based */ ioctl(fd,TCXONC,TCOOFF); /* inhibit further prints */ dump=malloc(opt_buf); memcpy(dump,new->dump,opt_buf); /* dup the buffer */ /* top border */ GOTO(x,y); PUTC(ULCORNER,draw->bord,draw->back); for (i=0; iwidth; i++) PUTC(HORLINE,draw->bord,draw->back); PUTC(URCORNER,draw->bord,draw->back); if (draw->title) { GOTO(x+(draw->width-strlen(draw->title))/2,y); PUTC(' ',draw->head,draw->back); PUTS(draw->title,draw->head,draw->back); PUTC(' ',draw->head,draw->back); } /* sides and items */ for (item=draw->menu; y++, item; item=item->next) { if (item->fun) (*(item->fun))(F_POST,item); GOTO(x,y); PUTC(VERLINE,draw->bord,draw->back); for (i=0;ipad;i++) PUTC(' ',draw->fore,draw->back); PUTS(item->name,draw->fore,draw->back); i+=strlen(item->name); while (i++width) PUTC(' ',draw->fore,draw->back); PUTC(VERLINE,draw->bord,draw->back); } /* bottom border */ GOTO(x,y); PUTC(LLCORNER,draw->bord,draw->back); for (i=0; iwidth; i++) PUTC(HORLINE,draw->bord,draw->back); PUTC(LRCORNER,draw->bord,draw->back); scr_restore(fd,f,dump,console); free(dump); #undef PUTC #undef PUTS #undef GOTO new->prev=activemenu; activemenu=new; postcount++; return new; } Posted *unpostmenu(int fd, FILE *f, Posted *which, int vc) { Posted *prev=which->prev; scr_restore(fd,f,which->dump, vc); ioctl(fd,TCXONC,TCOON); /* activate the console */ free(which->dump); free(which); activemenu=prev; postcount--; return prev; } void reap_children(int signo) { int i, pid; pid=wait(&i); gpm_report(GPM_PR_INFO,"pid %i exited %i",pid,i); if (disallocFlag) gpm_report(GPM_PR_INFO,"Warning, overriding logout from %i",disallocFlag); for (i=1;i<=MAX_NR_USER_CONSOLES; i++) if (consolepids[i]==pid) { disallocFlag=i; consolepids[i]=0; gpm_report(GPM_PR_INFO,"Registering disallocation of console %i",i); break; } } void get_winsize(void) { int fd; if ((fd=open(consolename,O_RDONLY))<0) { fprintf(stderr,"%s: ",prgname); perror(consolename); exit(1); } ioctl(fd, TIOCGWINSZ, &win); opt_buf=win.ws_col*win.ws_row; close(fd); opt_buf +=4; /* 2:size, 1:terminator, 1:alignment */ opt_buf*=2; /* the new scrdump and /dev/vcsa returns color info as well */ } /*===================================================================*/ static int do_resize=0; #if defined(__GLIBC__) __sighandler_t winchHandler(int errno); #else /* __GLIBC__ */ void winchHandler(int errno); #endif /* __GLIBC__ */ int main(int argc, char **argv) { Gpm_Connect conn; Gpm_Event ev; int vc, fd=-1 ,uid=-1; FILE *f=NULL; struct stat stbuf; Draw *draw=NULL; DrawItem *item; char s[80]; int posty = 0, postx, postX; struct sigaction childaction; int evflag; int recursenow=0; /* not on first iteration */ prgname=argv[0]; consolename = Gpm_get_console(); setuid(0); /* if we're setuid, force it */ if (getuid()) { fprintf(stderr,"%s: Must be root\n", prgname); exit(1); } /* * Now, first of all we need to check that /dev/vcs is there. * But only if the kernel is new enough. vcs appeared in 1.1.82. * If an actual open fails, a message on syslog will be issued. */ { struct utsname linux_info; int v1,v2,v3; struct stat sbuf; if (uname(&linux_info)) { fprintf(stderr,"%s: uname(): %s\n",prgname,strerror(errno)); exit(1); } sscanf(linux_info.release,"%d.%d.%d",&v1,&v2,&v3); if (v1*1000000 + v2*1000 +v3 < 1001082) { fprintf(stderr,"%s: can't run with linux < 1.1.82\n",prgname); exit(1); } /* problems with devfs! FIXME! */ if (stat("/dev/vcs0",&sbuf)<0 && stat("/dev/vcs",&sbuf)<0) { fprintf(stderr,"%s: /dev/vcs0: %s\n",prgname,strerror(errno)); fprintf(stderr,"%s: do you have vcs devices? Refer to the manpage\n", prgname); exit(1); } else if (!S_ISCHR(sbuf.st_mode) || VCS_MAJOR != major(sbuf.st_rdev) || 0 != minor(sbuf.st_rdev)) { fprintf(stderr,"Your /dev/vcs device looks funny\n"); fprintf(stderr,"Refer to the manpage and possibly run the" "create_vcs script in gpm source directory\n"); exit(1); } } if (cmdline(argc,argv)) exit(usage()); openlog(prgname, LOG_PID|LOG_CONS, run_status == GPM_RUN_DAEMON ? LOG_DAEMON : LOG_USER); /* reap your zombies */ childaction.sa_handler=reap_children; #if defined(__GLIBC__) __sigemptyset(&childaction.sa_mask); #else /* __GLIBC__ */ childaction.sa_mask=0; #endif /* __GLIBC__ */ childaction.sa_flags=SA_INTERRUPT; /* need to break the select() call */ sigaction(SIGCHLD,&childaction,NULL); /*....................................... Connect and get your buffer */ conn.eventMask=GPM_DOWN; conn.defaultMask=GPM_MOVE; /* only ctrl-move gets the default */ conn.maxMod=conn.minMod=opt_mod; gpm_zerobased=1; for (vc=4; vc-->0;) { extern int gpm_tried; /* liblow.c */ gpm_tried=0; /* to enable retryings */ if (Gpm_Open(&conn,-1)!=-1) break; if (vc) sleep(2); } if (!vc) { gpm_report(GPM_PR_OOPS,"can't open mouse connection"); } conn.eventMask=~0; /* grab everything away form selection */ conn.defaultMask=GPM_MOVE & GPM_HARD; conn.minMod=0; conn.maxMod=~0; chdir("/"); get_winsize(); /*....................................... Go to background */ if (run_status != GPM_RUN_DEBUG) { switch(fork()) { case -1: gpm_report(GPM_PR_OOPS,"fork()"); /* error */ case 0: run_status = GPM_RUN_DAEMON; break; /* child */ default: _exit(0); /* parent */ } /* redirect stderr to /dev/console -- avoided now. we should really cleans this more up! */ fclose(stdin); fclose(stdout); if (!freopen(GPM_NULL_DEV,"w",stderr)) { gpm_report(GPM_PR_OOPS,"freopen(stderr)"); } if (setsid()<0) gpm_report(GPM_PR_OOPS,"setsid()"); } /*if*/ /*....................................... Loop */ while((evflag=Gpm_GetEvent(&ev))!=0) { if (do_resize) {get_winsize(); do_resize--;} if (disallocFlag) { struct utmp *uu; struct utmp u; char s[8]; int i=0; gpm_report(GPM_PR_INFO,"Disallocating %i",disallocFlag); ioctl(fileno(stdin),VT_DISALLOCATE,&i); /* all of them */ sprintf(s,"tty%i",disallocFlag); setutent(); strncpy(u.ut_line, s, sizeof(u.ut_line)); if ((uu = getutline(&u)) != 0) { uu->ut_type = DEAD_PROCESS ; pututline(uu); } disallocFlag=0; } if (evflag==-1) continue; /* no real event */ /* get rid of spurious events */ if (ev.type&GPM_MOVE) continue; vc=ev.vc; gpm_report(GPM_PR_DEBUG,"%s: event on console %i at %i, %i", prgname,ev.vc,ev.x,ev.y); if (!recursenow) /* don't open on recursion */ { sprintf(s,"/dev/tty%i",ev.vc); if (stat(s,&stbuf)==-1) continue; uid = stbuf.st_uid; gpm_report(GPM_PR_DEBUG,"uid = %i",uid); draw=retrievedraw(uid,ev.buttons); if (!draw) continue; if (stat(s,&stbuf)==-1 || !(f=fopen(s,"r+"))) /* used to draw */ { gpm_report(GPM_PR_ERR, "%s: %s", s, strerror(errno)); continue; } if ((fd=open(s,O_RDWR))<0) /* will O_RDONLY be enough? */ { gpm_report(GPM_PR_ERR, "%s: %s", s, strerror(errno)); exit(1); } /* now change your connection information and manage the console */ Gpm_Open(&conn,-1); uid=stbuf.st_uid; } /* the task now is drawing the box from user data */ if (!draw) { /* itz Thu Jul 2 00:02:53 PDT 1998 this cannot happen, see continue statement above?!? */ gpm_report(GPM_PR_ERR,"NULL menu ptr while drawing"); continue; } postmenu(fd,f,draw,ev.x,ev.y,vc); while(Gpm_GetEvent(&ev)>0 && ev.vc==vc) { Gpm_FitEvent(&ev); if (ev.type&GPM_DOWN) break; /* we're done */ Gpm_DrawPointer(ev.x,ev.y,fd); } gpm_report(GPM_PR_DEBUG,"%i - %i",posty,ev.y); /* ok, redraw, close and return waiting */ gpm_report(GPM_PR_DEBUG,"Active is %p",activemenu->draw); posty=activemenu->y; postx=activemenu->x; postX=activemenu->X; recursenow=0; item=NULL; /* by default */ posty=ev.y-posty; if (postx<=ev.x && ev.x<=postX) /* look for it */ { for (item=draw->menu; posty-- && item; item=item->next) gpm_report(GPM_PR_DEBUG,"item %s (%p)",item->name, item->fun); if (item && item->fun && item->fun==f_menu) { recursenow++; draw=item->clientdata; continue; } } /* unpost them all */ while (unpostmenu(fd,f,activemenu,vc)) ; close(fd); fclose(f); Gpm_Close(); recursenow=0; /* just in case... */ /* invoke the item */ if (item && item->fun) (*(item->fun))(F_INVOKE,item,uid); } /*....................................... Done */ while (Gpm_Close()) ; /* close all the stack */ exit(0); } /* developers chat: * author1 (possibly alessandro): "This is because Linus uses 4-wide tabstops, forcing me to use the same default to manage kernel sources" * ian zimmermann (alias itz) on Wed Jul 1 23:28:13 PDT 1998: "I don't mind what anybody's physical tab size is, but when I load it into the editor I don't want any wrapping lines." * nico schottelius (january 2002): "Although Linux document /usr/src/linux/Documentation/CodingStyle is mostly correct, I agree with itz to avoid wrapping lines. Merging 4(alessandro) /2(itz) spaces makes 3 which is the current standard." */ /* Local Variables: */ /* tab-width:3 */ /* c-indent-level: 3 */ /* End: */ gpm-1.20.4/src/prog/hltest.c010060000017500001750000000331601101736502100144200ustar00niconico00/* * hltest.c - a demo program for the high-level library. * * Copyright 1995 rubini@linux.it (Alessandro Rubini) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include #include #include #include #include #include #include #include #include #include #include #include "headers/gpm.h" #ifndef min #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) #endif /* * If you happen to read this source to get insights about mouse * management, note that most of this file is concerned with user * interface and screen handling. The mouse-related part begines * at "MOUSE-BEGIN" (so you can use your editor capabilities to * look for strings). * * If you use parts of this program in your own one, I'd like some credit. * If you want to overcome the gnu copyleft though using parts of this * program, just tell me about it, and I'll change the copyright. */ /* this is used as clientdata */ typedef struct WinInfo { char color; int number; short hei,wid; Gpm_Roi *roi; } WinInfo; WinInfo left_cldata; /* for the msg bar */ int colors[]={0x40,0x60,0x20,0x30,0x47,0x67,0x27,0x37}; #define NR_COLORS 8 #define LEFTWID 22 /* Dirty: use escape sequences and /dev/vcs (don't want to learn curses) */ #define CLEAR (printf("\x1b[H\x1b[J"),fflush(stdout)) int dev_vcs=-1; int wid,hei,vcsize; /* * These two functions are only involved in the user interface: * dump and restore the screen to keep things up to date. */ unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4}; unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1; static inline int scrdump(char *buf) { clear_sel_arg[0]=2; /* clear_selection */ ioctl(fileno(stdin),TIOCLINUX,clear_sel_arg); lseek (dev_vcs, 0, SEEK_SET); return read(dev_vcs,buf,vcsize); } static inline int scrrestore(char *buf) { clear_sel_arg[0]=2; /* clear_selection */ ioctl(fileno(stdin),TIOCLINUX,clear_sel_arg); lseek (dev_vcs, 0, SEEK_SET); return write(dev_vcs,buf,vcsize); } /* I don't like curses, so I'm doing low level stuff here */ static void raw(void) { struct termios it; tcgetattr(fileno(stdin),&it); it.c_lflag &= ~(ICANON); it.c_lflag &= ~(ECHO); it.c_iflag &= ~(INPCK|ISTRIP|IXON); it.c_oflag &= ~(OPOST); it.c_cc[VMIN] = 1; it.c_cc[VTIME] = 0; tcsetattr(fileno(stdin),TCSANOW,&it); } static void noraw(void) { struct termios it; tcgetattr(fileno(stdin),&it); it.c_lflag |= ICANON; it.c_lflag |= ECHO; it.c_iflag |= IXON; it.c_oflag |= OPOST; tcsetattr(fileno(stdin),TCSANOW,&it); } /* this one is the signal handler */ void killed(int signo) { CLEAR; fprintf(stderr,"hltest: killed by signal %i\r\n",signo); noraw(); exit(0); } char *dumpbuf; char *dumpbuf_clean; #define DUMPCHAR(x,y) (dumpbuf+4+2*((y)*wid+(x))) #define DUMPATTR(x,y) (dumpbuf+5+2*((y)*wid+(x))) /* * This function draws one window on top of the others */ static inline int drawwin(Gpm_Roi *which) { char *curr; char name[5]; #define GOTO(x,y) (curr=DUMPCHAR(x,y)) #define PUTC(c,a) (*(curr++)=(c),*(curr++)=a) #define ULCORNER 0xc9 #define URCORNER 0xbb #define LLCORNER 0xc8 #define LRCORNER 0xbc #define HORLINE 0xcd #define VERLINE 0xba int attrib=((WinInfo *)which->clientdata)->color; int i,j; /* top border */ GOTO(which->xMin,which->yMin); PUTC(ULCORNER,attrib); for (i=which->xMin+1; ixMax; i++) PUTC(HORLINE,attrib); PUTC(URCORNER,attrib); /* sides and items */ for (j=which->yMin+1;jyMax;j++) { GOTO(which->xMin,j); PUTC(VERLINE,attrib); for (i=which->xMin+1; ixMax; i++) PUTC(' ',attrib); PUTC(VERLINE,attrib); } /* bottom border */ GOTO(which->xMin,which->yMax); PUTC(LLCORNER,attrib); for (i=which->xMin+1; ixMax; i++) PUTC(HORLINE,attrib); PUTC(LRCORNER,attrib); /* name */ sprintf(name,"%3i",((WinInfo *)which->clientdata)->number); GOTO(which->xMin+1,which->yMin+1); for (i=0;name[i];i++) PUTC(name[i],attrib); return 0; } /* and finally, draw them all (recursive) */ int drawthemall(Gpm_Roi *this) { if (this->next) drawthemall(this->next); else memcpy(dumpbuf,dumpbuf_clean,vcsize); return drawwin(this); } /* * This one writes all the messages in the right position */ int newmsg(int window, char *msg) { static char *data=NULL; static char **strings; static int current, last; static time_t t; int i,j; /* first time, alloc material */ if (!data) { data=malloc((LEFTWID-2)*(hei-2)); strings=malloc(hei*sizeof(char *)); if(!data || !strings) { perror("malloc()"); exit(1); } memset(data,' ',(LEFTWID-2)*(hei-2)); for (i=0;inumber; int delta; if (ePtr->type&GPM_ENTER) { newmsg(number,"enter"); return 0; } if (ePtr->type&GPM_LEAVE) { newmsg(number,"leave"); return 0; } if (ePtr->type&GPM_MOVE) { newmsg(number,"move"); return 0; } if (ePtr->type&GPM_DOWN) {newmsg(number,"press"); return 0; } if (ePtr->type&GPM_DRAG) { newmsg(number,"drag"); if (!(ePtr->buttons&GPM_B_LEFT)) return 0; /* * Implement window motion */ delta=0; if (ePtr->dx < 0) delta=max(ePtr->dx,LEFTWID-info->roi->xMin); else if (ePtr->dx > 0) delta=min(ePtr->dx,wid-1 - info->roi->xMax); if (delta) { info->roi->xMin+=delta; info->roi->xMax+=delta; } delta=0; if (ePtr->dy < 0) delta=max(ePtr->dy,0 - info->roi->yMin); else if (ePtr->dy > 0) delta=min(ePtr->dy,hei-1 - info->roi->yMax); if (delta) { info->roi->yMin+=delta; info->roi->yMax+=delta; } Gpm_RaiseRoi(info->roi,NULL); dorefresh(); return 0; } newmsg(number,"release"); /* * "up" events can be double or triple, * moreover, they can happen out of the region */ if (!(ePtr->type&GPM_SINGLE)) return 0; if (ePtr->x<0 || ePtr->y<0) return 0; if (ePtr->x>info->wid-1 || ePtr->y>info->hei-1) return 0; /* * Ok, it is has been a double click, and it is within our area */ switch(ePtr->buttons) { case GPM_B_LEFT: Gpm_RaiseRoi(info->roi,NULL); break; case GPM_B_MIDDLE: Gpm_LowerRoi(info->roi,NULL); break; case GPM_B_RIGHT: Gpm_PopRoi(info->roi); free(info); break; } dorefresh(); return 0; } /* * the following function creates a window, with the four corners as * specified by the arguments. */ int wincreate(int x, int y, int X, int Y) { static int winno=0; Gpm_Roi*roi; WinInfo *cldata; int tmp; if (X=wid) X=wid-1; if (Y>=hei) Y=hei-1; if (xmaxMod=0; /* put a backpointer */ cldata->roi=roi; /* init the window */ winno++; cldata->number=winno; cldata->color=colors[winno%NR_COLORS]; cldata->wid=X-x+1; cldata->hei=Y-y+1; dorefresh(); return 0; } /* * This extra handler is only used for the background and left bar */ int xhandler(Gpm_Event *ePtr, void *clientdata) { static int x=0,y=0; int back=0; char msg[32]; msg[0]='\0'; if (ePtr->type==GPM_MOVE) return 0; if (!clientdata) strcpy(msg,"bg"),back++; if (ePtr->type&GPM_DOWN) { strcat(msg," down"); if (back) x=ePtr->x,y=ePtr->y; } if (ePtr->type&GPM_UP) { strcat(msg," up"); if (back) wincreate(x,y,ePtr->x,ePtr->y); } newmsg(0,msg); /* GPM_DRAWPOINTER(ePtr); useless, gpm_visiblepointer is set to 1 BUG */ return 0; } /*============================================================ MOUSE-END */ /* * This function is not interesting, it is only involved in setting up * things. The real work has already been done. */ int main(int argc, char **argv) { Gpm_Connect conn; char *s, t[4]; char devname[32]; /* very secure buffer ... */ int c; int vc; struct winsize win; if (argc>1) { fprintf(stderr,"%s: This program is meant to be interactive, " "no option is needed\n",argv[0]); exit(1); } if (!(s=ttyname(fileno(stdin)))) { perror("stdin"); exit(1); } /* retrieve everything */ conn.eventMask=~0; conn.defaultMask=GPM_MOVE|GPM_HARD; conn.maxMod=~0; conn.minMod=0; if (sscanf(s,"/dev/tty%d%s",&vc,t)!=1) { if (sscanf(s,"/dev/vc/%d%s",&vc,t)!=1) { fprintf(stderr,"stdin: not a system console\n"); exit(1); } } /* open your dump/restore buffers */ sprintf(devname,"/dev/vcs%i",vc); if ((dev_vcs=open(devname,O_RDWR))<0) { perror(devname); sprintf(devname,"/dev/vcc/%i",vc); if ((dev_vcs=open(devname,O_RDWR))<0) { perror(devname); exit(1); } } if (Gpm_Open(&conn,0) == -1) { fprintf(stderr,"%s: Can't open mouse connection\n",argv[0]); exit(1); } Gpm_Close(); /* don't be clubbered by events now */ signal(SIGWINCH,killed); /* don't handle winchange */ signal(SIGINT,killed); /* control-C kills us */ CLEAR; printf("\t\t\t This program is a demonstration of the use of the\n" "\t\t\t high level gpm library. It is a tiny application\n" "\t\t\t not really useful, but you may be interested in\n" "\t\t\t reading the source (as well as the docs).\n\n" "\t\t\tWorkings:\n" "\t\t\t You can create windows by clicking on the background\n" "\t\t\t and dragging out the desired size (minimun is 5x3).\n" "\t\t\t The first 20 columns are reserved for messages.\n" "\t\t\t there is always one invisible window on the backgruond\n" "\t\t\t which gets shift-mouse events. All the others are only\n" "\t\t\t sensitive to mouse-only events (the library leaves you\n" "\t\t\t free about that, but this program makes things simple\n" "\n" "\t\t\t The left button raises the window\n" "\t\t\t The middle (if any) lowers the window\n" "\t\t\t The right one destroys the window\n\n" "\t\t\t Keyboard focus is changed by mouse motion\n" "\t\t\t Control-C kills the program\n\n" "\t\t\tEnjoy\n\t\t\t The Author\n\n" ); /* Ok, now retrieve window info, go to raw mode, and start it all */ ioctl(fileno(stdin), TIOCGWINSZ, &win); wid=win.ws_col; hei=win.ws_row; vcsize=hei*wid*2+4; dumpbuf=malloc(vcsize); dumpbuf_clean=malloc(vcsize); if (!dumpbuf || ! dumpbuf_clean) { perror("malloc()"); exit(1); } scrdump(dumpbuf_clean); gpm_zerobased=1; gpm_visiblepointer=1; if (Gpm_Open(&conn,0)==-1) { fprintf(stderr,"%s: Can't open mouse connection\n",argv[0]); exit(1); } /* Prepare the leftish roi, and the catch-all on the background */ left_cldata.color=0x07; left_cldata.number=0; left_cldata.hei=hei; left_cldata.wid=LEFTWID; Gpm_PushRoi(0,0,LEFTWID-1,hei-1, GPM_DOWN|GPM_DRAG|GPM_UP|GPM_ENTER|GPM_LEAVE, xhandler,&left_cldata); gpm_roi_handler=xhandler; gpm_roi_data=NULL; raw(); newmsg(0,NULL); /* init data structures */ while((c=Gpm_Getchar())!=EOF) { char s[32]; Gpm_Roi *roi; roi=gpm_current_roi; sprintf(s,"0x%x",c); if (c>0x1f && c<0x7f) sprintf(s+strlen(s)," ('%c')",c); newmsg(roi ? ((WinInfo *)roi->clientdata)->number : 0,s); } noraw(); exit(0); } gpm-1.20.4/src/prog/mev.c010060000017500001750000000345061101736502100137110ustar00niconico00/* * mev.c - simple client to print mouse events (gpm-Linux) * * Copyright 1994,1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ /* * This client is meant to be used both interactively to check * that gpm is working, and as a background process to convert gpm events * to textual strings. I'm using it to handle Linux mouse * events to emacs * */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* to use KG_SHIFT and so on */ #define ALL_KEY_MODS ((1<type, event->x, event->y, event->dx, event->dy, event->buttons, event->modifiers); if (event->type & (GPM_DRAG|GPM_DOWN)) { if (0 != opt_pointer) { GPM_DRAWPOINTER(event); } /*if*/ } /*if*/ return 0; } /*-------------------------------------------------------------------*/ int emacs_handler(Gpm_Event *event, void *data) { int i,j; static int dragX, dragY; static char buffer[64]; /* itz Mon Mar 23 20:54:54 PST 1998 emacs likes the modifier bits in alphabetical order, so I'll use a lookup table instead of a loop; it is faster anyways */ /* static char *s_mod[]={"S-","M-","C-","M-",NULL}; */ static char *s_mod[] = { "", /* 000 */ "S-", /* 001 */ "M-", /* 002 */ "M-S-", /* 003 */ "C-", /* 004 */ "C-S-", /* 005 */ "C-M-", /* 006 */ "C-M-S-", /* 007 */ /* idea: maybe we should map AltGr to Emacs Alt instead of Meta? */ "M-", /* 010 */ "M-S-", /* 011 */ "M-", /* 012 */ "M-S-", /* 013 */ "C-M-", /* 014 */ "C-M-S-", /* 015 */ "C-M-", /* 016 */ "C-M-S-", /* 017 */ }; /* itz Mon Mar 23 08:23:14 PST 1998 what emacs calls a `drag' event is our `up' event with coordinates different from the `down' event. What gpm calls `drag' is just `mouse-movement' to emacs. */ static char *s_type[]={"mouse-movement", "mouse-movement","down-mouse-","mouse-",NULL}; static char *s_button[]={"3","2","1",NULL}; static char *s_multi[]={"double-", "triple-", 0}; static char s_count[]="23"; char count = '1'; struct timeval tv_cur; long timestamp; static long dragTime; /* itz Mon Mar 23 08:27:53 PST 1998 this flag is needed because even if the final coordinates of a drag are identical to the initial ones, it is still a drag if there was any movement in between. Sigh. */ static int dragFlag = 0; gettimeofday(&tv_cur, 0); timestamp = ((short)tv_cur.tv_sec) * 1000 + (tv_cur.tv_usec / 1000); if (opt_fit) Gpm_FitEvent(event); buffer[0]=0; /* itz Sun Mar 22 19:09:04 PST 1998 Emacs doesn't understand modifiers on motion events. */ if (!(event->type & (GPM_MOVE|GPM_DRAG))) { /* modifiers */ strcpy(buffer, s_mod[event->modifiers & ALL_KEY_MODS]); /* multiple */ for (i=0, j=GPM_DOUBLE; s_multi[i]; i++, j<<=1) if (event->type & j) { count = s_count[i]; strcat(buffer,s_multi[i]); } /*if*/ } /*if*/ if (event->type & GPM_DRAG) { dragFlag = 1; } /*if*/ /* itz Mon Mar 23 08:26:33 PST 1998 up-event after movement is a drag. */ if ((event->type & GPM_UP) && dragFlag) { strcat(buffer, "drag-"); } /*if*/ /* type */ for (i=0, j=GPM_MOVE; s_type[i]; i++, j<<=1) if (event->type & j) strcat(buffer,s_type[i]); /* itz Sun Mar 22 19:09:04 PST 1998 Emacs doesn't understand modifiers on motion events. */ if (!(event->type & (GPM_MOVE|GPM_DRAG))) /* button */ for (i=0, j=GPM_B_RIGHT; s_button[i]; i++, j<<=1) if (event->buttons & j) strcat(buffer,s_button[i]); if ((event->type & GPM_UP) && dragFlag) { printf("(%s ((%i . %i) %ld) %c ((%i . %i) %ld))\n", buffer, event->x, event->y, timestamp, count, dragX, dragY, dragTime); } else if (event->type & (GPM_DOWN|GPM_UP)) { printf("(%s ((%i . %i) %ld) %c)\n", buffer, event->x, event->y, timestamp, count); } else if (event->type & (GPM_MOVE|GPM_DRAG)) { printf("(%s ((%i . %i) %ld))\n", buffer, event->x, event->y, timestamp); } /*if*/ if (event->type & GPM_DOWN) { dragX=event->x; dragY=event->y; dragTime=timestamp; dragFlag = 0; } /*if*/ if (event->type & (GPM_DRAG|GPM_DOWN)) { if (0 == opt_pointer) { GPM_DRAWPOINTER(event); } /*if*/ } /*if*/ return 0; } /*===================================================================*/ int usage(void) { //printf( "(" GPM_NAME ") " GPM_RELEASE ", " GPM_DATE "\n" printf( "(" GPM_NAME ") , " GPM_DATE "\n" "Usage: %s [options]\n",prgname); printf(" Valid options are\n" " -C choose virtual console (beware of it)\n" " -d choose the default mask\n" " -e choose the eventMask\n" " -E emacs-mode\n" " -i accept commands from stdin\n" " -f fit drag events inside the screen\n" " -m minimum modifier mask\n" " -M maximum modifier mask\n" " -p show pointer while dragging\n" " -u user-mode (default)\n" ); return 1; } /*===================================================================*/ #define PARSE_EVENTS 0 #define PARSE_MODIFIERS 1 void getmask(char *arg, int which, int* where) { int last=0, value=0; char *cur; struct node *table, *n; int mode = 0; /* 0 = set, 1 = add, 2 = subtract */ if ('+' == arg[0]) { mode = 1; ++arg; } else if ('-' == arg[0]) { mode = 2; ++arg; } if (isdigit(arg[0])) { switch(mode) { case 0: *where = atoi(arg); break; case 1: *where |= atoi(arg); break; case 2: *where &= ~atoi(arg); break; } /*switch*/ return; } /*if*/ table= (PARSE_MODIFIERS == which) ? tableMod : tableEv; while (1) { while (*arg && !isalnum(*arg)) arg++; /* skip delimiters */ cur=arg; while(isalnum(*cur)) cur++; /* scan the word */ if (!*cur) last++; *cur=0; for (n=table;n->name;n++) if (!strcmp(n->name,arg)) { value |= n->flag; break; } if (!n->name) fprintf(stderr,"%s: Incorrect flag \"%s\"\n",prgname,arg); if (last) break; cur++; arg=cur; } switch(mode) { case 0: *where = value; break; case 1: *where |= value; break; case 2: *where &= ~value; break; } /*switch*/ } /*===================================================================*/ int cmdline(int argc, char **argv, char *options) { int opt; while ((opt = getopt(argc, argv, options)) != -1) { switch (opt) { /* itz Tue Mar 24 17:11:52 PST 1998 i hate options that do too much. Made them orthogonal. */ case 'C': sscanf(optarg,"%x",&opt_vc); break; case 'd': getmask(optarg, PARSE_EVENTS, &opt_default); break; case 'e': getmask(optarg, PARSE_EVENTS, &opt_mask); break; case 'E': opt_emacs = 1; break; case 'i': opt_intrct=1; break; case 'f': opt_fit=1; break; case 'm': getmask(optarg, PARSE_MODIFIERS, &opt_minMod); break; case 'M': getmask(optarg, PARSE_MODIFIERS, &opt_maxMod); break; case 'p': opt_pointer =1; break; case 'u': opt_emacs=0; break; default: return 1; } } return 0; } void do_snapshot() { Gpm_Event event; int i=Gpm_GetSnapshot(&event); char *s; if (-1 == i) { fprintf(stderr,"Warning: cannot get snapshot!\n"); fprintf(stderr,"Have you run \"configure\" and \"make install\"?\n"); return; } /*if*/ fprintf(stderr,"Mouse has %d buttons\n",i); fprintf(stderr,"Currently sits at (%d,%d)\n",event.x,event.y); fprintf(stderr,"The window is %d columns by %d rows\n",event.dx,event.dy); s=Gpm_GetLibVersion(&i); fprintf(stderr,"The library is version \"%s\" (%i)\n",s,i); s=Gpm_GetServerVersion(&i); fprintf(stderr,"The daemon is version \"%s\" (%i)\n",s,i); fprintf(stderr,"The current console is %d, with modifiers 0x%02x\n", event.vc,event.modifiers); fprintf(stderr,"The button mask is 0x%02X\n",event.buttons); } /*===================================================================*/ int interact(char *cmd) /* returns 0 on success and !=0 on error */ { Gpm_Connect conn; int argc=0; char *argv[20]; if (*cmd && cmd[strlen(cmd)-1]=='\n') cmd[strlen(cmd)-1]='\0'; if (!*cmd) return 0; /* * Interaction is accomplished by building an argv and passing it to * cmdline(), to use the same syntax used to invoke the program */ while (argc<19) { while(isspace(*cmd)) cmd++; argv[argc++]=cmd; while (*cmd && isgraph(*cmd)) cmd++; if (!*cmd) break; *cmd=0; cmd++; } argv[argc]=NULL; if (!strcmp(argv[0],"pop")) { return (Gpm_Close()==0 ? 1 : 0); /* a different convention on ret values */ } /*if*/ if (!strcmp(argv[0],"info")) { fprintf(stderr,"The stack of connection info is %i depth\n",gpm_flag); return 0; } /*if*/ if (!strcmp(argv[0],"quit")) { exit(0); } /*if*/ if (!strcmp(argv[0],"snapshot")) { do_snapshot(); return 0; } /*if*/ optind=0; /* scan the entire line */ if (strcmp(argv[0],"push") || cmdline(argc,argv,"d:e:m:M:")) { fprintf(stderr,"Syntax error in input line\n"); return 0; } /*if*/ conn.eventMask=opt_mask; conn.defaultMask=opt_default; conn.maxMod=opt_maxMod; conn.minMod=opt_minMod; if (Gpm_Open(&conn,opt_vc)==-1) { fprintf(stderr,"%s: Can't open mouse connection\r\n",argv[0]); return 1; } return 0; } /*===================================================================*/ int main(int argc, char **argv) { Gpm_Connect conn; char cmd[128]; Gpm_Handler* my_handler; /* not the real gpm handler! */ fd_set readset; prgname=argv[0]; if (cmdline(argc,argv,"C:d:e:Efim:M:pu")) exit(usage()); gpm_zerobased = opt_emacs; conn.eventMask=opt_mask; conn.defaultMask=opt_default; conn.maxMod=opt_maxMod; conn.minMod=opt_minMod; if (Gpm_Open(&conn,opt_vc) == -1) { gpm_report(GPM_PR_ERR,"%s: Can't open mouse connection\n",prgname); exit(1); } else if (gpm_fd == -2) { gpm_report(GPM_PR_OOPS,"%s: use rmev to see gpm events in xterm or rxvt\n",prgname); } gpm_report(GPM_PR_DEBUG,"STILL RUNNING_1"); my_handler= opt_emacs ? emacs_handler : user_handler; /* itz Sun Mar 22 09:51:33 PST 1998 needed in case the output is a pipe */ setvbuf(stdout, 0, _IOLBF, 0); setvbuf(stdin, 0, _IOLBF, 0); while(1) { /* forever */ FD_ZERO(&readset); FD_SET(gpm_fd, &readset); if (opt_intrct) { FD_SET(STDIN_FILENO, &readset); } if (select(gpm_fd+1, &readset, 0, 0, 0) < 0 && errno == EINTR) continue; if (FD_ISSET(STDIN_FILENO, &readset)) { if (0 == fgets(cmd, sizeof(cmd), stdin) || interact(cmd)) { exit(0); /* ^D typed on input */ } /*if*/ } /*if*/ if (FD_ISSET(gpm_fd, &readset)) { Gpm_Event evt; if (Gpm_GetEvent(&evt) > 0) { my_handler(&evt, 0); } else { fprintf(stderr, "mev says : Oops, Gpm_GetEvent()\n"); } } /*if*/ } /*while*/ /*....................................... Done */ while (Gpm_Close()); /* close all the stack */ exit(0); } gpm-1.20.4/src/prog/mouse-test.c010060000017500001750000000540321101736502100152230ustar00niconico00/* * mouse-test.c * * Copyright 1995 rubini@linux.it (Alessandro Rubini) * Copyright (C) 1998 Ian Zimmerman * Copyright (C) 2002-2008 Nico Schottelius * * Tue, 5 Jan 1999 23:15:23 +0000, modified by James Troup : * (main): exclude devices with a minor number of 130 from * the device probe to avoid causing spontaneous reboots on machines * where watchdog is used. Reported by Jim Studt * [Debian bug report #22602] * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ /* This code is horrible. Browse it at your risk */ /* hmm..read worse code before :) -nicos */ #include #include #include #include #include #include #include #include #include #include #include #include #include "headers/message.h" /* to print */ #include "headers/gpmInt.h" /* to get mouse types */ #include "headers/daemon.h" /* FIXME: do not use that..rewrite mouse-test, anyway */ #ifndef min #define min(a,b) ((a)>(b)?(b):(a)) #define max(a,b) ((a)>(b)?(a):(b)) #endif /* this material is needed to pass options to mice.c */ struct mouse_features mymouse = { DEF_TYPE, DEF_DEV, DEF_SEQUENCE, DEF_BAUD, DEF_SAMPLE, DEF_DELTA, DEF_ACCEL, DEF_SCALE, DEF_SCALE /*scaley*/, DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP, (char *)NULL /* extra */, (Gpm_Type *)NULL, -1 /* fd */ }; /* and this is a workaroud */ struct winsize win; /* this too */ struct options option; struct mouse_features *which_mouse=&mymouse; char *progname; char *consolename; int devcount=0; int typecount=0; struct item { Gpm_Type *this; struct item *next; }; struct device { char *name; int fd; struct device *next; }; static int message(void) { printf("This program is designed to help you in detecting what type your\n" "mouse is. Please follow the instructions of this program. If you're\n" "bored before it is done, you can always press your 'Interrupt' key\n" "(usually Ctrl-C)\n\n"); printf("\t *** Remember: don't run any software which reads the mouse device\n" "\t *** while making this test. This includes \"gpm\"," "\"selection\", \"X\"\n\n"); printf("Note that this program is by no means complete, and its main role is\n" "to detect how does the middle button work on serial mice\n"); return 0; } /* I don't like curses, so I'm doing low level stuff here */ #define GOTOXY(f,x,y) fprintf(f,"\x1B[%03i;%03iH",y,x) /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ static void raw(void) { struct termios it; tcgetattr(fileno(stdin),&it); it.c_lflag &= ~(ICANON); it.c_lflag &= ~(ECHO); it.c_iflag &= ~(INPCK|ISTRIP|IXON); it.c_oflag &= ~(OPOST); it.c_cc[VMIN] = 1; it.c_cc[VTIME] = 0; tcsetattr(fileno(stdin),TCSANOW,&it); } /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ static void noraw(void) { struct termios it; tcgetattr(fileno(stdin),&it); it.c_lflag |= ICANON; it.c_lflag |= ECHO; it.c_iflag |= IXON; it.c_oflag |= OPOST; tcsetattr(fileno(stdin),TCSANOW,&it); } /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ void killed(int signo) { fprintf(stderr,"mouse-test: killed by signal %i\r\n",signo); noraw(); exit(0); } /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ struct device **gpm_makedev(struct device **current, char *name) { int fd; int modes; if ((fd=open(name,O_RDWR|O_NONBLOCK))==-1) { perror(name); return current; } modes = fcntl(fd, F_GETFL); if (0 > fcntl(fd, F_SETFL, modes & ~O_NONBLOCK)) { close(fd); perror(name); return current; } *current=malloc(sizeof(struct device)); if (!*current) gpm_report(GPM_PR_OOPS,"malloc()"); (*current)->name=strdup(name); if (!(*current)->name) gpm_report(GPM_PR_OOPS,"malloc()"); (*current)->fd=fd; (*current)->next=NULL; devcount++; return &((*current)->next); } Gpm_Type *(*I_serial)(int fd, unsigned short flags, struct Gpm_Type *type, int argc, char **argv); /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ int mousereopen(int oldfd, char *name, Gpm_Type *type) { int fd; if (!type) type=mice+1; /* ms */ close(oldfd); usleep(100000); fd=open(name,O_RDWR); if (fd < 0) gpm_report(GPM_PR_OOPS,name); (*I_serial)(fd,type->flags,type,1,&type->name); /* ms initialization */ return fd; } int noneofthem(void) { noraw(); printf("\n\nSomething went wrong, I didn't manage to detect your" "protocol\n\nFeel free to report your problems to the author\n"); exit(1); } #define CHECKFAIL(count) ((count)==0 && noneofthem()) /*************************************** * This is the most useful function in * the program: it build an array * of data characters in order to run * several protocols on the returned * data. */ int eventlist(int fd, char *buff, int buflen, int test, int readstep) { fd_set selSet, readySet; struct timeval to; int active=0; int pending; int got=0; FD_ZERO(&readySet); FD_SET(fd,&readySet); FD_SET(fileno(stdin),&readySet); to.tv_sec=to.tv_usec=0; switch(test) { case GPM_B_LEFT: printf("\r\nNow please press and release several times\r\n" "the left button of your mouse," " *** trying not to move it ***\r\n\r\n"); break; case GPM_B_MIDDLE: printf("\r\nNow please press and release several times\r\n" "the middle button of your mouse," " *** trying not to move it ***\r\n\r\n"); break; case 0: printf("\r\nNow please move the mouse around, without pressing any\r\n" "button. Move it both quickly and slowly\r\n\r\n"); break; default: printf("Unknown test to perform\r\n"); return -1; } printf("Press any key when you've done enough\r\n"); while(1) { selSet=readySet; if ((pending=select(fd+1,&selSet,NULL,NULL,&to)) < 0) continue; if (pending==0 && !active) { active++; to.tv_sec=10; continue; } if (pending==0) return got; /* timeout */ if (FD_ISSET(0,&selSet)) { getchar(); if (active) return got; } if (FD_ISSET(fd,&selSet)) { if (active) got+=read(fd,buff+got,readstep); else read(fd,buff,buflen); } if (got>buflen-readstep) readstep=buflen-got; if (readstep==0) got--,readstep++; /* overwrite last char forever */ to.tv_sec=30; } } /*----------------------------------------------------------------------------- Place the description here. -----------------------------------------------------------------------------*/ int main(int argc, char **argv) { struct item *list=NULL; struct item **nextitem; struct device *devlist=NULL; struct device **nextdev; Gpm_Type *cursor; int i, mousefd; char *mousename; #define BUFLEN 512 char buf[BUFLEN]; struct timeval timeout; fd_set checkSet; int pending, maxfd; int trial, readamount,packetsize,got; int baudtab[4]={1200,9600,4800,2400}; #define BAUD(i) (baudtab[(i)%4]) consolename = Gpm_get_console(); if (!isatty(fileno(stdin))) { fprintf(stderr,"%s: stdin: not a tty\n",argv[0]); exit(1); } progname=argv[0]; message(); /* init the list of possible devices */ for (nextdev=&devlist, i=1; iinit; /* the first one has I_serial */ signal(SIGINT,killed); /* control-C kills us */ raw(); /*====================================== First of all, detect the device */ trial=0; while (devcount > 1) { fd_set devSet, gotSet,savSet; struct device *cur; int gotthem; /* BUG */ /* Logitech initialization is not performed */ (which_mouse->opt_baud)=BAUD(trial); printf("\r\nTrying with %i baud\r\n",(which_mouse->opt_baud)); trial++; FD_ZERO(&devSet); FD_ZERO(&gotSet); FD_SET(fileno(stdin),&devSet); maxfd=fileno(stdin); printf("\r\n The possible device nodes are:\r\n"); for (nextdev=&devlist; *nextdev; nextdev=&((*nextdev)->next)) { printf("\t%s\r\n", (*nextdev)->name); FD_SET((*nextdev)->fd,&devSet); maxfd=max((*nextdev)->fd,maxfd); (*I_serial)((*nextdev)->fd,(mice+1)->flags,mice+1, 1, &(mice+1)->name); /* try ms mode */ } savSet=devSet; printf("\r\n\r\nI've still %i devices which may be your mouse,\r\n", devcount); printf("Please move the mouse. Press any key when done\r\n" " (You can specify your device name on cmdline, in order to\r\n" " avoid this step\r\n. Different baud rates are tried at " "different times\r\n"); timeout.tv_sec=10; /* max test time */ gotthem=0; while (1) { /* extract files from the list */ devSet=savSet; if ((pending=select(maxfd+1,&devSet,NULL,NULL,&timeout)) < 0) continue; if (pending==0 || FD_ISSET(fileno(stdin),&devSet)) { getchar(); break; } for (nextdev=&devlist; *nextdev; nextdev=&((*nextdev)->next)) if (FD_ISSET((*nextdev)->fd,&devSet)) { gotthem++; FD_CLR((*nextdev)->fd,&savSet); FD_SET((*nextdev)->fd,&gotSet); } } if (gotthem) for (nextdev=&devlist; *nextdev; /* nothing */ ) { cur=*nextdev; if (!FD_ISSET(cur->fd,&gotSet)) { printf("removing \"%s\" from the list\r\n",cur->name); *nextdev=cur->next; close(cur->fd); free(cur->name); free(cur); devcount--; } else { read(cur->fd,buf,80); /* flush */ nextdev=&(cur->next); /* follow list */ } } } /* devcount>1 */ mousefd=devlist->fd; mousename=devlist->name; free(devlist); printf("\r\nOk, so your mouse device is \"%s\"\r\n",mousename); /* now close and reopen it, complete with initialization */ (which_mouse->opt_baud)=BAUD(0); mousefd=mousereopen(mousefd,mousename,NULL); FD_ZERO(&checkSet); FD_SET(mousefd,&checkSet); FD_SET(fileno(stdin),&checkSet); maxfd=max(mousefd,fileno(stdin)); /*====================================== Identify mouse type */ /* init the list of possible types */ printf("\r\n\r\nThe possible mouse types are:\r\n"); for (nextitem=&list, cursor=mice; cursor->fun; cursor++) { if (cursor->absolute) continue; *nextitem=malloc(sizeof(struct item)); if (!*nextitem) gpm_report(GPM_PR_OOPS,"malloc()"); (*nextitem)->this=cursor; (*nextitem)->next=NULL; printf("\t%s",cursor->name); if (cursor->synonyms && cursor->synonyms[0]) printf(" (%s)",cursor->synonyms); printf("\r\n"); typecount++; nextitem=&((*nextitem)->next); } /*====================================== Packet size - first step */ printf("\r\nNow please press and release your left mouse button,\r\n" "one time only\r\n\r\n"); i=read(mousefd,buf,1); if (i==-1 && errno==EINVAL) readamount=3; else readamount=1; usleep(100000); #define REMOVETYPE(cur,reason) \ do { \ printf("\tRemoving type \"%s\" because of '%s'\r\n", \ (cur)->this->name,reason); \ (*nextitem)=(cur)->next; \ free(cur); \ typecount--; \ } while(0) for (nextitem=&list; *nextitem; /* nothing */) { struct item *cur=*nextitem; if (readamount!=cur->this->howmany) REMOVETYPE(cur,"different read() semantics"); else nextitem=&(cur->next); } read(mousefd,buf,BUFLEN); /* flush */ /*====================================== Packet size - second step */ printf("\r\nNow you will be asked to generate different kind of events,\r\n" "in order to understand what protocol is your mouse speaking\r\n"); if (readamount==1) readamount=10; /* * Otherwise, the packetsize is already known, but the different decoding * alghorithm allows for further refinement. */ packetsize=1; trial=0; while (packetsize==1) { int success3=0,success5=0; (which_mouse->opt_baud)=BAUD(trial); printf("\tBaud rate is %i\r\n",(which_mouse->opt_baud)); mousefd=mousereopen(mousefd,mousename,NULL); printf("\r\n==> Detecting the packet size\r\n"); got=eventlist(mousefd,buf,BUFLEN,GPM_B_LEFT,readamount); /* try three -- look at repeating arrays of 6 bytes */ for (i=0;i5 && success5==0) packetsize=3; if (success5>5 && success3==0) packetsize=5; if (packetsize==1) printf("\r\n ** Ambiguous, try again\r\n"); trial++; } /*====================================== Use that info to discard protocols */ for (nextitem=&list; *nextitem; /* nothing */) { struct item *cur=*nextitem; int packetheads=0; int match=0; Gpm_Event event; if (packetsize!=cur->this->packetlen) { REMOVETYPE(cur,"different packet lenght"); continue; } /* try to decode button press and release */ for (i=0;ithis->proto)[0]) == (cur->this->proto)[1]) && ((buf[i+1]&(cur->this->proto)[2]) == (cur->this->proto)[3]) ) { packetheads++; if ((*(cur->this->fun))(&event,buf+i)==-1) { packetheads--; continue; } i+=packetsize-1; /* skip packet */ if (event.dx || event.dy) continue; if (event.buttons==GPM_B_LEFT) match++; else if (event.buttons) match--; } } if (match<=0) { REMOVETYPE(cur,"incorrect button detected"); continue; } if (packetheadsthis->name); nextitem=&(cur->next); } /*====================================== It's all done? */ /* * At this point, msc, would be unique (and 3-button aware) due to the * packet size; sun,mm and ps2 would be unique due to the different * representation of buttons (and they usually are not dual mode). */ /* why checking and not using return value ??? */ CHECKFAIL(typecount); if (typecount==1) { noraw(); printf("\n\n\nWell, it seems like your mouse is already detected:\n" "it is on the device \"%s\", and speaks the protocol \"%s\"\n", mousename,list->this->name); exit(0); } /* * If it is in the "ms" family, however, three possibilities are still * there, and all of them depend on the middle button */ do { printf("\r\nYour mouse is one of the ms family, " "but do you have the middle button (y/n)? "); putchar(i=getchar()); printf("\r\n"); } while(i!='y' && i!='n'); if (i=='n') { noraw(); printf("\nThen, you should use the \"bare\" protocol on \"%s\"\n", mousename); exit(0); } /* * First trial: remove the "-t ms" extension if spurious buttons come in */ got=eventlist(mousefd,buf,BUFLEN,0,readamount); pending=0; for (nextitem=&list; *nextitem; /* nothing */) { struct item *cur=*nextitem; Gpm_Event event; /* try to decode button press and release */ for (i=0;ithis->proto)[0]) == (cur->this->proto)[1]) && ((buf[i+1]&(cur->this->proto)[2]) == (cur->this->proto)[3]) ) { if ((*(cur->this->fun))(&event,buf+i)==-1) continue; i+=packetsize-1; if (event.buttons) pending--; } } if (pending<0) { REMOVETYPE(cur,"spurious button reported"); continue; } printf("** type '%s' still possible\r\n",cur->this->name); nextitem=&(cur->next); } CHECKFAIL(typecount); /* * Second trial: look if it is one of the two mman ways (In the second * test, extended ms is caught as well */ printf("\r\n==> Looking for '-t mman'and enhanced ms\r\n"); mousefd=mousereopen(mousefd,mousename, mice /* mman */); got=eventlist(mousefd,buf,BUFLEN,GPM_B_MIDDLE,readamount); /* if it uses the 4-byte protocol, find it in a rude way */ for (pending=0,i=0;i 3) { noraw(); printf("\nYour mouse seems to be a 'mman' one on \"%s\" (%i matches)\n", mousename,pending); exit(0); } pending=0; for (nextitem=&list; *nextitem; /* nothing */) { struct item *cur=*nextitem; Gpm_Event event; /* try to decode button press and release */ for (i=0;ithis->proto)[0]) == (cur->this->proto)[1]) && ((buf[i+1]&(cur->this->proto)[2]) == (cur->this->proto)[3]) ) { if ((*(cur->this->fun))(&event,buf+i)==-1) continue; i+=packetsize-1; if (event.buttons && event.buttons!=GPM_B_MIDDLE) pending--; if (event.buttons==GPM_B_MIDDLE) pending++; } } if (pending<0) { REMOVETYPE(cur,"spurious button reported"); continue; } if (pending>3) { noraw(); printf("\nYour mouse seems to be a '%s' one on \"%s\" (%i matches)\n", cur->this->name,mousename,pending); exit(0); } printf("** type '%s' still possible\r\n",cur->this->name); nextitem=&(cur->next); } CHECKFAIL(typecount); /* * Then, try to toggle dtr and rts */ { int toggle[3]={TIOCM_DTR|TIOCM_RTS, TIOCM_DTR,TIOCM_RTS}; char *tognames[3]={"both","dtr","rts"}; char *Xtognames[3]={"'ClearDTR' and 'ClearRTS'","'ClearDTR'","'ClearRTS'"}; int alllines,lines, index; ioctl(mousefd, TIOCMGET, &alllines); printf("\r\nSome mice change protocol to three-buttons-aware if some\r\n" "\r\ncontrol lines are toggled after opening\r\n"); for (index=0;index<3;index++) { mousereopen(mousefd,mousename,NULL); lines = alllines & ~toggle[index]; ioctl(mousefd, TIOCMSET, &lines); printf("\r\n==> Trying with '-o %s'\r\n",tognames[index]); got=eventlist(mousefd,buf,BUFLEN,GPM_B_MIDDLE,readamount); /* if it uses the 5-byte protocol, find it in a rude way */ for (pending=0,i=0;i3) { noraw(); printf("\nYour mouse becomes a 3-buttons ('-t msc') one when\n" "gpm gets '-o %s' on it command line, and X gets\n" "%s in XF86Config\nThe device is \"%s\"", tognames[index],Xtognames[index],mousename); exit(0); } } } /* * still here? Then, the only resort is keeping the middle button * pressed while initializing the mouse */ printf("\r\nYour damned device doesn't respond to anything\r\n" "the only remaining possibility is to keep presses the middle\r\n" "button _while_the_mouse_is_being_opened. This is the worst thing\r\n" "ever thought after caps-lock-near-the-A\r\n"); printf("\r\nNow please press the middle button, and then press any key\r\n" "while keeping the button down. Wait to release it until the\r\n" "next message.\r\n"); getchar(); got=eventlist(mousefd,buf,BUFLEN,GPM_B_MIDDLE,readamount); /* if it uses the 5-byte protocol, find it in a rude way */ for (pending=0,i=0;i3) { noraw(); printf("\nWorked. You should keep the button pressed every time the\n" "computer boots, and run gpm in '-R' mode in order to ignore\n" "such hassle when starting X\n\nStill better, but a better mouse\n" "\nThe current mouse device is \"%s\"\n",mousename); exit(0); } noraw(); printf("\nI'm lost. Can't tell you how to use your middle button\n"); return 0; } gpm-1.20.4/src/prog/open_console.c010060000017500001750000000022431101736502100155760ustar00niconico00/* * general purpose mouse (gpm) * * Copyright (c) 2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. * ********/ #include "headers/message.h" /* messaging in gpm */ #include "headers/daemon.h" /* daemon internals */ #include int open_console(const int mode) { int fd; if ((fd = open(option.consolename, mode)) < 0) gpm_report(GPM_PR_OOPS, GPM_MESS_OPEN, option.consolename); return fd; } gpm-1.20.4/src/report.c010060000017500001750000000165531101736502100134700ustar00niconico00/* * selects where we should report to * TODO: - possibly include errno (%m) string in syslog * - njak ... someone should optimize this code and remove double * fragments.... (self) * * Copyright (c) 2001-2008 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #include /* NULL */ #include /* va_arg/start/... */ #include /* alloc & co. */ #include /* strlen/strcpy */ #include /* these three are */ #include /* needed for */ #include /* stat() */ #include "headers/gpmInt.h" #include "headers/message.h" #include "headers/daemon.h" /* FIXME: this is wrong; we need report fpr lib und daemon */ /* * gpm_report * * Destinations: * - syslog * - current console (/dev/vc/0 || /dev/tty0) * - system console (/dev/console) * - stdout * - stderr * * * Items in [] are alternatives, if first destination is not present. * * Startup Mode: * debug : - (ignore) * info : syslog/stdout * warn/err : syslog/stderr * oops : syslog/stderr [exit] * * Running Mode: (daemon) * debug : - (ignore) * info : syslog * warn : syslog+system console * err : syslog+system console+current console * oops : syslog/stderr [_exit] * * Debug Mode : * debug/warn/err: stderr * info : stdout * oops : stderr [exit] * * Client Mode: (to use with mouse-test etc. ; NON SERVER ) * debug/err/warn/info: like debugging mode! * */ void gpm_report(int line, char *file, int stat, char *text, ... ) { FILE *console = NULL; va_list ap, ap3; #ifdef HAVE_VSYSLOG va_list ap2; #endif va_start(ap,text); va_copy(ap3, ap); #ifdef HAVE_VSYSLOG va_copy(ap2, ap); #endif switch(option.run_status) { /******************** STARTUP *****************/ case GPM_RUN_STARTUP: switch(stat) { case GPM_STAT_INFO: #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); vsyslog(LOG_INFO | LOG_USER, text, ap2); #else fprintf(stderr,GPM_STRING_INFO); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); #endif break; case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); vsyslog(LOG_DAEMON | LOG_WARNING, text, ap2); #else fprintf(stderr,GPM_STRING_WARN); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); #endif break; case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #else fprintf(stderr,GPM_STRING_ERR); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); #endif break; case GPM_STAT_OOPS: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS); vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #endif fprintf(stderr,GPM_STRING_OOPS); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); exit(1); /* we should have a oops()-function,but this works,too*/ break; } break; /* startup sequence */ /******************** RUNNING *****************/ case GPM_RUN_DAEMON: switch(stat) { case GPM_STAT_INFO: #ifdef HAVE_VSYSLOG syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO); vsyslog(LOG_INFO | LOG_USER, text, ap2); #endif break; case GPM_STAT_WARN: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN); vsyslog(LOG_DAEMON | LOG_WARNING, text, ap2); #else if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_WARN); vfprintf(console,text,ap); fprintf(console,"\n"); fclose(console); } #endif break; case GPM_STAT_ERR: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR); vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #else if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); vfprintf(console,text,ap); fprintf(console,"\n"); fclose(console); } if((console = fopen(option.consolename,"a")) != NULL) { fprintf(console,GPM_STRING_ERR); vfprintf(console,text,ap3); fprintf(console,"\n"); fclose(console); } #endif break; case GPM_STAT_OOPS: #ifdef HAVE_VSYSLOG syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS); vsyslog(LOG_DAEMON | LOG_ERR, text, ap2); #endif fprintf(stderr,GPM_STRING_OOPS); vfprintf(stderr,text,ap); fprintf(stderr,"\n"); _exit(1); /* we are the fork()-child */ break; } break; /* running gpm */ /******************** DEBUGGING and CLIENT *****************/ case GPM_RUN_DEBUG: switch(stat) { case GPM_STAT_INFO: console = stdout; fprintf(console,GPM_STRING_INFO); break; case GPM_STAT_WARN: console = stderr; fprintf(console,GPM_STRING_WARN); break; case GPM_STAT_ERR: console = stderr; fprintf(console,GPM_STRING_ERR); break; case GPM_STAT_DEBUG: console = stderr; fprintf(console,GPM_STRING_DEBUG); break; case GPM_STAT_OOPS: console = stderr; fprintf(console,GPM_STRING_OOPS); break; } vfprintf(console,text,ap); fprintf(console,"\n"); if(stat == GPM_STAT_OOPS) exit(1); break; } /* switch for current modus */ va_end(ap); va_end(ap3); #ifdef HAVE_VSYSLOG va_end(ap2); #endif } /* gpm_report */ /* old interesting part from debuglog.c. * interesting, if you want to include ERRNO into syslog message * should possibly included again later...when sources are clean and * there is no doubled strrer(errno) #if(defined(HAVE_VSYSLOG) && defined(HAVE_SYSLOG)) static char fmt[] = ": %m"; char* buf = alloca(strlen(s)+sizeof(fmt)); strcpy(buf, s); strcat(buf, fmt); #endif */ gpm-1.20.4/src/synaptics.c010060000017500001750000003345631101736502100141760ustar00niconico00/* * synaptics.c - support for the synaptics serial and ps2 touchpads * * Copyright 1999 hdavies@ameritech.net (Henry Davies) * Geert Van der Plas provided the code to support * older Synaptics PS/2 touchpads. * * Synpatics Passthrough Support Copyright (C) 2002 Linuxcare Inc. * dkennedy@linuxcare.com (David Kennedy) * * 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. * ********/ /* ** Design/Goals ** I want to use the Synaptics Serial touchpad as a cursor device under ** Linux (gpm). With this device I want to support operations similar ** to those supported by the Synaptics WinDOS driver, and some others ** of my own devising. ** ** Features: ** Corner Clicks ** This recognizes taps on the touchpad in the corner(s) and ** translates them into specific actions. Initially I am looking ** at actions on the order of alternate button clicks. Other ** alternatives include drags and whatnot. ** Edge Extensions ** This recognizes that the finger has moved from the center region ** of the touchpad and dragged to the edge area. At which point ** I want to be able to extend the motion by automatically moving ** in the direction of the edge. ** Toss n Catch ** This recognizes a quick motion of the finger on the touchpad and ** uses that to define a velocity vector for the cursor. A tap ** on the touchpad at a later time catches (stops) the cursor. ** Tap n Drag ** A quick tap of the touchpad followed by finger motion on the ** touchpad initiates what would be a drag with a normal mouse ** type device. ** Pressure Sensitive Velocity ** The Synaptics touchpad indicates the touch pressure of the finger ** (really an interface area) this is used to accelerate the cursor ** motion. This can be used in the normal motion, Tap n Drag, or ** Edge Extension modes. In normal motion and Tap n Drag this may ** be awkward due to increased friction caused by the pressure. ** ** Parameters: ** search below for configuration constants */ /* Pebl - pebl@diku.dk 20/12/2001 08:06. ** ** I want to have more features :). Every touch pad (ps2 and serial) is now be ** supported according to STIG and every feature/capability is read. However ** there seems to be some very old serial touchpads that have an advanced ** mode not mentioned in STIG. ** ** ** Further I have added the following ** ** Emulation of scrolling ** The window drivers allow using the edge to emulate a wheel ** mouse. When putting the finger at the right edge, a movement up or ** down translates to wheel movement. Taking the finger to the ** top/button edge keeps the wheel turning. Lift the finger again to ** operate normally again. Another option is to do a toss scrolling. ** ** Stick attached to a synaptic touchpad (aka styk) ** Some touchpads have a stick "attached", so they share the same port. ** In absolute mode the stick protocol is a simple ps2 protocol, except ** it is sent in an absolute packet. (In relative mode both uses ps2) ** Some sticks send packets when pressed (different from moved), which ** will be reported as left button. ** ** 4 Way button attached to a touchpad ** Likewise some touchpads have a round button giving the choices of ** four way to press the button. The packet is nearly identical to the ** stick, turn off the stick if you have this button. This is no longer ** needed. The button can act as a mouse or as buttons which can be ** changed on the fly. The buttons can be configured just as the ** touchpads corners. ** ** Four buttons to work ** Some touchpads have 4 buttons. Only 3 was read and the last was set to ** up or down "button". They can be configured just as the ** touchpads corners. ** ** Multiple fingers ** I have added an option to detect such by looking at pressure levels, ** which is not that great. If the pad have the capability to detect it, ** this is used instead, but this far from optimal. It does detect two ** horizontal parted finger if in same vertical position, otherwise the ** detection is bad. This is/was a problem as my wrist lays on the ** laptop which gives a 45 deg to horizontal for my fingers. Now I try ** to add further detections, which works for me in 95% of the ** time. ** ** Multi finger tap ** Using 1,2 or 3 fingers to make a tap translates into left, right or ** middle button pressed. I originally thought about doing what is ** called a "HOP" where after a quick finger shift the distance of the ** hop decides which button is pressed. I dropped it partly because ** synaptics did in version 3.2 and because it was harder than I ** thought. Multifinger taps can be configured just as the touchpads corners. ** ** Multi finger less sensitive ** Adding or removing a finger or just accidently touch the pad with ** the palm while using the pad causes the pad to report the average ** position between the touched places. This of cause gives annoying ** erratic movements. When adding or removing fingers are detected ** the mouse is stop for some small time to avoid this. This is not ** perfect as the finger detection is not perfect, but it helps a lot! ** ** Palm detection ** Some touchpads tries to detect whether the reported data is from a ** palm or similar. When reading this signal the movement is ** stopped. Except the detection does not work very well :( ** ** ** Enabling/disabling touchpad ** A new corner action is to disable the touchpad. It is enabled again ** by tapping the same corner. This is useful if I know I am going ** to write a lot. The stick still works. ** ** Debugging corner action ** A corner action now allows toggling the debug information. ** ** ** The structure has changed to handle both serial and ps2 touchpads. Many ** variable names have changed. ** ** The documentation referred to is from ** "Synaptics TouchPad Interfacing Guide" revision 2.5 ** or just STIG ** **/ /* ** TODO ** - handle other versions of synaptics touchpads (mine is 3.4 firmware) ** (this should be close) ** - test this with more Synaptics touch pads (laptops and such) ** - provide a configuration interface to adjust parameters and ** enabled features ** - determine appropriate ranges for adjusting parameters ** ** TODO (pebl) ** - Two pads can not be used at the same time (internal/external) ** - Move a lot of the comments to a readme file. ** - Allow normal taps in unused corners. ** - Better detection of spontaneous reseting touchpad. ** - Implement resend command for serial connection. ** - Only start scrolling if mostly vertical movement. ** - Disable/enable command for serial touchpad. ** - Clean up the mess about extended packets with pressure 0. ** - source splitting of normal touchpad functions and synaptic specific and ** add other touchpads. */ /** ** Notation: ** A gesture means a motion or action that is not a regular mouse movement. ** ** Wmode is an absolute mode where no gesture is signaled by the touchpad, only ** supported on newer versions. ** ** variables *_enabled are use for enable behaviors that may not supported in ** the touchpad. ** ** Many variables have two counterparts (and some that dont should have): a ** *_time and *_packet, where the first is in msec and the latter is the same ** time converted to the number of packets, when using 80 packets per second. ** ** Variables: ** last_* is for last reviewed packet, not last reported/calculated movement/event. ** was_* is for last event, not necessary last packet. ** ** ** Data process line: ** ** syn_process_ps2_data ---- syn_translate_serial_data -- ----------------------------------------------- ** (handles also wmode) | | | ** | | V ** |- syn_preprocess_report --- syn_process_wmode_report --- syn_process_report ** | ** syn_process_serial_data --- syn_translate_ps2_wmode_data -- ** | | ** | | ** -- syn_translate_ps2_data ---- ** ** */ #include /* ceil */ #include #include #include #include #include #include #include "headers/gpm.h" #include "headers/daemon.h" /* which_mouse */ #include "headers/synaptics.h" #include "headers/message.h" #define DEBUG 1 #undef DEBUG #ifdef DEBUG # define DEBUG_SYNAPTIC # define DEBUG_PARAMS 1 # define DEBUG_FLUSH 1 # define DEBUG_RESET 1 # define DEBUG_SENT_DATA 1 # define DEBUG_RECEIVED_DATA 1 # define DEBUG_TOSS 1 # define DEBUG_PALM 1 # define DEBUG_STICK 1 # define DEBUG_TAPS 1 # define DEBUG_MULTI_FINGER 1 # define DEBUG_CMD 1 # define DEBUG_GETBYTE 1 /* this is VERY verbose */ # undef DEBUG_PUTBYTE 1 /* this is VERY verbose */ # define DEBUG_PUTBYTE_ACK 1 /* this is VERY verbose */ # define DEBUG_REPORTS 1 /* this is VERY verbose */ #endif /* The next is UGLY, but I only want debug info from this file */ /* it's really ugly and you shouldn't use this. Instead use * gpm -D | grep filename.c. * ifdef DEBUG should not be used anymore! */ /* pebl: But this require that I boot my machine with gpm -D which I dont. The intention is that when I am doing my normal doing, and the touchpad suddenly behaves strange, I can start debuging without restarting gpm, using a corneraction. */ /* BAD CODE BEGIN #ifdef DEBUG_SYNAPTIC # include static int debug_syn_to_stderr = 1; static void gpm_report_static(int line, char *file, int stat, char* fmt, ... ) { va_list ap; va_start(ap, fmt); if (debug_syn_to_stderr){ vfprintf(stderr, fmt, ap); fputs("\n", stderr); }else{ gpm_report(line,file,stat,fmt,&ap); } va_end(ap); } # define gpm_report gpm_report_static #endif * END BADE CODE */ /* Prototype */ typedef unsigned char byte; static void syn_ps2_absolute_mode(int fd); static char *syn_model_name (int sensor); static void syn_ps2_send_cmd(int fd, int stick, byte cmd); /* Defines */ #define abs(value) ((value) < 0 ? -(value) : (value)) #define check_bits(value,mask) (((value) & (mask)) == (mask)) #define sqr(value) ((value) * (value)) #define distance(dx,dy) (sqr(dx) + sqr(dy)) #define mod4(value) ((value) % 4) #define max(x,y) ((x)>(y)?(x):(y)) /* ** Define the edge bit values. */ #define LEFT_EDGE 0x01 #define RIGHT_EDGE 0x02 #define TOP_EDGE 0x04 #define BOTTOM_EDGE 0x08 #define UPPER_LEFT_CORNER (LEFT_EDGE | TOP_EDGE) #define LOWER_LEFT_CORNER (LEFT_EDGE | BOTTOM_EDGE) #define UPPER_RIGHT_CORNER (RIGHT_EDGE | TOP_EDGE) #define LOWER_RIGHT_CORNER (RIGHT_EDGE | BOTTOM_EDGE) #define is_corner(edges) (((edges) & (LEFT_EDGE | RIGHT_EDGE)) && \ ((edges) & (TOP_EDGE | BOTTOM_EDGE))) /* ** Define the action button bit values. */ #define RIGHT_BUTTON 0x01 #define MIDDLE_BUTTON 0x02 #define LEFT_BUTTON 0x04 #define FOURTH_BUTTON 0x08 #define UP_BUTTON 0x10 #define DOWN_BUTTON 0x20 #define ONE_FINGER 0x01 #define TWO_FINGERS 0x02 #define THREE_FINGERS 0x04 #define FOUR_UP_BUTTON 0x01 #define FOUR_DOWN_BUTTON 0x02 #define FOUR_LEFT_BUTTON 0x04 #define FOUR_RIGHT_BUTTON 0x08 #define STICK_RIGHT_BUTTON 0x01 #define STICK_MIDDLE_BUTTON 0x02 #define STICK_LEFT_BUTTON 0x04 /* ** Define additional gpm button bit values. */ #define GPM_B_NOT_SET (-1) /* ** Define the guest and touchpad devices. */ #define DEVICE_TOUCHPAD 0 #define DEVICE_STICK 1 /**************************************************************************** ** ** Configuration constants. ** ** Those with C at the end are suitable for adjustment by a configuration ** program. ****************************************************************************/ static int corner_taps_enabled = 1; /* are corner taps enabled C*/ static int tap_gesture_enabled = 1; /* are gestures treaded as taps enabled C*/ static int tossing_enabled = 1; /* is toss/catch enabled C*/ static int does_toss_use_static_speed = 1; /* is toss/catch speed C*/ /* based on toss dist */ static int edge_motion_enabled = 1; /* is edge motion enabled C*/ static int edge_motion_speed_enabled = 1; /* does pressure control C*/ /* speed of edge motion */ static int pressure_speed_enabled = 1; /* does pressure control C*/ /* speed in non edges */ static int tap_hold_edge_motion_enabled = 1; /* Enable edge motion while holding a tap C*/ /* pressure induced speed related configuration constants */ static int low_speed_pressure = 60; /*C*/ static int speed_up_pressure = 60; /*C*/ static float speed_pressure_factor = 0.05; /*C*/ static float standard_speed_factor = 0.08; /*C*/ /* toss/catch related constants */ static int min_toss_time = 100; /* ms: 0.10 sec */ static int max_toss_time = 300; /* ms: 0.30 sec */ /*C*/ static int prevent_toss_time = 300; /* ms: 0.25 sec */ /*C*/ static int min_toss_dist = 2; /* mm */ /*C*/ static int static_toss_speed = 70; /*C*/ static float toss_speed_factor = 0.5; /*C*/ /* edge motion related configuration constants */ static int x_min_center = 1632; /* define left edge C*/ static int x_max_center = 5312; /* define right edge C*/ static int y_min_center = 1408; /* define bottom edge C*/ static int y_max_center = 4108; /* define top edge C*/ static int edge_speed = 20; /* default speed at edges C*/ /* gesture related configuration constants for when wmode is enabled. */ static int wmode_enabled = 1; /* is wmode enabled C */ static int drag_lock_enabled = 1; /* is drag locking enabled C */ static int finger_threshold = 30; /* pressure before it is a finger C */ static int tap_lower_limit = 5; /* a tap last at least this long C */ static int tap_upper_limit = 200; /* a tap is at most this long C */ static int tap_range = 100; /* mm finger movement limit C */ static int tap_interval = 200; /* a tap reports button press this long C*/ static int multiple_tap_delay = 30; /* time between reported button pressed C*/ static int pads_tap_interval = 8; /* if pad sends gestures, what is it's tap_interval. C*/ /* wmode capabilities */ static int palm_detect_enabled = 1; /* Ignore when palm on pad C */ static int palm_detect_level = 12; /* Detecting a palm level (between 0-11) C */ static int multi_finger_tap_enabled= 1; /* No of fingers decides which button is pressed C*/ static int multi_finger_stop_enabled = 1; /* less sensitive mouse with multi finger C*/ static int multi_finger_stop_delay = 8; /* how long to stop after a multifinger detection. C*/ static int fake_finger_layer_enabled = 1; /* add an extra software layer to detect multi fingers C*/ /* mixed configurations */ static int touchpad_enabled = 1; /* Disable the touch pad, see corner action turn_on_off. C*/ static int stick_enabled = 1; /* Some machines have a touchpad and a stick on * same device port. The stick will be ignored in * absolute mode, this option try to recognize * it's packets. C*/ static int stick_pressure_enabled = 1; /* A (hard) press on the stick is reported as left click C*/ static int four_way_button_enabled = 1; /* Round button giving 4 choices on some touchpads C*/ static int four_way_button_is_mouse= 1; /* Is the button: 4 buttons or does it moves the mouse. C*/ static int scrolling_enabled = 1; /* Simulate wheel mouse in at the right edge C*/ static int scrolling_edge = RIGHT_EDGE; /* Which edge is a the scrolling edge C*/ static int scrolling_speed = 10;/* less is faster, 1 fastest */ static float scrolling_button_factor = 0.5; /* How fast should a button/corner tap scroll, higher faster C*/ static int auto_scrolling_enabled = 1; /* Moving to the upper/lower edge keeps scrolling up/downC*/ static int auto_scrolling_factor = 2.0; /* How fast should autoscrolling be C*/ static int reset_on_error_enabled = 0; /* If a packet does not conform to any absolute protocol * should we reset the touchpad? This is wrong, because we * should rather find out why it does that in first place. * Do not turn it on per default. */ /* ** Types for describing actions. When adding a new action, place it as ** the last item. It will break old configurefiles otherwise. */ typedef enum { No_Action = 0, Left_Button_Action, Middle_Button_Action, Right_Button_Action, Fourth_Button_Action, Up_Button_Action, Down_Button_Action, Turn_On_Off_Action, Debug_On_Off_Action, Reset_Touchpad_Action, Toggle_Four_Way_Button_Action, Toggle_Stick_Pressure_Action, Toggle_Scrolling_Action, Left_Double_Click_Action, } action_type; typedef struct { int action_mask; action_type action; } touchpad_action_type; static touchpad_action_type corner_actions [] = { { UPPER_LEFT_CORNER, No_Action }, { LOWER_LEFT_CORNER, No_Action }, { UPPER_RIGHT_CORNER, Middle_Button_Action }, { LOWER_RIGHT_CORNER, Right_Button_Action }, { 0, No_Action } /* stop flag value */ }; static touchpad_action_type normal_button_actions [] = { { LEFT_BUTTON, Left_Button_Action }, { MIDDLE_BUTTON, Middle_Button_Action }, { RIGHT_BUTTON, Right_Button_Action }, { FOURTH_BUTTON, Fourth_Button_Action }, { UP_BUTTON, Up_Button_Action }, { DOWN_BUTTON, Down_Button_Action }, { 0, No_Action } /* stop flag value */ }; static touchpad_action_type multi_finger_actions [] = { { ONE_FINGER, Left_Button_Action }, { TWO_FINGERS, Right_Button_Action }, { THREE_FINGERS, Middle_Button_Action }, { 0, No_Action } /* stop flag value */ }; static touchpad_action_type four_button_actions [] = { { FOUR_LEFT_BUTTON, Middle_Button_Action }, { FOUR_RIGHT_BUTTON, Fourth_Button_Action }, { FOUR_UP_BUTTON, Up_Button_Action }, { FOUR_DOWN_BUTTON, Down_Button_Action }, { 0, No_Action } /* stop flag value */ }; static touchpad_action_type stick_actions [] = { { LEFT_BUTTON, Left_Button_Action }, { MIDDLE_BUTTON, Middle_Button_Action }, { RIGHT_BUTTON, Right_Button_Action }, { 0, No_Action } /* stop flag value */ }; /* ** These types are used to read the configuration data from the config file. */ typedef enum { Integer_Param, Float_Param, Flag_Param, Action_Param } param_type_type; typedef struct { char *name; param_type_type p_type; union { void *gen_p; /* avoids complaints by the compiler later on */ int *int_p; float *float_p; int *flag_p; touchpad_action_type *corner_p; } addr; } param_data_type; static param_data_type param_data [] = { /* enabling configuration parameters */ { "edge_motion_enabled", Flag_Param, {&edge_motion_enabled }}, { "edge_motion_speed_enabled", Flag_Param, {&edge_motion_speed_enabled }}, { "corner_taps_enabled", Flag_Param, {&corner_taps_enabled }}, { "tap_gesture_enabled", Flag_Param, {&tap_gesture_enabled }}, { "pressure_speed_enabled", Flag_Param, {&pressure_speed_enabled }}, { "tossing_enabled", Flag_Param, {&tossing_enabled }}, { "does_toss_use_static_speed", Flag_Param, {&does_toss_use_static_speed }}, { "tap_hold_edge_motion_enabled",Flag_Param, {&tap_hold_edge_motion_enabled}}, /* pressure induced speed related configuration parameters */ { "low_pressure", Integer_Param, {&low_speed_pressure }}, { "speed_up_pressure", Integer_Param, {&speed_up_pressure }}, { "pressure_factor", Float_Param, {&speed_pressure_factor }}, { "standard_speed_factor", Float_Param, {&standard_speed_factor }}, /* toss/catch related parameters */ { "min_toss_time", Integer_Param, {&min_toss_time }}, { "max_toss_time", Integer_Param, {&max_toss_time }}, { "prevent_toss_time", Integer_Param, {&prevent_toss_time }}, { "min_toss_dist", Integer_Param, {&min_toss_dist }}, { "static_toss_speed", Integer_Param, {&static_toss_speed }}, { "toss_speed_factor", Float_Param, {&toss_speed_factor }}, /* edge motion related configuration parameters */ { "x_min_center", Integer_Param, {&x_min_center }}, { "x_max_center", Integer_Param, {&x_max_center }}, { "y_min_center", Integer_Param, {&y_min_center }}, { "y_max_center", Integer_Param, {&y_max_center }}, { "edge_speed", Integer_Param, {&edge_speed }}, /* use wmode */ { "wmode_enabled", Flag_Param, {&wmode_enabled }}, { "drag_lock_enabled", Flag_Param, {&drag_lock_enabled }}, { "finger_threshold", Integer_Param, {&finger_threshold }}, { "tap_lower_limit", Integer_Param, {&tap_lower_limit }}, { "tap_upper_limit", Integer_Param, {&tap_upper_limit }}, { "tap_range", Integer_Param, {&tap_range }}, { "tap_interval", Integer_Param, {&tap_interval }}, { "multiple_tap_delay", Integer_Param, {&multiple_tap_delay }}, { "pads_tap_interval", Integer_Param, {&pads_tap_interval }}, /* Additional wmode parameters */ { "palm_detect_enabled", Flag_Param, {&palm_detect_enabled }}, { "palm_detect_level", Integer_Param, {&palm_detect_level }}, { "multi_finger_tap_enable", Flag_Param, {&multi_finger_tap_enabled }}, { "multi_finger_stop_enabled", Flag_Param, {&multi_finger_stop_enabled }}, { "multi_finger_stop_delay", Integer_Param, {&multi_finger_stop_delay }}, { "fake_finger_layer_enabled", Integer_Param, {&fake_finger_layer_enabled }}, /* Additional options*/ { "touchpad_enabled", Flag_Param, {&touchpad_enabled }}, { "stick_enabled", Flag_Param, {&stick_enabled }}, { "stick_pressure_enabled", Flag_Param, {&stick_pressure_enabled }}, { "four_way_button_enabled", Flag_Param, {&four_way_button_enabled }}, { "four_way_button_is_mouse", Flag_Param, {&four_way_button_is_mouse }}, { "scrolling_enabled", Flag_Param, {&scrolling_enabled }}, { "auto_scrolling_enabled", Flag_Param, {&auto_scrolling_enabled }}, { "scrolling_edge", Integer_Param, {&scrolling_edge }}, { "scrolling_speed", Integer_Param, {&scrolling_speed }}, { "scrolling_button_factor", Float_Param, {&scrolling_button_factor }}, { "auto_scrolling_factor", Float_Param, {&auto_scrolling_factor }}, /* corner tap actions */ { "upper_left_action", Action_Param, {&corner_actions [0] }}, { "lower_left_action", Action_Param, {&corner_actions [1] }}, { "upper_right_action", Action_Param, {&corner_actions [2] }}, { "lower_right_action", Action_Param, {&corner_actions [3] }}, /* no. of fingers tap actions */ { "one_finger_tap_action", Action_Param, {&multi_finger_actions [0] }}, { "two_fingers_tap_action", Action_Param, {&multi_finger_actions [1] }}, { "three_fingers_tap_action", Action_Param, {&multi_finger_actions [2] }}, /* normal button actions */ { "left_button_action", Action_Param, {&normal_button_actions [0] }}, { "middle_button_action", Action_Param, {&normal_button_actions [1] }}, { "right_button_action", Action_Param, {&normal_button_actions [2] }}, { "fourth_button_action", Action_Param, {&normal_button_actions [3] }}, { "up_button_action", Action_Param, {&normal_button_actions [4] }}, { "down_button_action", Action_Param, {&normal_button_actions [5] }}, /* 4 way button actions */ { "four_way_left_button_action", Action_Param, {&four_button_actions [0] }}, { "four_way_right_button_action",Action_Param, {&four_button_actions [1] }}, { "four_way_up_button_action", Action_Param, {&four_button_actions [2] }}, { "four_way_down_button_action", Action_Param, {&four_button_actions [3] }}, /* Synaptic Stick (passthrugh,stick) actions */ { "stick_left_button_action", Action_Param, {&stick_actions [0] }}, { "stick_middle_button_action", Action_Param, {&stick_actions [1] }}, { "stick_right_button_action", Action_Param, {&stick_actions [2] }}, /* end of list */ { NULL, Flag_Param, {NULL }} }; /* ** The information returned in the identification packet. ** STIG page 10 */ typedef struct { int info_model_code; int info_major; int info_minor; } info_type; static info_type ident[2]; /* ** The information returned in the model ID packet. ** STIG page 11 */ #define INFO_ROT180_BITS 0x800000 /* bit 23 */ #define INFO_PORTRAIT_BITS 0x400000 /* bit 22 */ #define INFO_SENSOR_BITS 0x3F0000 /* bit 16-21 */ #define INFO_HARDWARE_BITS 0x00FE00 /* bit 9-15 */ #define INFO_NEW_ABS_BITS 0x000080 /* bit 7 */ #define INFO_CAP_PEN_BITS 0x000040 /* bit 6 */ #define INFO_SIMPLE_CMD_BITS 0x000020 /* bit 5 */ #define INFO_GEOMETRY_BITS 0x00000F /* bit 0-3 */ typedef struct { int info_rot180; int info_portrait; int info_sensor; int info_hardware; int info_new_abs; int info_cap_pen; int info_simple_cmd; int info_geometry; } model_id_type; static model_id_type model[2]; /* ** The sensor types as of STIG 2.5 ** Page 11. Plus some guessing. */ static char *model_names [] = { "Unknown", /* 0 */ "Standard TouchPad (TM41xx134)", "Mini Module (TM41xx156)", "Super Module (TM41xx180)", "Romulan Module", "Apple Module", "Single Chip", "Flexible pad (discontinued)", "Ultra-thin Module (TM41xx220)", "Wide pad Module (TW41xx230)", "TwinPad", /* 10 */ "StampPad Module (TM41xx240)", "Sub-mini Module (TM41xx140)", "MultiSwitch module (TBD)", "Standard Thin", "Advanced Technology Pad (TM41xx221)", "Ultra-thin Module, connector reversed", "Low Power Module", "Thin Module, ATP", "Snap dome Module, ATP", "FlexArm Module", /* 20 */ "TWIII Module (TouchWriter 3)", "TWIII Module (P64)", "Combo Module", "Squish Module", "Thin TTL Serial module", "TWIII Ultra Thin Module", "PS/2 Passthrough", "4 Button On Board Module", "6 Buttons Off Board Module", "6 Buttons On Board Module", /* 30 */ "Ultrathin TTL serial Module", "ClearPad Module", "HyperThin Sensor Module", "Pad With Scroll Strip", "UltraThin TTL rounded, serial Module", "Ultrathin ATP Module", "SubMini w/6 buttons", "Standard USB Module", "cPad Dropin Plain USB Module", "cPad", /* 40 */ "", "", "", "UltraNav", }; /* ** Define the information known about a sensor. ** STIG page 14. ** Resolution only apply for absolute mode. ** For older models the default resolution is 85x94. */ typedef struct { char *model; int x_per_mm; int y_per_mm; float width_mm; float height_mm; } sensor_info_type; static sensor_info_type sensor_info [] = { { "", 0, 0, 0.0, 0.0 }, { "Standard", 85, 94, 47.1, 32.3 }, { "Mini", 91, 124, 44.0, 24.5 }, { "Super", 57, 58, 70.2, 52.4 }, { "", 0, 0, 0.0, 0.0 }, { "", 0, 0, 0.0, 0.0 }, { "", 0, 0, 0.0, 0.0 }, { "", 0, 0, 0.0, 0.0 }, { "UltraThin", 85, 94, 47.1, 32.3 }, { "Wide", 73, 96, 54.8, 31.7 }, { "", 0, 0, 0.0, 0.0 }, { "Stamp", 187, 170, 21.4, 17.9 }, { "SubMini", 122, 167, 32.8, 18.2 }, }; static sensor_info_type *sensor[2] = { &sensor_info[0],&sensor_info[0] }; /* ** The information returned in the extended capability packet. ** STIG page 15 */ #define EXT_CAP_EXTENDED 0x8000 /* Bit 15 */ #define EXT_CAP_STICK 0x0080 /* Bit 8 */ #define EXT_CAP_PASS_THROUGH 0X0080 /* Bit 8!! */ #define EXT_CAP_SLEEP 0x0010 /* Bit 4 */ #define EXT_CAP_FOUR_BUTTON 0x0008 /* Bit 3 */ #define EXT_CAP_MULTI_FINGER 0X0002 /* Bit 1 */ #define EXT_CAP_PALM_DETECT 0X0001 /* Bit 0 */ typedef struct { int cap_ext; int cap_stick; int cap_sleep; int cap_four_button; int cap_multi_finger; int cap_palm_detect; } ext_cap_type; static ext_cap_type capabilities[2]; /* ** The information in the mode byte. ** STIG Page 17 */ #define ABSOLUTE_MODE 0x80 /* Bit 7 set */ #define RELATIVE_MODE 0x00 /* Bit */ #define HIGH_REPORT_RATE 0x40 /* Bit 6 set = 80 packages per second */ #define LOW_REPORT_RATE 0x00 /* Bit 40 packages per second */ #define USE_9600_BAUD 0x08 /* Bit 3 for serial protocol */ #define USE_1200_BAUD 0x00 /* Bit */ #define PS2_SLEEP 0x08 /* Bit 3 for ps2 protocol */ #define PS2_NO_SLEEP 0x00 /* Bit (only button press activates touchpad again)*/ #define NO_TAPDRAG_GESTURE 0x04 /* Bit 2 for model version >= 4 */ #define TAPDRAG_GESTURE 0x00 /* Bit */ #define EXTENDED_REPORT 0x02 /* Bit 1 for serial protocol absolute mode only */ #define NORMAL_REPORT 0x00 /* Bit */ #define STICK_DISABLE 0x02 /* Bit 1 for ps2 protocol this disables any stick attached */ #define STICK_ENABLED 0x00 /* Bit */ #define REPORT_W_ON 0x01 /* Bit 0 set */ #define REPORT_W_OFF 0x00 /* Bit */ /* ** The format of the translated data to a report. */ typedef struct { int left; int middle; int right; int fourth; int up; int down; int x; int y; int pressure; int gesture; int fingers; int fingerwidth; int w; } report_type; static report_type last_report,cur_report; /* ** A location record. ** This is needed to make an average over several packages, ** because the reported x,y might not be that accurate. */ typedef struct { int x; int y; } location_type; /* ** Parameters for controlling the touchpad. */ /* touchpad information */ static int res_x; static int res_y; static int x_per_mm; static int y_per_mm; /* status information */ static int packet_num = 0; static int was_edges = 0; static int was_non_edge = 0; static location_type last_locs [4]; static Gpm_Event last_state; static int tap_lower_limit_packet; static int tap_upper_limit_packet; static int last_corner_action = GPM_B_NOT_SET; static int last_finger_action = GPM_B_NOT_SET; static int last_normal_button_actions[6] = {GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET}; static int last_stick_button_actions[8] = {GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET}; static int last_4_way_button_actions[8] = {GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET,GPM_B_NOT_SET}; /* toss status information */ static int is_tossing = 0; static int was_tossing = 0; static int min_toss_dist__2 = 32000; static int max_toss_packets; static int min_toss_packets; static int prevent_toss_packets; static int toss_timer; static location_type toss_speed; static location_type touch_loc; /* Multi tap information */ static int gesture_delay = 0; static int fake_forget_tap_interval = 0; /* if hardware sends tap-hold, we need to keep track */ static int fake_time_to_forget_tap = 0; /* not to lose user defined actions in the hold periode. * (action like: Multifingers, non-repeating actions etc.*/ /* Multi finger information */ static int was_fingers = 0; static int multi_finger_stop_timer = 0; static int multi_finger_pressure = 0; static int multi_finger_xy = 0; /* Scrolling information */ static int is_scrolling = 0; /* Scrolling using touchpad edge*/ static int is_always_scrolling = 0; /* Only report scrolling, no mouse movement */ static int scrolling_speed_timer = 0; static int scrolling_amount_left = 0; /* Tells how much to scroll up or down */ /**************************************************************************** ** ** ROUTINES for processing either type of touchpad. ** ****************************************************************************/ /* ** Dump the report data for debugging. ** ** Because the synaptics sends (trivial) data in one second after last touch, ** which makes reading the debug data harder, only dump the report if it is different ** than the previously dumped. */ static void tp_dump_report_data (report_type report, int edges, Gpm_Event* state) { static report_type last_report_reported; static unsigned int times_report_repeated = 0; report.left |= state->buttons & GPM_B_LEFT; report.right |= state->buttons & GPM_B_RIGHT; report.middle |= state->buttons & GPM_B_MIDDLE; if (memcmp(&report,&last_report_reported,sizeof(report_type)) == 0){ times_report_repeated++; return; } /* Was the last report repeated ? */ if(times_report_repeated > 0){ gpm_report (GPM_PR_DEBUG,"\rSynps2: Last report reported %d times\n",times_report_repeated); times_report_repeated = 0; } last_report_reported = report; gpm_report (GPM_PR_DEBUG, "\rSynps2: %c%c%c%c%c %4dx%-4d %3d %2d %d %c%c%c%c %c%c %3d%3d %d %8d %8d %c", report.fingers ? 'f' : '-', report.gesture ? 'g' : '-', report.left ? 'l' : '-', report.middle ? 'm' : '-', report.right ? 'r' : '-', report.x, report.y, report.pressure, report.w,was_fingers, edges & LEFT_EDGE ? 'l' : '-', edges & RIGHT_EDGE ? 'r' : '-', edges & BOTTOM_EDGE ? 'b' : '-', edges & TOP_EDGE ? 't' : '-', report.gesture && !report.fingers ? 't' : '-', report.gesture && report.fingers ? 'd' : '-', state->dx,state->dy,state->buttons, multi_finger_pressure,multi_finger_xy, (multi_finger_pressure>4500 && multi_finger_xy>50000? 'f':' ')); } /* syn_dump_info ** ** Print properties for the hardare. ** */ static void syn_dump_info(int stick) { gpm_report (GPM_PR_INFO,"Synaptic %s Device:",(stick?"Stick":"Touchpad")); gpm_report (GPM_PR_INFO,"Synaptics Ident: model_code=%d Firmware version %d.%d", ident[stick].info_model_code, ident[stick].info_major, ident[stick].info_minor); gpm_report (GPM_PR_INFO,"Synaptics model:"); gpm_report (GPM_PR_INFO," rot180: %s", model[stick].info_rot180 ? "Yes" : "No"); gpm_report (GPM_PR_INFO," portrait: %s", model[stick].info_portrait ? "Yes" : "No"); gpm_report (GPM_PR_INFO," sensor: %d", model[stick].info_sensor); gpm_report (GPM_PR_INFO," %s", syn_model_name (model[stick].info_sensor)); gpm_report (GPM_PR_INFO," %s", sensor[stick]->model); gpm_report (GPM_PR_INFO," %dx%d res/mm", sensor[stick]->x_per_mm, sensor[stick]->y_per_mm); gpm_report (GPM_PR_INFO," %4.1fx%4.1f mm", sensor[stick]->width_mm, sensor[stick]->height_mm); gpm_report (GPM_PR_INFO," %dx%d res", res_x, res_y); gpm_report (GPM_PR_INFO," hardware: %d", model[stick].info_hardware); gpm_report (GPM_PR_INFO," newABS: %s", model[stick].info_new_abs ? "Yes" : "No"); gpm_report (GPM_PR_INFO," simpleCmd: %s", model[stick].info_simple_cmd ? "Yes" : "No"); gpm_report (GPM_PR_INFO," geometry: %d", model[stick].info_geometry); gpm_report (GPM_PR_INFO," extended: %s", capabilities[stick].cap_ext ? "Yes" : "No"); gpm_report (GPM_PR_INFO," stick: %s", capabilities[stick].cap_stick ? "Yes" : "No"); gpm_report (GPM_PR_INFO," sleep: %s", capabilities[stick].cap_sleep ? "Yes" : "No"); gpm_report (GPM_PR_INFO," 4 buttons: %s", capabilities[stick].cap_four_button ? "Yes" : "No"); gpm_report (GPM_PR_INFO," multifinger: %s", capabilities[stick].cap_multi_finger ? "Yes" : "No"); gpm_report (GPM_PR_INFO," palmdetect: %s", capabilities[stick].cap_palm_detect ? "Yes" : "No"); #if DEBUG_TOSS gpm_report (GPM_PR_INFO,"Min Toss Dist^2: %d\n", min_toss_dist__2); #endif } /* Get model name, STIG page 11 */ static char *syn_model_name (int sensor) { if (sensor < 0 || 44 < sensor ) { return "Reserved"; } else { return model_names [sensor]; } } /* convert the model id from bits to values * STIG page 11 */ static void syn_extract_model_id_info (int model_int, model_id_type *model) { model->info_rot180 = check_bits (model_int, INFO_ROT180_BITS); model->info_portrait = check_bits (model_int, INFO_PORTRAIT_BITS); model->info_sensor = (model_int & INFO_SENSOR_BITS) >> 16; model->info_hardware = (model_int & INFO_HARDWARE_BITS) >> 8; model->info_new_abs = check_bits (model_int, INFO_NEW_ABS_BITS); model->info_cap_pen = check_bits (model_int, INFO_CAP_PEN_BITS); model->info_simple_cmd = check_bits (model_int, INFO_SIMPLE_CMD_BITS); model->info_geometry = (model_int & INFO_GEOMETRY_BITS); } /* Translate the reported data into a record for processing * STIG page 14*/ static sensor_info_type *syn_get_sensor_info (int sensor_id) { if (sensor_id < 0 || 12 < sensor_id ) { return &sensor_info [0]; } else { return &sensor_info [sensor_id]; } } /* Translate the reported data of extended capabilities STIG page 15. If the extended bit is not set it should be assumed that neither of the other capabilities is available.*/ static void syn_extract_extended_capabilities(int ext_cap_int, ext_cap_type *cap) { # ifdef DEBUG gpm_report(GPM_PR_INFO,"Synaptics Device Capabilities: %02X",ext_cap_int); # endif cap->cap_ext = check_bits (ext_cap_int, EXT_CAP_EXTENDED); if(cap->cap_ext){ cap->cap_stick = check_bits (ext_cap_int, EXT_CAP_STICK); cap->cap_sleep = check_bits (ext_cap_int, EXT_CAP_SLEEP); cap->cap_four_button = check_bits (ext_cap_int, EXT_CAP_FOUR_BUTTON); cap->cap_multi_finger = check_bits (ext_cap_int, EXT_CAP_MULTI_FINGER); cap->cap_palm_detect = check_bits (ext_cap_int, EXT_CAP_PALM_DETECT); }else{ cap->cap_stick = 0; cap->cap_sleep = 0; cap->cap_four_button = 0; cap->cap_multi_finger = 0; cap->cap_palm_detect = 0; /* Wmode is not supported, but this should be turned off after reading the config file.*/ } } /* ** Check for edges. */ static int tp_edges (location_type loc) { int edges = 0; if (loc.x <= x_min_center) edges |= LEFT_EDGE; if (loc.x >= x_max_center) edges |= RIGHT_EDGE; if (loc.y <= y_min_center) edges |= BOTTOM_EDGE; if (loc.y >= y_max_center) edges |= TOP_EDGE; return edges; } /** ** Handle scrolling. The wheel is way too fast to be usefull, so only report ** every scrolling_speed. This function is also called when scrolling is done by ** buttons, which is why DOWN and UP must be removed in the case of not scrolling. */ static void tp_handle_scrolling(Gpm_Event *state) { /* Limit the amount of scrolling, so that we do not overrun. */ if ( scrolling_amount_left > 256*20 ) scrolling_amount_left = 256*20; if ( scrolling_amount_left < -256*20 ) scrolling_amount_left = -256*20; state->buttons &= ~(GPM_B_DOWN | GPM_B_UP); if (scrolling_amount_left > scrolling_speed){ scrolling_amount_left -= scrolling_speed; state->buttons |= GPM_B_UP; }else if (scrolling_amount_left < -scrolling_speed){ scrolling_amount_left += scrolling_speed; state->buttons |= GPM_B_DOWN; } } /* ** process_action ** ** Do the action and return a button state for a given action list and mask. ** Actions that should not be repeated should report GPM_B_NOT_SET (when ** holding down a button). */ static int tp_process_action(touchpad_action_type *action_list, int mask) { int i = 0; int status = GPM_B_NOT_SET; static int Left_Double_Click = 0; if (mask == 0){ gpm_report (GPM_PR_WARN,"Action Mask is 0"); return GPM_B_NOT_SET; } while (action_list [i].action_mask) { if (check_bits (mask, action_list [i].action_mask)) { switch (action_list [i].action) { case Left_Button_Action: status = GPM_B_LEFT; break; case Middle_Button_Action: status = GPM_B_MIDDLE; break; case Right_Button_Action: status = GPM_B_RIGHT; break; case Fourth_Button_Action: status = GPM_B_FOURTH; break; case Up_Button_Action: scrolling_amount_left += ceil(scrolling_button_factor * scrolling_speed); status = GPM_B_UP; break; case Down_Button_Action: scrolling_amount_left -= ceil(scrolling_button_factor * scrolling_speed); status = GPM_B_DOWN; break; case Left_Double_Click_Action: Left_Double_Click++; status = GPM_B_LEFT; if(Left_Double_Click == 2) status = GPM_B_NONE; if(Left_Double_Click == 4) { status = GPM_B_NOT_SET; Left_Double_Click = 0; } break; case Turn_On_Off_Action: touchpad_enabled = !touchpad_enabled; status = GPM_B_NOT_SET; break; case Debug_On_Off_Action: # ifdef DEBUG_SYNAPTIC debug_syn_to_stderr = !debug_syn_to_stderr; # endif status = GPM_B_NOT_SET; break; case Reset_Touchpad_Action: syn_ps2_reset(which_mouse->fd); syn_ps2_absolute_mode(which_mouse->fd); status = GPM_B_NOT_SET; break; case Toggle_Four_Way_Button_Action: four_way_button_is_mouse = !four_way_button_is_mouse; status = GPM_B_NOT_SET; break; case Toggle_Stick_Pressure_Action: stick_pressure_enabled = !stick_pressure_enabled; status = GPM_B_NOT_SET; break; case Toggle_Scrolling_Action: is_always_scrolling = !is_always_scrolling; status = GPM_B_NOT_SET; break; case No_Action: status = GPM_B_NOT_SET; break; default: gpm_report (GPM_PR_WARN,"Default Action: Action no. %X not defined", action_list [i].action); status = GPM_B_NOT_SET; break; } return status; } i++; } return status; } /* ** tp_process_corner_taps. ** ** last_*_action is an easy way of remember which taps/buttons should call/repeat ** the action when the tap/button is held pressed. It could just as well have ** been one variable where each bit held the repeater info for all the ** tap/buttons, but that will mean more code. ** ** The reason for not actually reusing last_*_action, instead of ** calculating it again, is that some actions like scrolling have "side effects". ** This may be perceived as a design fault. ** ** tp_process_corner_taps and tp_process_button_press are more complicated than ** to what is obvious. This is because 1) in a corner tap-and-hold the hold ** could take place at non edge. 2) A normal tap-and-hold can be moved to a ** corner. */ static void tp_process_corner_taps (Gpm_Event *state, report_type *report) { static int edges_at_cornertap_time; if (report->gesture && ((is_corner (was_edges) && !last_report.gesture) || (last_corner_action != GPM_B_NOT_SET))) { if(!last_report.gesture && last_corner_action == GPM_B_NOT_SET) edges_at_cornertap_time = was_edges; last_corner_action = tp_process_action(corner_actions,edges_at_cornertap_time); if (last_corner_action != GPM_B_NOT_SET) state->buttons |= last_corner_action; } } /* tp_process_button_press ** ** Handles finger taps. Same way as tp_process_corner_taps. ** ** Should only calculate a tap if ** 1) There is a gesture (tap) ** 2) The tap did not start at a corner with a corneraction ** 3) If it is calculated before it should have returned a repeating action. */ static void tp_process_finger_taps (Gpm_Event *state, report_type *report) { if (report->gesture && last_corner_action == GPM_B_NOT_SET && !(corner_taps_enabled && is_corner (was_edges) && !last_report.gesture) && !(last_report.gesture && last_finger_action == GPM_B_NOT_SET) ){ if( ( multi_finger_tap_enabled && (was_fingers == 0 || was_fingers == 1)) || (!multi_finger_tap_enabled && was_fingers > 0)) last_finger_action = tp_process_action(multi_finger_actions, ONE_FINGER); if (multi_finger_tap_enabled && was_fingers == 2) last_finger_action = tp_process_action(multi_finger_actions, TWO_FINGERS); if (multi_finger_tap_enabled && was_fingers == 3) last_finger_action = tp_process_action(multi_finger_actions, THREE_FINGERS); if (last_finger_action != GPM_B_NOT_SET) state->buttons |= last_finger_action; } } /* ** tp_process_do_repeating_action ** ** The function test whether a feature's action should be repeated/called. The ** action should be called if the feature is there and if it was there last ** time, then it should be a repeating action. */ static inline void tp_process_repeating_action(Gpm_Event *state, int feature, int last_feature, int *last_action, touchpad_action_type *action_list,int feature_mask) { if (feature) { if (!(last_feature && *last_action == GPM_B_NOT_SET)) { *last_action = tp_process_action(action_list, feature_mask); if (*last_action != GPM_B_NOT_SET) state->buttons |= *last_action; } } else { *last_action = GPM_B_NOT_SET; } } /* ** tp_process_do_repeating_actions ** ** Call tp_process_do_repeating_action foreach possible action (right now only buttons.) */ static inline void tp_process_repeating_actions(Gpm_Event *state, int features, int last_features, int last_actions[], touchpad_action_type *action_list) { int feature_no, feature_mask; for(feature_no = 0; feature_no < 8; feature_no++) { feature_mask = (1<left, last_report.left, &last_normal_button_actions[0], normal_button_actions, LEFT_BUTTON); tp_process_repeating_action(state, report->right, last_report.right, &last_normal_button_actions[1], normal_button_actions, RIGHT_BUTTON); tp_process_repeating_action(state, report->middle, last_report.middle, &last_normal_button_actions[2], normal_button_actions, MIDDLE_BUTTON); tp_process_repeating_action(state, report->fourth, last_report.fourth, &last_normal_button_actions[3], normal_button_actions, FOURTH_BUTTON); tp_process_repeating_action(state, report->up, last_report.up, &last_normal_button_actions[4], normal_button_actions, UP_BUTTON); tp_process_repeating_action(state, report->down, last_report.down, &last_normal_button_actions[5], normal_button_actions, DOWN_BUTTON); } /* ** syn_process_wmode_report ** ** Translate synaptics specific values. */ static void syn_process_wmode_report( report_type *report ) { /* STIG page 9: Values of w, vary from pad to pad. It is not precise when pressure is small < 25. * 4-7 finger of normal width * 8-14 very wide finger or palm * 15 maximum reportable width */ report->fingerwidth = max(0,report->w - 4); /* Check whether there is one finger on the pad */ report->fingers = (report->pressure > finger_threshold); /* use w values. w = 0: 2 fingers, w = 1: 3 fingers, (if there is pressure) */ if (capabilities[0].cap_multi_finger){ if (report->pressure != 0 && (report->w == 0 || report->w == 1)){ report->fingers = 2+report->w; } } } /* ** syn_ps2_process_extended_packets ** ** The internal synaptics ps2 touchpads can have extra devices attached (stick, ** 4 way button) to them, and they reports there state as special embedded ** packets. These attached devices are handled here. ** ** The function returns 1 if it does not make sense to continue normal touchpad ** processing, 0 otherwise. ** ** I dont think that the external touchpads (serial) can have the same devices ** attached. This code should be moved to ps2 specific part, but it is easy to ** have it here. */ static int syn_ps2_process_extended_packets( unsigned char *data, report_type *report, Gpm_Event *state) { static int last_stick_buttons = GPM_B_NONE; static int last_4_way_buttons = GPM_B_NONE; int tmp_buttons = GPM_B_NONE; /* Sanity check of data. */ if ((report->pressure == 0 && (report->x != 0 || report->y != 0)) || report->w == 3 ) { /* Something is wrong, should we assume it is an extended packet? It * cannot be processed further than here as the pressure is 0, which would * break things, if the user uses it simultaneously with the touchpad. */ /* Allow some simultaneously usage: tap-hold on touchpad, with extended movement. * Do not do buttons, as they are not always correctly defined yet. */ if (last_report.gesture) { report->gesture = 1; if(tap_gesture_enabled) tp_process_finger_taps (state, report); if(corner_taps_enabled) tp_process_corner_taps (state, report); } /* Stick invariant bits (I hope). See absolute packets */ /* Stick pressed: The stick do only generates one packet, so double tap is * a problem; squeezing in a non-clicked state. It is probably not a real * problem, as it is hard not to move the stick a little between pressing, * thereby returning a non-clicked state between the packets. Maybe * press-lock mechanism is useful. Forget it, the styk supports it! */ if((data[0] & 0xFC) == 0x84 && (data[1] & 0xC8) == 0x08 && (data[3] & 0xFC) == 0xC4){ tp_process_button_press (state,report); if (stick_enabled) { state->dx= ((data[1] & 0x10) ? data[4]-256 : data[4]); state->dy= -((data[1] & 0x20) ? data[5]-256 : data[5]); } if (stick_pressure_enabled) { tmp_buttons = ((data[1] & 0x01) ? STICK_LEFT_BUTTON : 0); tmp_buttons |= ((data[1] & 0x04) ? STICK_MIDDLE_BUTTON : 0); tmp_buttons |= ((data[1] & 0x02) ? STICK_RIGHT_BUTTON : 0); tp_process_repeating_actions(state,tmp_buttons,last_stick_buttons, &last_stick_button_actions[0],stick_actions); } last_stick_buttons = tmp_buttons; # ifdef DEBUG_STICK gpm_report (GPM_PR_DEBUG,"StickData? %02x %02x %02x %02x %02x %02x :dx:%d dy:%d b:%d", data[0],data[1],data[2],data[3],data[4],data[5], state->dx,state->dy,state->buttons); # endif return 1; } /* 4 way button invariant bits (I hope). I dont know the official name. */ if((data[0] & 0xFC) == 0x80 && (data[1] & 0xFF) == 0x00 && (data[3] & 0xFC) == 0xC0 && report->x < 4 && report->y < 4 ){ if(four_way_button_enabled){ report->fourth = !report->fourth; /* Note that this is reversed. */ tp_process_button_press (state,report); if (four_way_button_is_mouse){ /* Report motion */ if (report->x & 1) /* UP */ state->dy = -1; if (report->y & 1) /* DOWN */ state->dy = 1; if (report->x & 2) /* LEFT */ state->dx = -1; if (report->y & 2) /* RIGHT */ state->dx = 1; }else{ /* Report buttons */ tmp_buttons = ((report->x & 1) ? FOUR_UP_BUTTON : 0); /* UP */ tmp_buttons |= ((report->y & 1) ? FOUR_DOWN_BUTTON : 0); /* DOWN */ tmp_buttons |= ((report->x & 2) ? FOUR_LEFT_BUTTON : 0); /* LEFT */ tmp_buttons |= ((report->y & 2) ? FOUR_RIGHT_BUTTON: 0); /* RIGHT */ tp_process_repeating_actions(state,tmp_buttons,last_4_way_buttons, &last_4_way_button_actions[0],four_button_actions); } } last_4_way_buttons = tmp_buttons; if ( scrolling_amount_left != 0 ){ tp_handle_scrolling(state); } return 1; } /* This is unknown packet. */ gpm_report (GPM_PR_ERR,"\rSynps2: Pressure is 0, but x or y is not 0. " "Data: %02X %02X %02X %02X %02X %02X", data [0],data [1],data [2],data [3],data [4],data [5]); return 1; } /* Multiplexing with the stick (guest) device. */ if (stick_pressure_enabled) { tmp_buttons = report->pressure == 0 ? GPM_B_NONE : last_stick_buttons; if (tmp_buttons || last_stick_buttons) { tp_process_repeating_actions(state,tmp_buttons,last_stick_buttons, &last_stick_button_actions[0],stick_actions); last_stick_buttons = tmp_buttons; } } if (four_way_button_enabled) { tmp_buttons = report->pressure == 0 ? GPM_B_NONE : last_4_way_buttons; if (tmp_buttons || last_4_way_buttons) { tp_process_repeating_actions(state,tmp_buttons,last_4_way_buttons, &last_4_way_button_actions[0],four_button_actions); last_4_way_buttons = tmp_buttons; } } return 0; } /** ** Preprocess the report even before doing wmode stuff. ** Is always called directly after the conversion to check the data received. ** return 0 if it is reasonable, 1 if there is something wrong. ** ** Checks for correct data package, palm on the pad, number of fingers. ** */ static int tp_find_fingers ( report_type *report, Gpm_Event *state) { static int fake_extra_finger; static int was_fake_pressure; /* Check whether there is a palm on the pad */ if (palm_detect_enabled && report->fingers && (report->fingerwidth >= palm_detect_level)){ # ifdef DEBUG_PALM gpm_report (GPM_PR_DEBUG,"\rTouchpad: palm detected. finger width: %d",report->fingerwidth); # endif /* BUG should not return 1, as this drops packets. Return a repeated report ? */ /* last_locs [mod4 (packet_num - 1)].x = report->x; */ /* last_locs [mod4 (packet_num - 1)].y = report->y; */ /* or */ /* report->pressure = 0; */ return 1; } /* Extra check for vertical multi fingers which my pad is very bad to detect. ** Only check for extra fingers if no of fingers has not changed. Faking ** fingers may go wrong so sanity check needed. This is not an attempt to ** know the number of fingers all the time, as this is not needed. */ if (fake_finger_layer_enabled){ if (report->fingers > 1){ fake_extra_finger = 0; } if(report->fingers == 0){ fake_extra_finger = 0; # ifdef DEBUG_REPORTS multi_finger_pressure = 0; multi_finger_xy = 0; # endif }else if (report->fingers + fake_extra_finger == last_report.fingers) { multi_finger_pressure = sqr(report->pressure) - sqr(last_report.pressure); multi_finger_xy = (sqr(last_locs [mod4 (packet_num - 1)].x - report->x) + sqr(last_locs [mod4 (packet_num - 1)].y - report->y) ); /* Check for a second finger. If the move is larger than tap range, * then it is not a tap, and adding the finger does not change reported * buttons, but it will still stop the moving if * multi_finger_stop_enabled is on. These tests are complete base on my * imagination and experience, so any better idea are welcome. */ if(report->fingers == 1 && multi_finger_pressure > 4500 && multi_finger_xy > 2*sqr((double)tap_range)){ fake_extra_finger = 1; was_fake_pressure = report->pressure; }/* Check for third finger. */ else if(last_report.pressure > 180 && (report->fingers + fake_extra_finger) == 2 && multi_finger_pressure > 4500 && multi_finger_xy > 2*sqr((double)tap_range)){ fake_extra_finger = 2; was_fake_pressure = report->pressure; } else if ( (fake_extra_finger > 0) && (was_fake_pressure - report->pressure > 20)){ fake_extra_finger --; } else if(multi_finger_pressure < -5000 && multi_finger_xy > 2*sqr((double)tap_range)){ /* Probably missed a placed multi finger, as this is one removed! */ last_report.fingers ++; } } report->fingers += fake_extra_finger; } /* Check whether to reduce sensibility when adding or removing fingers */ if (multi_finger_stop_enabled){ /* Is a finger added or removed since last packet? */ if( (report->fingers > 1 && report->fingers > last_report.fingers) || (last_report.fingers > 1 && report->fingers < last_report.fingers) ){ /* Updating the timer right after another added/removed finger, * would make the undo moving become redo, so dont.*/ if(multi_finger_stop_timer != multi_finger_stop_delay - 1) multi_finger_stop_timer = multi_finger_stop_delay; # ifdef DEBUG_MULTI_FINGER gpm_report (GPM_PR_DEBUG,"%s multi finger %d %d %d", report->fingers > last_report.fingers ? "Add":"Remove", last_report.fingers,report->fingers,fake_extra_finger); # endif } /* Should be tested last, because of undo moving when removing fingers. */ else if(report->fingers == 0){ multi_finger_stop_timer = 0; } /* Stop moving the mouse after a finger adding/removing. */ if( multi_finger_stop_timer > 0){ last_locs [mod4 (packet_num - 1)].x = report->x; last_locs [mod4 (packet_num - 1)].y = report->y; last_locs [mod4 (packet_num - 2)].x = report->x; last_locs [mod4 (packet_num - 2)].y = report->y; /* Undo the previous move (before detecting of the adding/removing). */ if (multi_finger_stop_timer == multi_finger_stop_delay){ last_locs [mod4 (packet_num - 2)].x += last_state.dx * 2 / standard_speed_factor; last_locs [mod4 (packet_num - 2)].y -= last_state.dy * 2 / standard_speed_factor; } multi_finger_stop_timer --; } } /* If wmode is not used, we do not know all the informations to reset the * was_fingers variable or stop waiting for a tap-hold, so set a timer to * reset the variables when we believe it is time. pads_tap_interval is * optimal when set to the touchpads tap_interval. */ if(fake_forget_tap_interval){ if (report->fingers || report->gesture) fake_time_to_forget_tap = pads_tap_interval; if(fake_time_to_forget_tap > 0) fake_time_to_forget_tap --; else was_fingers = 0; } was_fingers = max(was_fingers,report->fingers); return 0; } /** ** tp_find_gestures ** Process the report from a wmode enabled device. No gesture calculation is ** done by the device in wmode, so the find tap and drag hold and tap hold gestures. ** ** Tap mechanism: High when touched. (=: assigned, -: decreased, +: increased) ** ** _________________________ ** | tap_lower/upper_limit |tap_interval| ** ----------------- ----------------- ** ** stroke_x/y : = ** finger_on_pad_timer: 0000123 +++++++++++++0000000000000000 ** time_to_forget_tap : 0000000 000000000000=---------3210000 ** gesture_delay : 0000000 ... 00000000000000000000000000000 ** drag_locked : 0000000 00000000000000000000000000000 ** gesture : 0000000 00000000000011111111111110000 ** ** Note: ** 0) When gesture is high a button is reported pressed (usually left button). ** 1) finger_on_pad_timer is increased at most to 1 larger than tap_upper_limit, ** but then it is not a tap any longer. ** 2) If tap_interval is larger than 1s (80 packets) then time_to_forget_tap never reaches 0, ** before the touchpads stop sending packets, so gesture is reported until touched again. ** ** ** Tap hold mechanism: High when touched. (=: assigned, -: decreased, +: increased) ** ** tap_interval ** ________________ v ___ ___ ** |tap_l/u_limit | |not tap| ** ----------------- ------ -------- ** ** stroke_x/y : = = ** finger_on_pad_timer: 0000123+ +++00000123++ +++0000 ** time_to_forget_tap : 00000000 000=----11111 1110000 ** gesture_delay : 00000000 ... 0000000000000 0000000 ** drag_locked : 00000000 0000000000000 0000000 ** gesture : 00000000 0001111111111 1110000 ** ** Note: ** 0) time_to_forget_tap is set to 1 when touching the pad 2 time, so the gesture is stop when released. ** (two fast taps would be a problem). ** ** ** Two consecutive taps mechanism: High when touched. (=: assigned, -: decreased, +: increased) ** ** tap_interval multiple_tap_delay ** ________________ v _______________ v | ** |tap_l/u_limit | |tap_l/u_limit| ** ----------------- ------ -------- ** ** stroke_x/y : = = ** finger_on_pad_timer: 0000123+ +++00000123++ ++00000000000000000 ** time_to_forget_tap : 00000000 000=----11111 11=---------32100000 ** gesture_delay : 00000000 ... 0000000000000 ... 00=----3210000000000 ** drag_locked : 00000000 0000000000000 00000000000000000000 ** gesture : 00000000 0001111111111 11000000001111100000 ** ** Note: ** 0) There is no gesture if gesture_delay is non zero. ** 1) multiple_tap_delay (gesture_delay) should be less than tap_interval (time_to_forget_tap), ** or else no second tap is reported. ** 2) Three fast taps (shorter than multiple_tap_delay) would reset gesture_delay the second time ** and only report 2 taps (the first and last). (likewise with more fast taps). BUG ? ** ** ** Drag lock mechanism: High when touched. (=: assigned, -: decreased, +: increased) ** MISSING */ static void tp_find_gestures (report_type *report) { static int finger_on_pad_timer = 0; static int time_to_forget_tap = 0; static int stroke_x; static int stroke_y; static int drag_locked = 0; if (report->fingers > 0) { /* finger down for the first time */ if (finger_on_pad_timer == 0) { stroke_x = report->x; stroke_y = report->y; } /* don't want timer to overflow */ if (finger_on_pad_timer < (tap_upper_limit_packet)) finger_on_pad_timer ++; /* dragging and consecutive tap gestures is to end with finger up * forget fast that there was a tap if this is not a part of a tap.*/ if (time_to_forget_tap > 0) time_to_forget_tap = 1; } else { /* interesting things happen when finger is up */ /* tap determination: Was the finger long enough on the pad and not too * long, while staying at the same place. */ if ((finger_on_pad_timer > (tap_lower_limit_packet)) && /* minimum finger down time */ (finger_on_pad_timer < (tap_upper_limit_packet)) && /* maximum finger down time */ ((distance((double)(stroke_x - last_report.x), /* maximum range for finger to drift while down */ (double)(stroke_y - last_report.y)) < sqr((double)tap_range)) || (multi_finger_tap_enabled && was_fingers > 1))) { /* not a consecutive tap? */ if (time_to_forget_tap == 0) gesture_delay = 0; /* right -> don't delay gesture */ else { /* a consecutive tap! */ gesture_delay = multiple_tap_delay * 80 / 1000; /* delay gesture to create multiple click */ } /* is drag locked */ if (drag_locked) { drag_locked = 0; /* unlock it and don't gesture. */ time_to_forget_tap = 0; } else time_to_forget_tap = tap_interval * 80 / 1000; /* setup gesture time to count down */ } else { /* It was not a tap */ /* a drag to lock? If user did a tap and quickly hold the finger longer than a tap. */ if (drag_lock_enabled && (time_to_forget_tap > 0) && (finger_on_pad_timer >= (tap_upper_limit_packet))) drag_locked = 1; if (time_to_forget_tap > 0) time_to_forget_tap --; if (time_to_forget_tap == 0) was_fingers=0; if (gesture_delay > 0) gesture_delay --; } # ifdef DEBUG_TAPS if (finger_on_pad_timer) gpm_report (GPM_PR_DEBUG,"A tap? %d < %d < %d && (%d)^2 + (%d)^2 < %d", tap_lower_limit_packet,finger_on_pad_timer,tap_upper_limit_packet, stroke_x-last_report.x,stroke_y-last_report.y,tap_range*tap_range); # endif finger_on_pad_timer = 0; } report->gesture = ((time_to_forget_tap > 0) && (gesture_delay == 0)) || drag_locked; } /* ** tp_process_report ** ** Process the touchpad report. Do tossing mechanism, edge mechanism (edge ** extension, corner taps), speed pressure. ** ** Tossing mechanism: High when touched. (=: assigned, -: decreased) ** (Pause) ** ________________________ _____ ______ prevent_toss ___ ** | min/max_toss_packets | < 1s | .... | ... | ** ----------------- ---------- ----- ---- ** ** is_tossing : 000000000000000000000000001111111111000000000000000000000000000000000000 ** was_tossing: 000000000000000000000000000000000001111111111111111111111111111111100000 ** toss_timer : ======================= ====================---- ... 321000== ** ** Note ** 0) When is_tossing is high a motion is reported/calculated. ** 1) if prevent_toss delay is 0 then toss to toss is allowed without pause. ** 2) if the pause is to short (< prevent_toss), the timers start over! ** 3) The 1 second limit is due to the touchpad only sends packets one second after a release. ** ** */ static void tp_process_report (Gpm_Event *state, report_type *report) { location_type loc; int edges; float pressure_speed_factor; float edge_speed_factor; int edge_motion_on; float dx, dy; /* extract location and edges */ loc.x = report->x; loc.y = report->y; edges = tp_edges (loc); if (report->fingers > 0) { if (tossing_enabled) { /* this is the cue to stop tossing, if we are tossing so Force a touch free pause before a new tossing is allowed (prevent toss time) */ was_tossing = (was_tossing || is_tossing); toss_timer = prevent_toss_packets; is_tossing = 0; /* if we start tossing then this is from where */ if (last_report.fingers == 0) { touch_loc = loc; } } /* Save the edge state, so we can detect a movement from non edge to edge. */ if (!edges) was_non_edge = 1; /* Need enough packets to perform smoothing on dy and dx * but it should work with only 2, so why is 4 required? */ if (packet_num > 3) { /* Is this start of scrolling? */ if (scrolling_enabled && !is_scrolling) is_scrolling = ((edges & scrolling_edge) && /* Note: only one &! */ !was_non_edge && /* Must start at edge */ !last_report.gesture && /* No consecutive tap */ (!corner_taps_enabled || /* Corner disabled or */ !is_corner (edges))); /* no corner */ /* ** 1) if edge motion is enabled, only activate if we moved into the edge or ** if not using the corners taps. Dont activate right away after a gesture ** from a corner tap. 2) No harm is done if activated when scrolling (as ** long as the scrolling edge is vertical). 3)If user is tap holding (then ** he cannot lift the finger and hit the touchpad boarder). */ edge_motion_on = (edges && edge_motion_enabled && (was_non_edge || !corner_taps_enabled || (!is_corner(edges) && !last_report.gesture))); edge_motion_on |= (edges && auto_scrolling_enabled && is_scrolling); edge_motion_on |= (edges && tap_hold_edge_motion_enabled && last_report.gesture && was_non_edge); /* compute the speed factor based on pressure */ pressure_speed_factor = standard_speed_factor; if (report->pressure > speed_up_pressure) { pressure_speed_factor *= 1.0 + ((report->pressure - speed_up_pressure) * speed_pressure_factor); } /* use the edge speed factor if edge_motion_speed is enabled */ edge_speed_factor = (edge_motion_speed_enabled ? pressure_speed_factor : standard_speed_factor); pressure_speed_factor = (pressure_speed_enabled ? pressure_speed_factor : standard_speed_factor); if ( auto_scrolling_enabled && is_scrolling ){ edge_speed_factor *= 1.0 + auto_scrolling_factor; } /* Calculate dx and dy depending on whether we are at an edge */ if (edge_motion_on && (edges & TOP_EDGE)) state->dy = -edge_speed * edge_speed_factor; else if (edge_motion_on && (edges & BOTTOM_EDGE)) state->dy = edge_speed * edge_speed_factor; else state->dy = (pressure_speed_factor * (((last_locs [mod4 (packet_num - 1)].y + last_locs [mod4 (packet_num - 2)].y) / 2) - ((loc.y + last_locs [mod4 (packet_num - 1)].y) / 2))); if (edge_motion_on && (edges & LEFT_EDGE)) state->dx = -edge_speed * edge_speed_factor; else if (edge_motion_on && (edges & RIGHT_EDGE)) state->dx = edge_speed * edge_speed_factor; else state->dx = (pressure_speed_factor * (((loc.x + last_locs [mod4 (packet_num - 1)].x) / 2) - ((last_locs [mod4 (packet_num - 1)].x + last_locs [mod4 (packet_num - 2)].x) / 2))); } /* If (packet_num > 3)*/ last_locs [mod4 (packet_num)] = loc; was_edges = edges; packet_num++; } else { /* No finger on the pad */ /* Start the tossing action if enabled */ if (tossing_enabled && was_fingers == 1 && !was_tossing && !is_scrolling && (packet_num > min_toss_packets) && (packet_num < max_toss_packets)) { dx = last_locs [mod4 (packet_num - 1)].x - touch_loc.x; dy = - (last_locs [mod4 (packet_num - 1)].y - touch_loc.y); #if DEBUG_TOSS gpm_report (GPM_PR_INFO,"dx: %2.1f dy: %2.1f tdist^2: %2.1f", dx, dy, distance (dx, dy)); #endif if (distance (dx, dy) > min_toss_dist__2) { is_tossing = 1; /* determine the toss speed */ if (does_toss_use_static_speed) { toss_speed.x = (static_toss_speed * standard_speed_factor * dx / (abs (dx) + abs (dy))); toss_speed.y = (static_toss_speed * standard_speed_factor * dy / (abs (dx) + abs (dy))); } else { toss_speed.x = dx * standard_speed_factor * toss_speed_factor; toss_speed.y = dy * standard_speed_factor * toss_speed_factor; } #if DEBUG_TOSS gpm_report (GPM_PR_INFO,"tossx: %d tossy: %d", toss_speed.x, toss_speed.y); #endif } } /* no fingers therefore: no edge, and restart packet count */ was_non_edge = 0; is_scrolling = 0; scrolling_speed_timer = 0; packet_num = 0; } /* if we are tossing then apply the toss speed */ if (tossing_enabled && is_tossing) { state->dx = toss_speed.x; state->dy = toss_speed.y; } /* if we are scrolling then stop moving and report wheel amount. The reason ** for having this above buttons actions is buttons can then move the ** mouse while scrolling. */ if ((scrolling_enabled && is_scrolling) || is_always_scrolling){ scrolling_amount_left -= state->dy; state->dx = 0; state->dy = 0; } /* check for (corner)buttons if we didn't just complete a toss or is scrolling */ if (!is_tossing && !was_tossing && !is_scrolling) { /* ** If there is no gesture then there are no buttons, but dont clear if we ** are about to make a double tap. Otherwise compute new buttons. */ if (!report->gesture && !report->left && !report->right && !report->middle && !report->fourth ) { if (!gesture_delay && !fake_time_to_forget_tap) { last_corner_action = GPM_B_NOT_SET; last_finger_action = GPM_B_NOT_SET; } state->buttons = GPM_B_NONE; } else { tp_process_button_press (state, report); if(tap_gesture_enabled) tp_process_finger_taps (state, report); if(corner_taps_enabled) tp_process_corner_taps (state, report); } } /* Is there any amount of scrolling left? Should be checked after corner actions. */ if (scrolling_amount_left != 0){ tp_handle_scrolling(state); } was_tossing = was_tossing && toss_timer; if (was_tossing) toss_timer--; /* remember the last state of the finger for toss processing */ last_report = *report; last_state = *state; /* Dont do anything if the pad is not enabled, but after corner actions are * done so it can be turn on again. */ if (!touchpad_enabled){ state->buttons = GPM_B_NONE; state->dx = 0; state->dy = 0; } #if DEBUG_REPORTS tp_dump_report_data (*report, edges, state); #endif } /* ** syn_read_config_file ** ** Read the configuration data from the global config file ** SYSCONFDIR "/gpm-syn.conf". */ void tp_read_config_file (char* config_filename) { char line [80]; char *token; char *end_ptr; int param, tmp_read_int_param; FILE *config; char full_filename[100]; int status; float tmp_read_float_param; status = snprintf(full_filename,100,SYSCONFDIR "/%s",config_filename); if (status < 0) { gpm_report (GPM_PR_WARN,"Too long path for configure file: %s", config_filename); return; } if ( !(config = fopen (full_filename, "r")) ) { gpm_report (GPM_PR_WARN,"Failed to open configfile: %s", full_filename); }else{ while (fgets (line, 80, config)) { if (line [0] == '[') { if ( (token = strtok (line, "[] \t")) ) { param = 0; /* which param is it */ while (param_data [param].name && strcasecmp (token, param_data [param].name) != 0) { param++; } /* was a param found? */ if (!param_data [param].name) { gpm_report (GPM_PR_WARN,"Unknown parameter %s", token); } else { token = strtok (NULL, "[] \t"); switch (param_data [param].p_type) { case Integer_Param: tmp_read_int_param = strtol (token, &end_ptr, 0); if (end_ptr != token) *(param_data [param].addr.int_p) = tmp_read_int_param; else gpm_report (GPM_PR_WARN,"Integer value (%s) for parameter %s is invalid", token, param_data [param].name); # if DEBUG_PARAMS gpm_report (GPM_PR_INFO,"Param %s set to %d", param_data [param].name, *(param_data [param].addr.int_p)); # endif break; case Float_Param: tmp_read_float_param = strtod (token, &end_ptr); if (end_ptr != token) *(param_data [param].addr.float_p) = tmp_read_float_param; else gpm_report (GPM_PR_WARN,"Float value (%s) for parameter %s is invalid", token, param_data [param].name); # if DEBUG_PARAMS gpm_report (GPM_PR_INFO,"Param %s set to %3.3f", param_data [param].name, *(param_data [param].addr.float_p)); # endif break; case Flag_Param: if (index ("YyTt1", token [0])) { *(param_data [param].addr.flag_p) = 1; } else if (index ("NnFf0", token [0])) { *(param_data [param].addr.flag_p) = 0; } else { gpm_report (GPM_PR_WARN,"Flag value (%s) for parameter %s is invalid", token, param_data [param].name); } # if DEBUG_PARAMS gpm_report (GPM_PR_INFO,"Param %s set to %s", param_data [param].name, (*(param_data [param].addr.flag_p) ? "True" : "False")); # endif break; case Action_Param: tmp_read_int_param = strtol (token, &end_ptr, 0); if (end_ptr != token) param_data [param].addr.corner_p->action = tmp_read_int_param; else gpm_report (GPM_PR_WARN,"Action value (%s) for parameter %s is invalid", token, param_data [param].name); # if DEBUG_PARAMS gpm_report (GPM_PR_INFO,"Param %s set to %d", param_data [param].name, param_data [param].addr.corner_p->action); # endif break; default: ; } } } } } fclose (config); } } /* ** syn_process_touchpad_config ** ** Extract important information and report (as desired) to the user. */ static void syn_process_config (info_type ident, model_id_type model) { sensor[0] = syn_get_sensor_info (model.info_sensor); gpm_report (GPM_PR_INFO, " Firmware version %d.%d\n", ident.info_major, ident.info_minor); tp_read_config_file ("gpm-syn.conf"); /* Limit the options depending on the touchpad capabilities. This should be done after reading the configure file so they may be turned off on purpose and can'nt be turned on if not supported. */ if(!capabilities[0].cap_ext){ wmode_enabled = 0; } if(!wmode_enabled || !capabilities[0].cap_palm_detect){ palm_detect_enabled = 0; } if(!wmode_enabled || !capabilities[0].cap_stick){ stick_enabled = 0; stick_pressure_enabled = 0; } /* fake_forget_tap_interval must be set if the hardware does the gesture. */ if(!wmode_enabled) fake_forget_tap_interval = 1; /* Save important information */ x_per_mm = sensor[0]->x_per_mm; y_per_mm = sensor[0]->y_per_mm; res_x = (int) (x_per_mm * sensor[0]->width_mm); res_y = (int) (y_per_mm * sensor[0]->height_mm); /* convert the tap times to packets (80 pkts/sec and 1000 ms/sec) */ tap_lower_limit_packet = tap_lower_limit * 80 / 1000; tap_upper_limit_packet = tap_upper_limit * 80 / 1000; /* Convert the toss dist to touchpad resolution from mm */ min_toss_dist__2 = sqr (min_toss_dist * (x_per_mm + y_per_mm) / 2); /* convert the toss times to packets (80 pkts/sec and 1000 ms/sec) */ max_toss_packets = max_toss_time * 80 / 1000; min_toss_packets = min_toss_time * 80 / 1000; prevent_toss_packets = prevent_toss_time * 80 / 1000; } /**************************************************************************** ** ** ROUTINES for interfacing to a SERIAL touchpad ** ****************************************************************************/ static unsigned char tp_hextoint (unsigned char byte1, unsigned char byte2) { unsigned char bytes [3]; int result; bytes [0] = byte1; bytes [1] = byte2; bytes [2] = '\0'; sscanf (bytes, "%x", &result); return result; } static void tp_serial_flush_input (int fd) { struct timeval tv; fd_set rfds; unsigned char junk; FD_ZERO(&rfds); FD_SET (fd, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; usleep (50000); while (select (fd+1, &rfds, NULL, NULL, &tv) == 1) { #if DEBUG_FLUSH gpm_report (GPM_PR_INFO,"Serial tossing"); fflush (stdout); #endif read (fd, &junk, 1); #if DEBUG_FLUSH gpm_report (GPM_PR_INFO," %c", junk); #endif FD_ZERO(&rfds); FD_SET (fd, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; } } static void tp_serial_read (int fd, unsigned char *bytes, size_t count) { struct timeval tv; fd_set rfds; int num_read = 0; int read_count; FD_ZERO (&rfds); FD_SET (fd, &rfds); tv.tv_sec = 1; tv.tv_usec = 0; while ((select (fd+1, &rfds, NULL, NULL, &tv) == 1) && (num_read < count)) { read_count = read (fd, &bytes [num_read], count - num_read); num_read += read_count; FD_ZERO (&rfds); FD_SET (fd, &rfds); } for (; num_read < count; num_read++) { bytes [num_read] = '\0'; } } /* Write a string of commands */ static void tp_serial_send_cmd(int fd, unsigned char *cmd) { unsigned char junk [15]; tp_serial_flush_input (fd); write (fd, cmd, strlen (cmd)); tp_serial_read (fd, junk, strlen (cmd)); #if DEBUG_FLUSH junk [strlen (cmd)] = '\0'; gpm_report (GPM_PR_DEBUG,"serial tossing: %s", junk); #endif } /* write 'mode' to a serial touchpad, STIG 58 */ static void syn_serial_set_mode (int fd, unsigned char mode) { unsigned char bytes [15]; sprintf (bytes, "%%C3B%02X5555", mode); #if DEBUG_SENT_DATA gpm_report (GPM_PR_DEBUG,"modes: %s", bytes); #endif tp_serial_send_cmd (fd, bytes); } /* read the identification from the serial touchpad, STIG 57*/ static void syn_serial_read_ident (int fd, info_type *info) { unsigned char bytes [5]; tp_serial_send_cmd (fd, "%A"); tp_serial_read (fd, bytes, 4); #if DEBUG_SENT_DATA bytes [4] = '\0'; gpm_report (GPM_PR_INFO,"Serial ident: %s", bytes); #endif if ( bytes [0] == 'S' && bytes [0] == 'T'){ /* reformat the data * The out commented is wrong according to STIG page 57.*/ /* info->info_model_code = (bytes [2] & 0x07) >> 3; */ info->info_model_code = bytes [2] >> 3; info->info_major = (bytes [2] & 0x07); info->info_minor = bytes [3]; }else{ gpm_report (GPM_PR_ERR,"PS/2 serial device doesn't appear to be a synaptics touchpad\n"); info->info_model_code = 0; info->info_minor = 0; info->info_major = 0; } } /* read the model_id from the serial touchpad (in ps/2 format) */ static void syn_serial_read_model_id (int fd, model_id_type *model) { unsigned char bytes [7]; int model_int; /* * for older touchpads this command is not supported and no response will * come. We should do non blocking input here to handle that case * and return byte2 as 0x47 ... later. * * pebl: It is easier just to check version number less than 3.2, STIG page 60. */ if ( (ident[0].info_major >= 4) || (ident[0].info_major == 3 && ident[0].info_minor >= 2)){ tp_serial_send_cmd (fd, "%D"); tp_serial_read (fd, bytes, 6); /* reformat the data */ model_int = ((tp_hextoint (bytes [0], bytes [1]) << 16) | (tp_hextoint (bytes [2], bytes [3]) << 8) | (tp_hextoint (bytes [4], bytes [5]))); # if DEBUG_SENT_DATA bytes [6] = '\0'; gpm_report (GPM_PR_DEBUG,"Serial model id: %s", bytes); # endif }else{ model_int = 0; } syn_extract_model_id_info (model_int, model); } /* read the mode bytes and capabilities from the serial touchpad, STIG 57 */ static void syn_serial_read_cap (int fd, ext_cap_type *cap) { unsigned char bytes [8]; int cap_int = 0; tp_serial_send_cmd (fd, "%B"); tp_serial_read (fd, bytes, 8); #if DEBUG_SENT_DATA bytes [7] = '\0'; gpm_report (GPM_PR_DEBUG,"Serial capabilites: %s", bytes); #endif if (ident[0].info_major >= 4){ if (bytes [0] == '3' && bytes [0] == 'B'){ cap_int = ((tp_hextoint (bytes [4], bytes [5]) << 8) | (tp_hextoint (bytes [6], bytes [7]))); }else{ gpm_report (GPM_PR_ERR,"PS/2 serial device doesn't appear to be a synaptics touchpad\n"); } } syn_extract_extended_capabilities(cap_int,cap); } /*------------------------------------------------------------------------*/ /* PS/2 Utility functions. */ /* Adapted from tpconfig.c by C. Scott Ananian */ /*------------------------------------------------------------------------*/ /* PS2 Synaptics is using LSB, STIG page 29. ** ** After power on or reset the touchpads are set to these defaults: ** 100 samples per second ** Resolution is 4 counts per mm ** Scaling 1:1 ** Stream mode is selected ** Data reporting is disabled ** Absolute mode is disabled */ /* Normal ps2 commands, Command set is on STIG page 33 */ #define PS2_RESET 0xFF /* Reset */ #define PS2_RESEND 0xFE /* Resend command */ #define PS2_SET_DEFAULT 0xF6 /* Set default */ #define PS2_DISABLE_DATA 0xF5 /* Stop sending motion data packets */ #define PS2_ENABLE_DATA 0xF4 /* Start sending motion data packets */ #define PS2_SAMPLE_RATE 0xF3 /* Set sample rate to value in a following byte */ #define PS2_READ_DEVICE 0xF2 /* Read device type (ack and idcode) */ #define PS2_REMOTE_MODE 0xF0 /* Set touchpad in remote mode */ #define PS2_WRAP_MODE 0xEE /* Enter wrap mode */ #define PS2_END_WRAP_MODE 0xEE /* Leave wrap mode */ #define PS2_READ_DATA 0xEB /* Read move data (in remote mode)*/ #define PS2_STREAM_MODE 0xEA /* Enter stream mode (device sends move data) */ #define PS2_STATUS_REQ 0xE9 /* Ask for status request */ #define PS2_RESOLUTION 0xE8 /* Set resolution to next transmitted byte */ #define PS2_SCALE_12 0xE7 /* Set scale to 1:2 */ #define PS2_SCALE_11 0xE6 /* Set scale to 1:1 */ /* Normal ps2 responce */ #define PS2_ERROR 0xFC /* Error, after a reset,resend or disconnect*/ #define PS2_ACK 0xFA /* Command acknowledge */ #define PS2_READY 0xAA /* Send after a calibration or ERROR */ #define PS2_MOUSE_IDCODE 0x00 /* Identification code (meaning mouse) sent after a PS2_READY */ /* Additional synaptic commands*/ #define PS2_SYN_CMD 0xE8 /* Four of these each with an following byte encodes a command*/ #define PS2_SYN_INERT 0xE6 /* This ps2 command is ignored by synaptics */ #define PS2_SYN_SET_MODE1 0x0A /* Set the mode byte 1 instead of sample rate (used after a sample rate cmd) */ #define PS2_SYN_SET_MODE2 0x14 /* Set the mode byte 2 instead of sample rate (used after a sample rate cmd). * All other sample rate gives undefined behavior (used to address 4 byte mode)*/ #define PS2_SYN_SET_STICK 0x28 /* Send byte to stick */ #define PS2_SYN_STATUS_OK 0x47 /* Special synaptics Status report is recognized */ /* These are the commands that can be given (encoded) by PS_SYN_CMD */ #define PS2_SYN_CMD_IDENTIFY 0x00 /* Identify Touchpad */ #define PS2_SYN_CMD_MODES 0x01 /* Read Touchpad Modes */ #define PS2_SYN_CMD_CAPABILITIES 0x02 /* Read capabilities */ #define PS2_SYN_CMD_MODEL_ID 0x03 /* Read model id */ #define PS2_SYN_CMD_SERIAL_NO_P 0x06 /* Read serial number prefix */ #define PS2_SYN_CMD_SERIAL_NO_S 0x07 /* Read serial number suffix */ #define PS2_SYN_CMD_RESOLUTIONS 0x08 /* Read resolutions */ /* read a byte from the ps/2 port */ static byte tp_ps2_getbyte(int fd) { byte b; # ifdef DEBUG_GETBYTE gpm_report(GPM_PR_DEBUG,"Getting byte"); # endif read(fd, &b, 1); # ifdef DEBUG_GETBYTE gpm_report(GPM_PR_DEBUG,"Got %X",b); # endif return b; } /* write a byte to the ps/2 port, handling resend.*/ static byte tp_ps2_putbyte(int fd, byte b) { byte ack; # ifdef DEBUG_PUTBYTE gpm_report(GPM_PR_DEBUG,"Send real byte %X",b); # endif write(fd, &b, 1); read(fd, &ack, 1); if (ack == PS2_RESEND) { write(fd, &b, 1); read(fd, &ack, 1); } # ifdef DEBUG_PUTBYTE_ACK gpm_report(GPM_PR_DEBUG,"Responce %X to byte %X",ack,b); # endif return ack; } /* Read a byte from the touchpad or use the Synaptics extended ps/2 syntax to * read a byte from the stick device. The variable stick is used to indicate * whether it is the touchpad or stick device that is meant. */ static byte syn_ps2_getbyte(int fd, int stick) { byte response[6]; if (!stick) { response[1]=tp_ps2_getbyte(fd); } else { response[0]=tp_ps2_getbyte(fd); response[1]=tp_ps2_getbyte(fd); response[2]=tp_ps2_getbyte(fd); response[3]=tp_ps2_getbyte(fd); response[4]=tp_ps2_getbyte(fd); response[5]=tp_ps2_getbyte(fd); /* Do some sanity checking */ if((response[0] & 0xFC) != 0x84) { gpm_report (GPM_PR_ERR,"Byte 0 of stick device responce is not valid"); return -1; } if((response[3] & 0xCC) != 0xC4) { gpm_report (GPM_PR_ERR,"Byte 3 of stick device responce is not valid"); return -1; } } return response[1]; } /* write byte to the touchpad or use the Synaptics extended ps/2 syntax to write * a byte to the stick device. The variable stick is used to indicate * whether it is the touchpad or stick device that is meant. */ static void syn_ps2_putbyte(int fd, int stick, byte b) { byte ack; # ifdef DEBUG_PUTBYTE gpm_report(GPM_PR_DEBUG,"Send byte %X to %s",b,(stick?"Stick":"Touchpad")); # endif if (!stick) { ack = tp_ps2_putbyte(fd,b); } else { syn_ps2_send_cmd(fd, DEVICE_TOUCHPAD, b); ack = tp_ps2_putbyte(fd, PS2_SAMPLE_RATE); if (ack != PS2_ACK) gpm_report (GPM_PR_ERR,"Invalid ACK to stick putbytet sample rate"); ack = tp_ps2_putbyte(fd, PS2_SYN_SET_STICK); if (ack != PS2_ACK) gpm_report (GPM_PR_ERR,"Invalid ACK to stick putbytet set stick"); ack = syn_ps2_getbyte(fd,DEVICE_STICK); } if (ack != PS2_ACK) gpm_report (GPM_PR_ERR,"Invalid ACK to synps2 %s putbyte %02X, got %02X", (stick?"Stick":"Touchpad"),b,ack); } /* use the Synaptics extended ps/2 syntax to write a special command byte * STIG page 36: Send exactly four PS2_SYN_CMD (which is otherwise ignored) * and after each a byte with the 2 first bits being the command (LSB). End it with * either PS2_SAMPLE_RATE or PS2_STATUS_REQ. It is hinted to send an inert command * first so not having five or more PS2_SYN_CMD by coincident. * * If data is for the stick device every byte has to be encode by the above method. */ static void syn_ps2_send_cmd(int fd, int stick, byte cmd) { int i; # ifdef DEBUG_CMD gpm_report(GPM_PR_DEBUG,"Send Command %X to %s",cmd,(stick?"Stick":"Touchpad")); # endif /* initialize with 'inert' command */ tp_ps2_putbyte(fd, PS2_SYN_INERT); for (i=0; i<4; i++) { syn_ps2_putbyte(fd, stick, PS2_SYN_CMD); syn_ps2_putbyte(fd, stick, (cmd>>6)&0x3); cmd<<=2; } } #if 0 /* write 'cmd' to mode byte 1. * This function is not used. * Code 0x0A is unknown to me, maybe used in older synaptics? * * This is used for some old 2 byte control synaptics. The function is not * used, and is probably leftover from mixing with Van der Plas code. */ static void syn_ps2_set_mode1(int fd, int stick, byte cmd) { syn_ps2_send_cmd(fd, stick, cmd); tp_ps2_putbyte(fd, stick, PS2_SAMPLE_RATE); tp_ps2_putbyte(fd, stick, PS2_SYN_SET_MODE1); } #endif /* write 'cmd' to mode byte 2 * See ps2_send_cmd. PS2_SR_SET_MODE stores the touchpad mode encoded in the * four PS2_SYN_CMD commands */ static void syn_ps2_set_mode2(int fd, int stick, byte cmd) { syn_ps2_send_cmd(fd, stick, cmd); syn_ps2_putbyte (fd, stick, PS2_SAMPLE_RATE); syn_ps2_putbyte (fd, stick, PS2_SYN_SET_MODE2); } /* read three byte status ('a','b','c') corresponding to register 'cmd' * Special status request for synaptics is given after a cmd. * Byte b is PS2_SYN_STATUS_OK to recognize a synaptics */ static void syn_ps2_status_rqst(int fd, int stick, byte cmd, byte *bytes) { gpm_report (GPM_PR_INFO,"Status request for %s, %X", (stick?"stick":"touchpad"),cmd); syn_ps2_send_cmd(fd, stick, cmd); syn_ps2_putbyte (fd, stick, PS2_STATUS_REQ); bytes [0]=syn_ps2_getbyte(fd,stick); bytes [1]=syn_ps2_getbyte(fd,stick); bytes [2]=syn_ps2_getbyte(fd,stick); gpm_report (GPM_PR_INFO,"Status request %X %X %X", bytes[0], bytes[1], bytes[2]); } #if 0 /* read the modes from the touchpad (in ps/2 format) */ static void syn_ps2_read_modes (int fd, int stick) { unsigned char bytes [3]; syn_ps2_status_rqst (fd, stick, PS2_SYN_CMD_MODES, bytes); # ifdef DEBUG gpm_report (GPM_PR_INFO,"Synaptic PS/2 %s modes: %02X", (stick?"stick":"touchpad"),bytes [2]); # endif } #endif /* read the identification from the ps2 touchpad */ static void syn_ps2_read_ident (int fd, int stick, info_type *info) { byte bytes [3]; syn_ps2_status_rqst (fd, stick, PS2_SYN_CMD_IDENTIFY, bytes); if (bytes [1] != PS2_SYN_STATUS_OK) { gpm_report (GPM_PR_ERR,"PS/2 device doesn't appear to have synaptics %s identification\n", (stick?"sticks":"touchpads")); info->info_minor = 0; info->info_model_code = 0; info->info_major = 0; } else { info->info_minor = bytes [0]; info->info_model_code = (bytes [2] >> 4) & 0x0f; info->info_major = bytes [2] & 0x0f; } } /* read the model_id from the ps2 touchpad/stick */ static void syn_ps2_read_model_id (int fd, int stick, model_id_type *model) { unsigned char bytes [3]; int model_int; syn_ps2_status_rqst (fd, stick, PS2_SYN_CMD_MODEL_ID, bytes); model_int = ((bytes [0] << 16) | (bytes [1] << 8) | (bytes [2])); syn_extract_model_id_info (model_int, model); } /* read the extended capability from the ps2 touchpad, STIG page 15 */ static void syn_ps2_read_cap (int fd, int stick, ext_cap_type *cap) { unsigned char bytes [3]; int ext_cap_int; syn_ps2_status_rqst (fd, stick, PS2_SYN_CMD_CAPABILITIES, bytes); if (bytes [1] != PS2_SYN_STATUS_OK) { gpm_report (GPM_PR_ERR,"PS/2 device doesn't appear to have synaptics %s capabilities\n", (stick?"stick":"touchpad")); ext_cap_int = 0; }else{ ext_cap_int = bytes[0] << 8 | bytes[2]; } syn_extract_extended_capabilities(ext_cap_int, cap); } /* * ps2_disable_data * * Disable data reporting (streaming), and flush eventual old packets. As the * kernel keeps a queue of received data from the touchpad, the next byte we * read could be old data and not the ack to our command or request. Disable * data should always be called before sending commands or request to the * touchpad. * * Note that this is a general ps2 command which should not be in this file, * but in mice.c. */ static void tp_ps2_disable_data (int fd) { struct timeval tv; fd_set rfds; unsigned char status; byte cmd = PS2_DISABLE_DATA; FD_ZERO(&rfds); FD_SET (fd, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; write(fd,&cmd,1); usleep (50000); while (select (fd+1, &rfds, NULL, NULL, &tv) == 1) { read (fd, &status, 1); #if DEBUG_RESET gpm_report (GPM_PR_INFO,"PS/2 device disable data flush: %02X", status); #endif FD_ZERO(&rfds); FD_SET (fd, &rfds); tv.tv_sec = 0; tv.tv_usec = 0; } if (status != PS2_ACK) gpm_report (GPM_PR_ERR,"Invalid ACK to disable stream command, got %02X",status); } /* * syn_ps2_enable_data * * Enable data after a disable data command. Should have called the disable data * before calling this function. */ static void syn_ps2_enable_data(int fd) { if (stick_enabled) syn_ps2_putbyte(fd,DEVICE_STICK,PS2_ENABLE_DATA); syn_ps2_putbyte(fd,DEVICE_TOUCHPAD,PS2_ENABLE_DATA); } /* * syn_ps2_send_reset * * Send reset command and absorb additional READY, IDCODE from the * touchpad. Should have called the disable data before calling this function. * Synaptics garanties always to return PS2_READY. STIG page 31 and 48. */ static void syn_ps2_send_reset(int fd, int stick) { byte status,id_code = PS2_MOUSE_IDCODE; byte reset_cmd = PS2_RESET; gpm_report(GPM_PR_DEBUG,"Reseting Synaptic PS/2 %s\n",(stick?"Stick":"Touchpad")); /* Send reset command without eating the ack. */ if(!stick) { write(fd,&reset_cmd,1); status = tp_ps2_getbyte(fd); } else { syn_ps2_putbyte(fd, stick, reset_cmd); status = PS2_ACK; } /* Sometimes the touchpad sends additional ready,idcode before ack the reset command. * I dont know why! */ while (status == PS2_READY){ gpm_report(GPM_PR_INFO,"PS/2 device sending additional READY, ID CODE.\n"); id_code = syn_ps2_getbyte(fd,stick); status = syn_ps2_getbyte(fd,stick); } if (status != PS2_ACK || id_code != PS2_MOUSE_IDCODE){ gpm_report(GPM_PR_ERR,"Sending reset command to PS/2 Device failed: No ACK, got %02X.\n",status); } /* Wait 750 ms to recalibrate. */ usleep(750000); if ( (status = syn_ps2_getbyte(fd,stick)) != PS2_READY ){ gpm_report(GPM_PR_ERR,"Reseting PS/2 Device failed: No READY, got %02X.\n" "Check pc_keyb.c for reconnect smartness.\n",status); } if ( (id_code = syn_ps2_getbyte(fd,stick)) != PS2_MOUSE_IDCODE){ gpm_report(GPM_PR_ERR,"Reseting PS/2 Device failed: Wrong ID, got %02X.\n",id_code); } } /* ** syn_ps2_absolute_mode ** ** Put the touchpad into absolute mode. */ static void syn_ps2_absolute_mode(int fd) { /* select 6 byte packet, high packet rate, no-sleep */ syn_ps2_set_mode2 (fd, DEVICE_TOUCHPAD, (ABSOLUTE_MODE | HIGH_REPORT_RATE | PS2_NO_SLEEP | (wmode_enabled ? NO_TAPDRAG_GESTURE : TAPDRAG_GESTURE) | (stick_enabled ? STICK_ENABLED : STICK_DISABLE) | (wmode_enabled ? REPORT_W_ON : REPORT_W_OFF))); } /**************************************************************************** ** ** TRANSLATE FUNCTIONS the incoming data to an uniform report ** ****************************************************************************/ /* SERIAL PACKETS * STIG page 63, note 7 bit! * * byte 0 | 1 | reserved | gesture | finger | left | middle | right| * byte 1 | 0 | x-pos 7-12 | * byte 2 | 0 | x-pos 1-6 | * byte 3 | 0 | y-pos 7-12 | * byte 4 | 0 | y-pos 1-6 | * byte 5 | 0 | z pressure 7-2 | * byte 6 | 0 | down | up |y-pos 0 | x-pos 0 | z pressure 0-1 | (new_abs set) * byte 7 | 0 | reserved | W mode 0-3 | (new_abs and wmode set) */ static void syn_serial_translate_data (unsigned char *data, report_type *report) { report->gesture = check_bits (data [0], 0x10); report->fingers = check_bits (data [0], 0x08); report->left = check_bits (data [0], 0x04); report->middle = check_bits (data [0], 0x02); report->right = check_bits (data [0], 0x01); report->x = (data [1] << 7) | (data [2] << 1); report->y = (data [3] << 7) | (data [4] << 1); report->pressure = data [5] << 2; report->fourth = 0; report->up = 0; report->down = 0; report->w = 0; report->fingerwidth = 0; if (model[0].info_new_abs){ report->up = check_bits (data [6], 0x20); report->down = check_bits (data [6], 0x40); report->y |= (data [6] & 0x08) >> 3; report->x |= (data [6] & 0x04) >> 2; report->pressure |= (data [6] & 0x03); if (wmode_enabled){ report->w = (data [7] & 0x0F); } } } /* PS2 PACKETS * * Handle error packets. It may be garbage or not, as the synaptics pad keeps sending data 1 * sec after last touch. */ static void syn_ps2_translate_error(unsigned char *data, report_type *report) { gpm_report(GPM_PR_WARN,"Unrecognized Synaptic PS/2 Touchpad packet: %02X %02X %02X %02X %02X %02X", data [0],data [1],data [2],data [3],data [4],data [5]); if (reset_on_error_enabled) { /* Hack to get the fd: which_mouse is the current mouse, and as the synaptic code is called, it is the current mouse. */ syn_ps2_reset(which_mouse->fd); syn_ps2_absolute_mode(which_mouse->fd); } report->left = 0; report->middle = 0; report->right = 0; report->fourth = 0; report->up = 0; report->down = 0; report->x = 0; report->y = 0; report->pressure = 0; report->gesture = 0; report->fingers = 0; report->fingerwidth = 0; report->w = 0; } /* * STIG page 42 * wmode = 0, newer version. Gesture, right and left are repeated. * * byte 0 | 1 | 0 | Finger | Reserved | 0 | Gesture | Right | Left | * byte 1 | y-pos 11-8 | x-pos 11-8 | * byte 2 | z pressure 0-7 | * byte 3 | 1 | 1 | y-pos 12 | x-pos 12 | 0 | Gesture | Right | Left | * byte 4 | x - pos 0-7 | * byte 5 | y - pos 0-7 | * * STIG page 43 * wmode = 0, old version < 3.2. * Second is a second gesture!? * * byte 0 | 1 | 1 | z-pres 6-7 | Second | Gesture | Right | Left | * byte 1 | finger | 0 | 0 | x-pos 12-8 | * byte 2 | x-pos 0-7 | * byte 3 | 1 | 0 | z-pressure 0-5 | * byte 4 |Reserved | 0 | 0 | y - pos 8-12 | * byte 5 | y - pos 0-7 | * */ /* Translate the reported data into a record for processing */ static void syn_ps2_translate_data (unsigned char *data, report_type *report) { /* Check that this is indeed an absolute 6 byte new version packet*/ if (((data [0] & 0xc8) == 0x80) && /* Check static in byte 0 */ ((data [3] & 0xc8) == 0xc0) && /* Check static in byte 3 */ ((data [0] & 0x0F) == (data [3] & 0x0F))) { /* check repeated data */ report->left = check_bits (data [0], 0x01); report->middle = 0; report->right = check_bits (data [0], 0x02); report->fourth = 0; report->up = 0; report->down = 0; report->x = (((data [1] & 0x0F) << 8) | ((data [3] & 0x10) << 8) | ((data [4]))); report->y = (((data [1] & 0xF0) << 4) | ((data [3] & 0x20) << 7) | ((data [5]))); report->pressure = data [2]; report->gesture = check_bits (data [0], 0x04); report->fingers = check_bits (data [0], 0x20); report->fingerwidth = 0; report->w = 0; } /*th Old style packet maybe */ else if (((data [0] & 0xC0) == 0xC0) && /* Static in byte 0*/ ((data [1] & 0x60) == 0x00) && /* Static in byte 1*/ ((data [3] & 0xC0) == 0x80) && /* Static in byte 3*/ ((data [4] & 0x60) == 0x00)) { /* Static in byte 4*/ report->left = check_bits (data [0], 0x01); report->middle = 0; report->right = check_bits (data [0], 0x02); report->fourth = 0; report->up = 0; report->down = 0; report->x = (((data [1] & 0x1F) << 8) | ((data [2]))); report->y = (((data [4] & 0x1f) << 8) | ((data [5]))); report->pressure = (((data [0] & 0x30) << 2 ) | ((data [3] & 0x3f))); report->gesture = check_bits (data [0], 0x04); report->fingers = check_bits (data [1], 0x80); report->fingerwidth = 0; report->w = 0; } else { syn_ps2_translate_error(data,report); } } /* STIG page 42 * wmode = 1, * * byte 0 | 1 | 0 | W 2-3 | 0 | W 1 | Right | Left | * byte 1 | y-pos 11-8 | x-pos 11-8 | * byte 2 | z pressure 0-7 | * byte 3 | 1 | 1 | y-pos 12 | x-pos 12 | 0 | W 0 | R/D | L/U | * byte 4 | x - pos 0-7 | * byte 5 | y - pos 0-7 | * */ static void syn_ps2_translate_wmode_data (unsigned char *data, report_type *report) { /* Check that it is an absolute packet */ if (((data[0] & 0xc8) == 0x80) && ((data[3] & 0xc8) == 0xc0)) { report->left = check_bits (data[0], 0x01); report->middle = check_bits (data[0] ^ data[3], 0x01); report->right = check_bits (data[0], 0x02); report->fourth = check_bits (data[0] ^ data[3], 0x02); report->up = 0; report->down = 0; report->x = (((data[1] & 0x0F) << 8) | ((data[3] & 0x10) << 8) | ((data[4]))); report->y = (((data[1] & 0xF0) << 4) | ((data[3] & 0x20) << 7) | ((data[5]))); report->pressure = data[2]; report->fingers = 0; report->fingerwidth = 0; report->gesture = 0; report->w = (((data[3] & 0x04) >> 2) | ((data[0] & 0x04) >> 1) | ((data[0] & 0x30) >> 2)); } else { syn_ps2_translate_error(data,report); } } /**************************************************************************** ** ** INTERFACE ROUTINES ** ****************************************************************************/ /* ** syn_process_serial_data ** ** Process the touchpad 6 byte report. */ void syn_process_serial_data (Gpm_Event *state, unsigned char *data) { /* initialize the state */ state->buttons = 0; state->dx = 0; state->dy = 0; syn_serial_translate_data (data, &cur_report); if (wmode_enabled){ syn_process_wmode_report(&cur_report); } if (tp_find_fingers(&cur_report,state)) return; if (wmode_enabled){ tp_find_gestures(&cur_report); } tp_process_report (state, &cur_report); } /* ** syn_serial_reset ** ** Reset the touchpad to relative mode. This cannot be called directly as a ** command should be sent in 1200 baud, not 9600. */ void syn_serial_reset(int fd) { gpm_report (GPM_PR_INFO,"Reseting Synaptic Serial Touchpad."); syn_serial_set_mode (fd, (RELATIVE_MODE | HIGH_REPORT_RATE | USE_9600_BAUD | NORMAL_REPORT | REPORT_W_OFF)); } /* ** syn_serial_init ** ** Initialize the synaptics touchpad. Read model and identification. ** Determine the size of the touchpad in "pixels". Select 6/7/8 byte packets, ** select 9600 baud, and select high packet rate. */ int syn_serial_init (int fd) { int return_packetlength; gpm_report(GPM_PR_DEBUG,"Initializing Synaptics Serial TouchPad"); syn_serial_read_ident (fd, &ident[0]); syn_serial_read_model_id (fd, &model[0]); syn_serial_read_cap(fd, &capabilities[0]); syn_process_config (ident[0], model[0]); syn_dump_info(0); /* Change the protocol to use either 6,7 or 8 bytes, STIG 63 */ if (model[0].info_new_abs){ if (wmode_enabled){ return_packetlength = 8; }else{ return_packetlength = 7; } }else{ return_packetlength = 6; wmode_enabled = 0; } syn_serial_set_mode (fd, (ABSOLUTE_MODE | HIGH_REPORT_RATE | USE_9600_BAUD | (model[0].info_new_abs ? EXTENDED_REPORT : NORMAL_REPORT) | (wmode_enabled ? REPORT_W_ON : REPORT_W_OFF))); return return_packetlength; } /* ** syn_process_ps2_data ** ** Process the touchpad 6 byte report. */ void syn_process_ps2_data (Gpm_Event *state, unsigned char *data) { /* gpm_report(GPM_PR_DEBUG,"Data %02x %02x %02x %02x %02x %02x",data[0],data[1],data[2],data[3],data[4],data[5]); */ /* initialize the state */ state->buttons = 0; state->dx = 0; state->dy = 0; if (wmode_enabled) { syn_ps2_translate_wmode_data (data, &cur_report); if (syn_ps2_process_extended_packets(data,&cur_report,state)) return; syn_process_wmode_report(&cur_report); if (tp_find_fingers(&cur_report,state)) return; tp_find_gestures(&cur_report); }else { syn_ps2_translate_data (data, &cur_report); if (tp_find_fingers(&cur_report,state)) return; } tp_process_report (state, &cur_report); } /* ** syn_ps2_reset ** ** Reset the touchpad and set to relative mode (ps/2). */ void syn_ps2_reset (int fd) { gpm_report (GPM_PR_INFO,"Reseting Synaptic PS/2 Touchpad."); /* Stop incoming motion data (of whatever kind absolute/relative). */ tp_ps2_disable_data(fd); if(stick_enabled) syn_ps2_send_reset(fd,DEVICE_STICK); syn_ps2_send_reset(fd,DEVICE_TOUCHPAD); syn_ps2_enable_data(fd); } /* * syn_ps2_init_stick * * Initialize the attached device on the synaptics touchpad (usually a stick). */ static void syn_ps2_init_stick(int fd) { if (!stick_enabled) return; gpm_report(GPM_PR_DEBUG,"Initializing Synaptics PS/2 Stick Device"); /* Reset it, set defaults, streaming */ syn_ps2_send_reset(fd,DEVICE_STICK); syn_ps2_putbyte(fd,DEVICE_STICK,PS2_SET_DEFAULT); syn_ps2_putbyte(fd,DEVICE_STICK,PS2_STREAM_MODE); /* Unused */ /* syn_ps2_read_ident (fd, DEVICE_STICK, &ident[1]); */ /* syn_ps2_read_model_id (fd, DEVICE_STICK, &model[1]); */ /* syn_ps2_read_cap (fd, DEVICE_STICK, &capabilities[1]); */ /* syn_dump_info(DEVICE_STICK); */ } /* ** syn_ps2_init ** ** Initialize the synaptics touchpad. Read model and identification. ** Determine the size of the touchpad in "pixels". Select 6 byte packets, ** and select high packet rate. */ void syn_ps2_init (int fd) { gpm_report(GPM_PR_DEBUG,"Initializing Synaptics PS/2 TouchPad"); tp_ps2_disable_data(fd); /* Init touchpad */ syn_ps2_send_reset(fd,DEVICE_TOUCHPAD); syn_ps2_read_ident (fd, DEVICE_TOUCHPAD, &ident[0]); syn_ps2_read_model_id (fd, DEVICE_TOUCHPAD, &model[0]); syn_ps2_read_cap (fd, DEVICE_TOUCHPAD, &capabilities[0]); syn_process_config (ident[0], model[0]); syn_dump_info(DEVICE_TOUCHPAD); syn_ps2_absolute_mode(fd); /* Absolut mode must be set before Init Stick device*/ syn_ps2_init_stick(fd); /* Enable absolut mode and streaming */ syn_ps2_enable_data(fd); } gpm-1.20.4/src/tools.c010060000017500001750000000054231101736502100133070ustar00niconico00/* * tools.c - tools which are needed by client and server * * Copyright (c) 2001 Nico Schottelius * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********/ #include /* NULL */ #include #include #include /* these three are */ #include /* needed for */ #include /* stat() */ #include "headers/gpmInt.h" /* only used for some defines */ #include "headers/message.h" /***************************************************************************** * check, whether devfs is used or not. * See /usr/src/linux/Documentation/filesystems/devfs/ for details. * Returns: the name of the console (/dev/tty0 or /dev/vc/0) *****************************************************************************/ char *Gpm_get_console( void ) { char *back = NULL, *tmp = NULL; struct stat buf; /* first try the devfs device, because in the next time this will be * the preferred one. If that fails, take the old console */ /* Check for open new console */ if (stat(GPM_DEVFS_CONSOLE,&buf) == 0) tmp = GPM_DEVFS_CONSOLE; /* Failed, try OLD console */ else if(stat(GPM_OLD_CONSOLE,&buf) == 0) tmp = GPM_OLD_CONSOLE; if(tmp != NULL) if((back = malloc(strlen(tmp) + sizeof(char)) ) != NULL) strcpy(back,tmp); return(back); } /* what's the english name for potenz ? */ int Gpm_x_high_y(int base, int pot_y) { int val = 1; if(pot_y == 0) val = 1; else if(pot_y < 0) val = 0; /* ugly hack ;) */ else while(pot_y > 0) { val = val * base; pot_y--; } return val; } /* return characters needed to display int */ int Gpm_cnt_digits(int number) { /* 0-9 = 1 10^0 <-> (10^1)-1 * 10 - 99 = 2 10^1 <-> (10^2)-1 * 100 - 999 = 3 10^2 <-> (10^3)-1 * 1000 - 9999 = 4 ... */ int ret = 0, num = 0; /* non negative, please */ if(number < 0) number *= -1; else if(number == 0) ret = 1; else while(number > num) { ret++; num = (Gpm_x_high_y(10,ret) - 1); } return(ret); } gpm-1.20.4/src/twiddler.c010060000017500001750000000357231101736502100137730ustar00niconico00/* * twiddler.c - support for the twiddler keyboard * * Copyright 1998 rubini@linux.it (Alessandro Rubini) * Changed 04/23/2001 nico@schottelius.org (Nico Schottelius) * --> removed hard wired dev names. Instead used symbolic constants and * generated option.consolename * * 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. ********/ /* TODO: resolution change (mice.c) switch up/down (mice.c) manage X.... modifiers */ /* Done: two cfg files mouse buttons unblank special keys... meta keys auto-repeat: double press plus hold... README */ #include #include #include #include #include #include #include #include #include #include #include #include "headers/gpm.h" #include "headers/gpmInt.h" #include "headers/message.h" #include "headers/twiddler.h" #include "headers/daemon.h" /* * Each table is made up of 256 entries, as these are the possible chords * Then, there is one table for each modifier (two of them are not allowed). * Each entry is a pointer: a "low" pointer represents a single byte, true * pointers represent strings. This is not very clean, but it works well. */ char *twiddler_table[7][256]; /* This maps modifiers to tables */ struct twiddler_map_struct { unsigned long modifiers; char *keyword; char **table; } twiddler_map[] = { { TW_MOD_0, "", twiddler_table[0]}, { TW_MOD_S, "Shift", twiddler_table[1]}, { TW_MOD_N, "Numeric", twiddler_table[2]}, { TW_MOD_F, "Function", twiddler_table[3]}, { TW_MOD_C, "Control", twiddler_table[4]}, { TW_MOD_C, "Ctrl", twiddler_table[4]}, { TW_MOD_A, "Alt", twiddler_table[5]}, { TW_MOD_A, "Meta", twiddler_table[5]}, /* This is different!! */ { TW_MOD_C | TW_MOD_S, "Ctrl+Shift", twiddler_table[6]}, { TW_MOD_C | TW_MOD_S, "Shift+Ctrl", twiddler_table[6]}, { 0, NULL, NULL} }; /* Convert special keynames to strings */ struct twiddler_f_struct { char *instring; char *outstring; } twiddler_f[] = { {"F1", "\033[[A" }, {"F2", "\033[[B" }, {"F3", "\033[[C" }, {"F4", "\033[[D" }, {"F5", "\033[[E" }, {"F6", "\033[17~" }, {"F7", "\033[18~" }, {"F8", "\033[19~" }, {"F9", "\033[20~" }, {"F10", "\033[21~" }, {"F11", "\033[23~" }, {"F12", "\033[24~" }, {"F13", "\033[25~" }, {"F14", "\033[26~" }, {"F15", "\033[28~" }, {"F16", "\033[29~" }, {"F17", "\033[31~" }, {"F18", "\033[32~" }, {"F19", "\033[33~" }, {"F20", "\033[34~" }, {"Find", "\033[1~" }, {"Insert", "\033[2~" }, {"Remove", "\033[3~" }, {"Select", "\033[4~" }, {"Prior", "\033[5~" }, {"Next", "\033[6~" }, {"Macro", "\033[M" }, {"Pause", "\033[P" }, {"Up", "\033[A" }, {"Down", "\033[B" }, {"Left", "\033[D" }, {"Right", "\033[C" }, {NULL, NULL } }; /* Convert special keynames to functions */ struct twiddler_fun_struct { char *name; int (*fun)(char *string); }; /*===================================================================*/ /* This part deals with pushing keys */ /* Function support: if a chord maps to a function, we need two pointers: one to the function and one to its argument. Therefore we must keep an array that keeps both pointers, and the pointer in the table is just an handle to this pair of pointers. The table has a maximum len */ #define TWIDDLER_MAX_ACTIVE_FUNS 128 /* These are the special functions that perform special actions */ int twiddler_console(char *s) { int consolenr = atoi(s); /* atoi never fails :) */ int fd; if (consolenr == 0) return 0; /* nothing to do */ fd=open_console(O_RDONLY); if (fd < 0) return -1; if (ioctl(fd, VT_ACTIVATE, consolenr)<0) {close(fd); return -1;} /*if (ioctl(fd, VT_WAITACTIVE, consolenr)<0) {close(fd); return -1;} */ close(fd); return 0; } int twiddler_exec(char *s) { int pid; extern struct options option; switch(pid=fork()) { case -1: return -1; case 0: close(0); close(1); close(2); /* very rude! */ open(GPM_NULL_DEV,O_RDONLY); open(option.consolename,O_WRONLY); dup(1); execl("/bin/sh", "sh", "-c", s, NULL); exit(1); /* shouldn't happen */ default: /* father: */ return(0); } } /* The functions and their name */ struct twiddler_fun_struct twiddler_functions[] = { { "Console", twiddler_console }, { "Exec", twiddler_exec }, { NULL, NULL} }; /* The registered functions */ struct twiddler_active_fun { int (*fun)(char *s); char *arg; } twiddler_active_funs[TWIDDLER_MAX_ACTIVE_FUNS]; static int active_fun_nr = 0; int twiddler_do_fun(int i) { twiddler_active_funs[i].fun(twiddler_active_funs[i].arg); return 0; } /* * Ok, from now on it's normal handling */ /* This returns the table to use */ static inline char **twiddler_get_table(unsigned long message) { unsigned long mod = message & TW_ANY_MOD; struct twiddler_map_struct *ptr; for (ptr = twiddler_map; ptr->table; ptr++) if (ptr->modifiers == mod) return ptr->table; return NULL; } /* And this uses the item to push keys */ static inline int twiddler_use_item(char *item) { int fd = open_console(O_WRONLY); int i, retval = 0; unsigned char pushthis, unblank=4; /* 4 == TIOCLINUX unblank */ /* a special function */ /* a single byte */ if (((unsigned long)item & 0xff) == (unsigned long)item) { pushthis = (unsigned long)item & 0xff; retval = ioctl(fd,TIOCSTI,&pushthis); } else if(i = (struct twiddler_active_fun *)item - twiddler_active_funs, i>=0 && i < active_fun_nr) twiddler_do_fun(i); else /* a string */ for (; *item!='\0' && retval==0; item++) retval = ioctl(fd,TIOCSTI,item); ioctl(fd,TIOCLINUX,&unblank); if (retval) gpm_report(GPM_PR_ERR,GPM_MESS_IOCTL_TIOCSTI, option.progname, strerror(errno)); close(fd); return retval; } /* return value is one if auto-repeating, 0 if not */ int twiddler_key(unsigned long message) { char **table = twiddler_get_table(message); char *val; /* * These two are needed to avoid transmitting single keys when typing * chords. When the number of keys being held down decreases, data * is transmitted; but as soon as it increases the cycle is restarted. */ static int last_message; static int marked; /* * The time values are needed to implement repetition of keys */ static struct timeval tv1, tv2; static int nclick, last_pressed; #define GET_TIME(tv) (gettimeofday(&tv, (struct timezone *)NULL)) #define DIF_TIME(t1,t2) ((t2.tv_sec -t1.tv_sec) *1000+ \ (t2.tv_usec-t1.tv_usec)/1000) if (!table) return 0; message &= 0xff; val = table[message]; if ((message < last_message) && !marked) { /* ok, do it */ marked++; /* don't retransmit on release */ twiddler_use_item(table[last_message]); if (last_pressed != last_message) { nclick=1; GET_TIME(tv1); } /* first click (note: this is release) */ last_pressed = last_message; } if (message < last_message) { /* marked: just ignore */ last_message = message; return 0; } /* building up a chord or repeating */ if (message != last_pressed) { /* building up */ marked=0; last_message = message; return 0; } /* Hmmm... double click */ if (message > last_message) { marked = 0; /* but don't use it */ GET_TIME(tv2); nclick = 1+ (DIF_TIME(tv1,tv2) < 300); /* if fast, counts as double */ last_message = message; if (nclick==1) GET_TIME(tv1); /* maybe the next.. */ return 1; } /* so, we are repeating... */ if (nclick == 2) { GET_TIME(tv1); /* compute delay */ if (DIF_TIME(tv2,tv1) > 500) /* held enough */ twiddler_use_item(table[message]); return 1; } return 0; } /*===================================================================*/ /* This part deals with reading the cfg file(s) */ /* retrieve the right table according to the modifier string */ char **twiddler_mod_to_table(char *mod) { struct twiddler_map_struct *ptr; int len = strlen(mod); if (len == 0) return twiddler_map->table; for (ptr = twiddler_map; ptr->table; ptr = ptr++) { if (!strncasecmp(mod,ptr->keyword,len)) return ptr->table; } return NULL; } /* Convert the "M00L"-type string to an integer */ int twiddler_chord_to_int(char *chord) { char *convert = "0LMR"; /* 0123 */ char *tmp; int result = 0; int shift = 0; if (strlen(chord)!=4) return -1; while (*chord) { if (!(tmp = strchr(convert, *chord))) return -1; result |= (tmp-convert)<instring; sptr++) if (!strcmp(ptr,sptr->instring)) return sptr->outstring; /* finally, look for special functions */ for (fptr = twiddler_functions; fptr->name; fptr++) if (!strncasecmp(fptr->name,ptr,strlen(fptr->name))) { if (active_fun_nr == TWIDDLER_MAX_ACTIVE_FUNS) { gpm_report(GPM_PR_ERR,GPM_MESS_TOO_MANY_SPECIAL, option.progname, TWIDDLER_MAX_ACTIVE_FUNS); return s; } twiddler_active_funs[active_fun_nr].fun = fptr->fun; twiddler_active_funs[active_fun_nr].arg=strdup(ptr+strlen(fptr->name)); return (char *)(twiddler_active_funs + active_fun_nr++); } return s; /* error */ } int twiddler_key_init(void) { FILE *f; char *files[]={TW_SYSTEM_FILE, TW_CUSTOM_FILE, NULL}; int fileindex=0; char s[128], buf[64]; /* buf is for the string */ char mod[64], chord[64], *value; int index, lineno=0, errcount=0; char **table; static int initcount=0; if (initcount) return 0; /* do it only once */ initcount++; if (!(f = fopen(TW_SYSTEM_FILE,"r"))) { gpm_report(GPM_PR_ERR,GPM_MESS_DOUBLE_S,TW_SYSTEM_FILE,strerror(errno)); return -1; } /* ok, go on reading all the files in files[]*/ while (files[fileindex]) { while (fgets(s,128,f)) { lineno++; /* trim newline and blanks, if any */ if (s[strlen(s)-1]=='\n') s[strlen(s)-1] = '\0'; while (isspace(s[strlen(s)-1])) s[strlen(s)-1] = '\0'; if (s[0]=='\0' || s[0]=='#') continue; /* ignore comment or empty */ if (sscanf(s,"%s = %s",chord,buf)==2) /* M00L = anything */ mod[0]='\0'; /* no modifiers */ else if (sscanf(s, "%s %s = %s", mod, chord, buf)==3) /*Mod M00L =k */; else if (sscanf(s, "%s", buf)!= 0) { gpm_report(GPM_PR_ERR,GPM_MESS_SYNTAX_1,option.progname,TW_SYSTEM_FILE ,lineno); errcount++; continue; } /* Ok, here we are: now check the parts */ if (!(table = twiddler_mod_to_table(mod))) { gpm_report(GPM_PR_ERR,GPM_MESS_UNKNOWN_MOD_1,option.progname,TW_SYSTEM_FILE ,lineno, mod); errcount++; continue; } if ((index = twiddler_chord_to_int(chord)) <= 0) { gpm_report(GPM_PR_ERR,GPM_MESS_INCORRECT_COORDS,option.progname, TW_SYSTEM_FILE,lineno, chord); errcount++; continue; } if ((value = twiddler_rest_to_value(s))==s) { gpm_report(GPM_PR_ERR,GPM_MESS_INCORRECT_LINE,option.progname,TW_SYSTEM_FILE ,lineno,s); errcount++; continue; } if (table[index]) { gpm_report(GPM_PR_ERR,GPM_MESS_REDEF_COORDS,option.progname,TW_SYSTEM_FILE, lineno, mod, mod ? " " : "", chord); } /* all done */ if (value) table[index]=value; else table[index]=""; /* the empty string represents the nul byte */ } /* fgets */ fclose(f); while (files[++fileindex]) /* next file, optional */ if ( (f=fopen(files[fileindex],"r")) ) break; } return errcount; }